aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch')
-rw-r--r--patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch b/patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch
new file mode 100644
index 0000000000..b6f285b9cc
--- /dev/null
+++ b/patches/server/0945-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch
@@ -0,0 +1,66 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+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 f948f4051607611e7105790c3b6bacc5d3ec39db..68c312dc39ef6fdb88e201ba096c9bd99aebddd7 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -4183,7 +4183,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/ai/goal/FollowOwnerGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java
+index 8fa9282acd87132516329083f774345df3310cf2..edd29c2f4d0151d512618115a8fb4b7423171491 100644
+--- a/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java
++++ b/src/main/java/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.java
+@@ -130,7 +130,7 @@ public class FollowOwnerGoal extends Goal {
+ } else {
+ // CraftBukkit start
+ EntityTeleportEvent event = CraftEventFactory.callEntityTeleportEvent(this.tamable, (double) x + 0.5D, (double) y, (double) z + 0.5D);
+- if (event.isCancelled()) {
++ if (event.isCancelled() || event.getTo() == null) { // Paper
+ 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 509c8fae366e6aeca324b4d8e39bd3182d6d9b9b..c1f73e10d8473251425300cedbed2b82da6a79ce 100644
+--- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java
++++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java
+@@ -409,7 +409,7 @@ public class Shulker extends AbstractGolem implements VariantHolder<Optional<Dye
+ if (enumdirection != null) {
+ // CraftBukkit start
+ EntityTeleportEvent teleportEvent = CraftEventFactory.callEntityTeleportEvent(this, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ());
+- if (teleportEvent.isCancelled()) {
++ if (teleportEvent.isCancelled() || teleportEvent.getTo() == null) { // Paper
+ return false;
+ } else {
+ blockposition1 = CraftLocation.toBlockPosition(teleportEvent.getTo());