Skip to content

Commit ece376a

Browse files
authored
Improve NPC handling in WorldGuard's listeners (#1988)
* fix: added more npc checks in listeners * Do not listen to events from NPCs such as Citizens. Don't handle NPCs as players. * replaced hasMetaData calls by Entities utilities class
1 parent 1e81a91 commit ece376a

File tree

11 files changed

+61
-54
lines changed

11 files changed

+61
-54
lines changed

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/WorldGuardPlugin.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import com.sk89q.worldguard.bukkit.listener.WorldRulesListener;
6161
import com.sk89q.worldguard.bukkit.session.BukkitSessionManager;
6262
import com.sk89q.worldguard.bukkit.util.ClassSourceValidator;
63+
import com.sk89q.worldguard.bukkit.util.Entities;
6364
import com.sk89q.worldguard.bukkit.util.Events;
6465
import com.sk89q.worldguard.commands.GeneralCommands;
6566
import com.sk89q.worldguard.commands.ProtectionCommands;
@@ -419,8 +420,9 @@ public LocalPlayer wrapPlayer(Player player, boolean silenced) {
419420
}
420421

421422
public Actor wrapCommandSender(CommandSender sender) {
422-
if (sender instanceof Player) {
423-
return wrapPlayer((Player) sender);
423+
if (sender instanceof Player player) {
424+
if (Entities.isNPC(player)) return null;
425+
return wrapPlayer(player);
424426
}
425427

426428
try {

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/cause/Cause.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.sk89q.worldguard.bukkit.BukkitWorldConfiguration;
2525
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
2626
import com.sk89q.worldguard.bukkit.internal.WGMetadata;
27+
import com.sk89q.worldguard.bukkit.util.Entities;
2728
import io.papermc.lib.PaperLib;
2829
import org.bukkit.Bukkit;
2930
import org.bukkit.block.Block;
@@ -134,8 +135,8 @@ public Object getRootCause() {
134135
@Nullable
135136
public Player getFirstPlayer() {
136137
for (Object object : causes) {
137-
if (object instanceof Player) {
138-
return (Player) object;
138+
if (object instanceof Player p && !Entities.isNPC(p)) {
139+
return p;
139140
}
140141
}
141142

@@ -145,8 +146,8 @@ public Player getFirstPlayer() {
145146
@Nullable
146147
public Entity getFirstEntity() {
147148
for (Object object : causes) {
148-
if (object instanceof Entity) {
149-
return (Entity) object;
149+
if (object instanceof Entity e) {
150+
return e;
150151
}
151152
}
152153

@@ -156,8 +157,8 @@ public Entity getFirstEntity() {
156157
@Nullable
157158
public Entity getFirstNonPlayerEntity() {
158159
for (Object object : causes) {
159-
if (object instanceof Entity && !(object instanceof Player)) {
160-
return (Entity) object;
160+
if (object instanceof Entity e && (!(object instanceof Player) || Entities.isNPC(e))) {
161+
return e;
161162
}
162163
}
163164

@@ -167,8 +168,8 @@ public Entity getFirstNonPlayerEntity() {
167168
@Nullable
168169
public Block getFirstBlock() {
169170
for (Object object : causes) {
170-
if (object instanceof Block) {
171-
return (Block) object;
171+
if (object instanceof Block b) {
172+
return b;
172173
}
173174
}
174175

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.sk89q.worldguard.bukkit.BukkitWorldConfiguration;
3030
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
3131
import com.sk89q.worldguard.bukkit.cause.Cause;
32+
import com.sk89q.worldguard.bukkit.util.Entities;
3233
import com.sk89q.worldguard.config.WorldConfiguration;
3334
import com.sk89q.worldguard.domains.Association;
3435
import com.sk89q.worldguard.protection.association.DelayedRegionOverlapAssociation;
@@ -124,13 +125,12 @@ protected RegionAssociable createRegionAssociable(Cause cause) {
124125

125126
if (!cause.isKnown()) {
126127
return Associables.constant(Association.NON_MEMBER);
127-
} else if (rootCause instanceof Player) {
128-
return getPlugin().wrapPlayer((Player) rootCause);
129-
} else if (rootCause instanceof OfflinePlayer) {
130-
return getPlugin().wrapOfflinePlayer((OfflinePlayer) rootCause);
131-
} else if (rootCause instanceof Entity) {
128+
} else if (rootCause instanceof Player player && !Entities.isNPC(player)) {
129+
return getPlugin().wrapPlayer(player);
130+
} else if (rootCause instanceof OfflinePlayer offlinePlayer) {
131+
return getPlugin().wrapOfflinePlayer(offlinePlayer);
132+
} else if (rootCause instanceof Entity entity) {
132133
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
133-
final Entity entity = (Entity) rootCause;
134134
BukkitWorldConfiguration config = getWorldConfig(entity.getWorld());
135135
Location loc;
136136
if (PaperLib.isPaper() && config.usePaperEntityOrigin) {
@@ -144,9 +144,9 @@ protected RegionAssociable createRegionAssociable(Cause cause) {
144144
}
145145
return new DelayedRegionOverlapAssociation(query, BukkitAdapter.adapt(loc),
146146
config.useMaxPriorityAssociation);
147-
} else if (rootCause instanceof Block) {
147+
} else if (rootCause instanceof Block block) {
148148
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
149-
Location loc = ((Block) rootCause).getLocation();
149+
Location loc = block.getLocation();
150150
return new DelayedRegionOverlapAssociation(query, BukkitAdapter.adapt(loc),
151151
getWorldConfig(loc.getWorld()).useMaxPriorityAssociation);
152152
} else {

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.sk89q.worldguard.LocalPlayer;
2323
import com.sk89q.worldguard.WorldGuard;
2424
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
25+
import com.sk89q.worldguard.bukkit.util.Entities;
2526
import org.bukkit.entity.Entity;
2627
import org.bukkit.entity.LivingEntity;
2728
import org.bukkit.entity.Player;
@@ -57,9 +58,9 @@ private boolean isInvincible(LocalPlayer player) {
5758
@EventHandler(ignoreCancelled = true)
5859
public void onEntityDamage(EntityDamageEvent event) {
5960
Entity victim = event.getEntity();
61+
if (Entities.isNPC(victim)) return;
6062

61-
if (victim instanceof Player) {
62-
Player player = (Player) victim;
63+
if (victim instanceof Player player) {
6364
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
6465

6566
if (isInvincible(localPlayer)) {
@@ -87,9 +88,9 @@ public void onEntityDamage(EntityDamageEvent event) {
8788
@EventHandler(ignoreCancelled = true)
8889
public void onEntityCombust(EntityCombustEvent event) {
8990
Entity entity = event.getEntity();
91+
if (Entities.isNPC(entity)) return;
9092

91-
if (entity instanceof Player) {
92-
Player player = (Player) entity;
93+
if (entity instanceof Player player) {
9394
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
9495

9596
if (isInvincible(localPlayer)) {
@@ -100,8 +101,9 @@ public void onEntityCombust(EntityCombustEvent event) {
100101

101102
@EventHandler(ignoreCancelled = true)
102103
public void onFoodLevelChange(FoodLevelChangeEvent event) {
103-
if (event.getEntity() instanceof Player) {
104-
Player player = (Player) event.getEntity();
104+
if (Entities.isNPC(event.getEntity())) return;
105+
106+
if (event.getEntity() instanceof Player player) {
105107
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
106108

107109
if (event.getFoodLevel() < player.getFoodLevel() && isInvincible(localPlayer)) {

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
2626
import com.sk89q.worldguard.bukkit.event.block.BreakBlockEvent;
2727
import com.sk89q.worldguard.bukkit.event.block.PlaceBlockEvent;
28+
import com.sk89q.worldguard.bukkit.util.Entities;
2829
import com.sk89q.worldguard.bukkit.util.Materials;
2930
import com.sk89q.worldguard.config.WorldConfiguration;
3031
import com.sk89q.worldguard.protection.association.RegionAssociable;
@@ -118,24 +119,24 @@ public void onEntityDamage(EntityDamageEvent event) {
118119
World world = entity.getWorld();
119120
if (!isRegionSupportEnabled(world)) return; // Region support disabled
120121

122+
if (Entities.isNPC(entity)) return;
123+
if (!(entity instanceof Player player)) return;
124+
121125
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
122126

123-
if (entity instanceof Player && event.getCause() == DamageCause.FALL) {
124-
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer((Player) entity);
127+
if (event.getCause() == DamageCause.FALL) {
128+
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
125129
if (!query.testState(BukkitAdapter.adapt(entity.getLocation()), localPlayer, Flags.FALL_DAMAGE)) {
126130
event.setCancelled(true);
127131
return;
128132
}
129-
} else {
130-
if (entity instanceof Player && event.getCause() == DamageCause.FLY_INTO_WALL) {
131-
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer((Player) entity);
132-
if (!query.testState(BukkitAdapter.adapt(entity.getLocation()), localPlayer, Flags.FALL_DAMAGE)) {
133-
event.setCancelled(true);
134-
return;
135-
}
133+
} else if (event.getCause() == DamageCause.FLY_INTO_WALL) {
134+
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
135+
if (!query.testState(BukkitAdapter.adapt(entity.getLocation()), localPlayer, Flags.FALL_DAMAGE)) {
136+
event.setCancelled(true);
137+
return;
136138
}
137139
}
138-
139140
}
140141

141142
/**

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,8 +522,7 @@ public void onVehicleExit(VehicleExitEvent event) {
522522
if (!isRegionSupportEnabled(vehicle.getWorld())) return; // Region support disabled
523523
Entity exited = event.getExited();
524524

525-
if (vehicle instanceof Tameable && exited instanceof Player) {
526-
Player player = (Player) exited;
525+
if (vehicle instanceof Tameable && exited instanceof Player player && !Entities.isNPC(player)) {
527526
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
528527
if (!isWhitelisted(Cause.create(player), vehicle.getWorld(), false)) {
529528
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();

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

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ private void onEntityDamageByBlock(EntityDamageByBlockEvent event) {
138138
event.setCancelled(true);
139139
return;
140140
}
141-
} else if (defender instanceof Player) {
142-
Player player = (Player) defender;
141+
} else if (defender instanceof Player player && !Entities.isNPC(defender)) {
143142
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
144143

145144
if (wcfg.disableLavaDamage && type == DamageCause.LAVA) {
@@ -227,8 +226,7 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
227226
}
228227
}
229228

230-
if (defender instanceof Player) {
231-
Player player = (Player) defender;
229+
if (defender instanceof Player player && !Entities.isNPC(defender)) {
232230
LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
233231

234232
if (wcfg.disableLightningDamage && event.getCause() == DamageCause.LIGHTNING) {
@@ -289,8 +287,7 @@ private void onEntityDamageByProjectile(EntityDamageByEntityEvent event) {
289287
}
290288

291289
WorldConfiguration wcfg = getWorldConfig(defender.getWorld());
292-
if (defender instanceof Player) {
293-
Player player = (Player) defender;
290+
if (defender instanceof Player player && !Entities.isNPC(defender)) {
294291
LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
295292

296293

@@ -363,8 +360,7 @@ public void onEntityDamage(EntityDamageEvent event) {
363360
event.setCancelled(true);
364361
return;
365362
}
366-
} else if (defender instanceof Player) {
367-
Player player = (Player) defender;
363+
} else if (defender instanceof Player player && !Entities.isNPC(defender)) {
368364
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
369365

370366
if (type == DamageCause.WITHER) {
@@ -665,8 +661,8 @@ public void onCreatePortal(PortalCreateEvent event) {
665661
.get(world);
666662
if (regionManager == null) return;
667663
LocalPlayer associable = null;
668-
if (event.getEntity() instanceof Player) {
669-
associable = getPlugin().wrapPlayer(((Player) event.getEntity()));
664+
if (event.getEntity() instanceof Player player) {
665+
associable = getPlugin().wrapPlayer(player);
670666
if (WorldGuard.getInstance().getPlatform().getSessionManager().hasBypass(associable, world)) {
671667
return;
672668
}
@@ -745,10 +741,10 @@ public void onEntityRegainHealth(EntityRegainHealthEvent event) {
745741
event.setCancelled(true);
746742
return;
747743
}
748-
if (wcfg.useRegions && ent instanceof Player
744+
if (wcfg.useRegions && ent instanceof Player player && !Entities.isNPC(ent)
749745
&& !WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().testState(
750746
BukkitAdapter.adapt(ent.getLocation()),
751-
WorldGuardPlugin.inst().wrapPlayer((Player) ent),
747+
WorldGuardPlugin.inst().wrapPlayer(player),
752748
Flags.HEALTH_REGEN)) {
753749
event.setCancelled(true);
754750
}
@@ -758,10 +754,11 @@ public void onEntityRegainHealth(EntityRegainHealthEvent event) {
758754
public void onFoodChange(FoodLevelChangeEvent event) {
759755
if (event.getItem() != null) return;
760756
HumanEntity ent = event.getEntity();
761-
if (!(ent instanceof Player)) return;
757+
if (Entities.isNPC(ent)) return;
758+
if (!(ent instanceof Player bukkitPlayer)) return;
762759
if (event.getFoodLevel() > ent.getFoodLevel()) return;
763760

764-
LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer((Player) ent);
761+
LocalPlayer player = WorldGuardPlugin.inst().wrapPlayer(bukkitPlayer);
765762
WorldConfiguration wcfg = getWorldConfig(ent.getWorld());
766763

767764
if (wcfg.useRegions

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ private void handlePhysicalInteract(PlayerInteractEvent event) {
314314
@EventHandler(priority = EventPriority.HIGHEST)
315315
public void onPlayerRespawn(PlayerRespawnEvent event) {
316316
Player player = event.getPlayer();
317+
if (com.sk89q.worldguard.bukkit.util.Entities.isNPC(player)) return;
317318
WorldConfiguration wcfg = getWorldConfig(player.getWorld());
318319

319320
if (wcfg.useRegions) {
@@ -348,6 +349,7 @@ public void onItemHeldChange(PlayerItemHeldEvent event) {
348349
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
349350
public void onPlayerTeleport(PlayerTeleportEvent event) {
350351
Player player = event.getPlayer();
352+
if (com.sk89q.worldguard.bukkit.util.Entities.isNPC(player)) return;
351353
LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
352354
ConfigurationManager cfg = getConfig();
353355
WorldConfiguration wcfg = getWorldConfig(player.getWorld());

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.sk89q.worldguard.LocalPlayer;
2525
import com.sk89q.worldguard.WorldGuard;
2626
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
27+
import com.sk89q.worldguard.bukkit.util.Entities;
2728
import com.sk89q.worldguard.config.WorldConfiguration;
2829
import com.sk89q.worldguard.session.MoveType;
2930
import com.sk89q.worldguard.util.Locations;
@@ -59,6 +60,7 @@ public void onVehicleMove(VehicleMoveEvent event) {
5960
// Did we move a block?
6061
if (Locations.isDifferentBlock(BukkitAdapter.adapt(event.getFrom()), BukkitAdapter.adapt(event.getTo()))) {
6162
for (Player player : playerPassengers) {
63+
if (Entities.isNPC(player)) continue;
6264
LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
6365
Location lastValid;
6466
if ((lastValid = WorldGuard.getInstance().getPlatform().getSessionManager().get(localPlayer)

worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/session/BukkitSessionManager.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.sk89q.worldguard.bukkit.BukkitPlayer;
2626
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
2727
import com.sk89q.worldguard.bukkit.event.player.ProcessPlayerEvent;
28+
import com.sk89q.worldguard.bukkit.util.Entities;
2829
import com.sk89q.worldguard.session.AbstractSessionManager;
2930
import com.sk89q.worldguard.session.Session;
3031
import com.sk89q.worldguard.session.handler.Handler;
@@ -81,9 +82,9 @@ public void run() {
8182

8283
@Override
8384
public boolean hasBypass(LocalPlayer player, World world) {
84-
if (player instanceof BukkitPlayer) {
85-
if (((BukkitPlayer) player).getPlayer().hasMetadata("NPC")
86-
&& WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride) {
85+
if (player instanceof BukkitPlayer bukkitPlayer) {
86+
if (Entities.isNPC(bukkitPlayer.getPlayer())
87+
&& WorldGuard.getInstance().getPlatform().getGlobalStateManager().get(world).fakePlayerBuildOverride) {
8788
return true;
8889
}
8990
if (!((BukkitPlayer) player).getPlayer().isOnline()) {

0 commit comments

Comments
 (0)