aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0941-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch
blob: 9bde7823011a5bef4d6cfdf0ebda8e441bcfc9e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
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 f024038d473e424aa08256040c1591d23871c20c..27e74611229e9558f1e015c68cb0cc91290c42b8 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -4189,7 +4189,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());