PaperMC/patches/server/0900-Fix-NPE-on-null-loc-for-EntityTeleportEvent.patch

67 lines
4.6 KiB
Diff
Raw Normal View History

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
2024-10-24 12:11:32 +02:00
index c6dcc37ac5fcf50bcb246f533b99983dfc5c19c2..c13b6f14c3061710c2b27034db240cc94ec0fcb5 100644
--- a/src/main/java/net/minecraft/server/commands/TeleportCommand.java
+++ b/src/main/java/net/minecraft/server/commands/TeleportCommand.java
2024-10-24 12:11:32 +02:00
@@ -181,9 +181,10 @@ public class TeleportCommand {
Location to = new Location(world.getWorld(), d3, d4, d5, f4, f5);
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
2024-10-24 12:11:32 +02:00
d3 = to.getX();
d4 = to.getY();
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
2024-12-03 22:06:05 +01:00
index d32e5b1aa7549751e192b79c238c1832d6e9e605..2715ba6325ecf82dee237bb53372e3aac3972112 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
2024-12-03 20:34:55 +01:00
@@ -4371,7 +4371,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 {
2024-06-14 10:56:28 +02:00
diff --git a/src/main/java/net/minecraft/world/entity/TamableAnimal.java b/src/main/java/net/minecraft/world/entity/TamableAnimal.java
2024-12-03 20:34:55 +01:00
index 5bcdeb3eb463d637b16abfb43d5489c0334b6673..68224d1cdabdaf04e4d26dd07e222a312e8fc898 100644
2024-06-14 10:56:28 +02:00
--- a/src/main/java/net/minecraft/world/entity/TamableAnimal.java
+++ b/src/main/java/net/minecraft/world/entity/TamableAnimal.java
2024-12-03 20:34:55 +01:00
@@ -321,7 +321,7 @@ public abstract class TamableAnimal extends Animal implements OwnableEntity {
} else {
// CraftBukkit start
2024-06-14 10:56:28 +02:00
EntityTeleportEvent event = CraftEventFactory.callEntityTeleportEvent(this, (double) x + 0.5D, (double) y, (double) z + 0.5D);
- if (event.isCancelled()) {
2024-06-14 10:56:28 +02:00
+ 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
2024-12-03 20:34:55 +01:00
index 74fa6d2b569b42ac2dbb7efb10df658b9ffeecc4..5e6b66a12af7618fd55b4e32577d718849008b19 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java
2024-10-24 12:11:32 +02:00
@@ -416,7 +416,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());