From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Sat, 9 Dec 2023 19:15:59 -0800 Subject: [PATCH] Fix NPE on null loc for EntityTeleportEvent EntityTeleportEvent#setTo is marked as nullable and so is the getTo method. This fixes the handling of a null "to" location by treating it the same as the event being cancelled. This is already existing behavior for the EntityPortalEvent (which extends EntityTeleportEvent). diff --git a/src/main/java/net/minecraft/server/commands/TeleportCommand.java b/src/main/java/net/minecraft/server/commands/TeleportCommand.java index a306b30af19277386a2f3e560b4902a8b5796f2a..54851f6cc0d5fddb32a9a1e84a4f5ae41af18758 100644 --- a/src/main/java/net/minecraft/server/commands/TeleportCommand.java +++ b/src/main/java/net/minecraft/server/commands/TeleportCommand.java @@ -169,9 +169,10 @@ public class TeleportCommand { Location to = new Location(world.getWorld(), x, y, z, f2, f3); EntityTeleportEvent event = new EntityTeleportEvent(target.getBukkitEntity(), target.getBukkitEntity().getLocation(), to); world.getCraftServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { + if (event.isCancelled() || event.getTo() == null) { // Paper return; } + to = event.getTo(); // Paper - actually track new location x = to.getX(); y = to.getY(); diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java index 306b55276189099bbbc8f2c86ad7428381fcf58c..278e22985ecda6653ce01a29209eb51506c48438 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -4229,7 +4229,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (!(this instanceof ServerPlayer)) { EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.level().getWorld(), d3, d4, d5), new Location(this.level().getWorld(), d0, d6, d2)); this.level().getCraftServer().getPluginManager().callEvent(teleport); - if (!teleport.isCancelled()) { + if (!teleport.isCancelled() && teleport.getTo() != null) { // Paper Location to = teleport.getTo(); this.teleportTo(to.getX(), to.getY(), to.getZ()); } else { diff --git a/src/main/java/net/minecraft/world/entity/TamableAnimal.java b/src/main/java/net/minecraft/world/entity/TamableAnimal.java index 8a4f15964449a40ae4fffc5d16b7789d61c4c594..06f74d3aeb35844cbb540a5fcd0da2644556da55 100644 --- a/src/main/java/net/minecraft/world/entity/TamableAnimal.java +++ b/src/main/java/net/minecraft/world/entity/TamableAnimal.java @@ -303,7 +303,7 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity { } else { // CraftBukkit start EntityTeleportEvent event = CraftEventFactory.callEntityTeleportEvent(this, (double) x + 0.5D, (double) y, (double) z + 0.5D); - if (event.isCancelled()) { + if (event.isCancelled() || event.getTo() == null) { // Paper - prevent NP on null event to location return false; } Location to = event.getTo(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java index 632b74e84d6ee58da8806e30b75e16fb864afa64..bf58956379d0a5dbfdc34e8626847638b4111433 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -415,7 +415,7 @@ public class Shulker extends AbstractGolem implements VariantHolder