Skip to content

Commit 9eadfdb

Browse files
committed
More comprehensive fishing rod checks.
Checks the retrieve (caught entity) for all non-hostiles (i.e. including vehicles now, checked with vehicle-destroy). Also checks the projectile hit event, to prevent hooks from attaching pre-emptively. Closes #2157, #2155.
1 parent 38ce4d4 commit 9eadfdb

2 files changed

Lines changed: 17 additions & 5 deletions

File tree

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import org.bukkit.entity.EntityType;
7575
import org.bukkit.entity.FallingBlock;
7676
import org.bukkit.entity.Firework;
77+
import org.bukkit.entity.FishHook;
7778
import org.bukkit.entity.Item;
7879
import org.bukkit.entity.ItemFrame;
7980
import org.bukkit.entity.LivingEntity;
@@ -126,6 +127,7 @@
126127
import org.bukkit.event.entity.ExpBottleEvent;
127128
import org.bukkit.event.entity.LingeringPotionSplashEvent;
128129
import org.bukkit.event.entity.PotionSplashEvent;
130+
import org.bukkit.event.entity.ProjectileHitEvent;
129131
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
130132
import org.bukkit.event.hanging.HangingBreakEvent;
131133
import org.bukkit.event.hanging.HangingPlaceEvent;
@@ -158,6 +160,7 @@
158160
import javax.annotation.Nullable;
159161
import java.util.ArrayList;
160162
import java.util.List;
163+
import java.util.Objects;
161164
import java.util.stream.Collectors;
162165

163166
public class EventAbstractionListener extends AbstractListener {
@@ -802,7 +805,8 @@ public void onBlockExp(BlockExpEvent event) {
802805
public void onPlayerFish(PlayerFishEvent event) {
803806
if (event.getState() == PlayerFishEvent.State.FISHING) {
804807
if (Events.fireAndTestCancel(new UseItemEvent(event, create(event.getPlayer(), event.getHook()),
805-
event.getPlayer().getWorld(), event.getPlayer().getInventory().getItemInMainHand()))) {
808+
event.getPlayer().getWorld(),
809+
event.getPlayer().getInventory().getItem(Objects.requireNonNull(event.getHand()))))) {
806810
event.setCancelled(true);
807811
}
808812
} else if (event.getState() == PlayerFishEvent.State.CAUGHT_FISH) {
@@ -816,12 +820,19 @@ public void onPlayerFish(PlayerFishEvent event) {
816820
Events.fireToCancel(event, new DestroyEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
817821
} else if (Entities.isConsideredBuildingIfUsed(caught)) {
818822
Events.fireToCancel(event, new UseEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
819-
} else if (Entities.isNonHostile(caught) || caught instanceof Player) {
823+
} else if (!Entities.isHostile(caught) || caught instanceof Player) {
820824
Events.fireToCancel(event, new DamageEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
821825
}
822826
}
823827
}
824828

829+
@EventHandler(ignoreCancelled = true)
830+
public void onProjectileHit(ProjectileHitEvent event) {
831+
if (event.getEntity() instanceof FishHook hook && event.getHitEntity() instanceof Entity target) {
832+
Events.fireToCancel(event, new DamageEntityEvent(event, create(hook), target));
833+
}
834+
}
835+
825836
@EventHandler(ignoreCancelled = true)
826837
public void onExpBottle(ExpBottleEvent event) {
827838
if (Events.fireAndTestCancel(new SpawnEntityEvent(event, create(event.getEntity()), event.getEntity().getLocation(), EntityType.EXPERIENCE_ORB))) {

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/RegionProtectionListener.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -468,11 +468,12 @@ public void onDamageEntity(DamageEntityEvent event) {
468468
}
469469

470470
/* Hostile / ambient mob override */
471-
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())
472-
|| Entities.isVehicle(event.getEntity().getType())) {
471+
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())) {
473472
canDamage = event.getRelevantFlags().isEmpty() || query.queryState(target, associable, combine(event)) != State.DENY;
474473
what = "hit that";
475-
474+
} else if (Entities.isVehicle(event.getEntity().getType())) {
475+
canDamage = query.testBuild(target, associable, combine(event, Flags.DESTROY_VEHICLE));
476+
what = "change that";
476477
/* Paintings, item frames, etc. */
477478
} else if (Entities.isConsideredBuildingIfUsed(event.getEntity())) {
478479
canDamage = query.testBuild(target, associable, combine(event));

0 commit comments

Comments
 (0)