Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-15 04:20:04 +01:00
67 Zeilen
4.5 KiB
Diff
67 Zeilen
4.5 KiB
Diff
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 73a6ceef98f94ec801c14ca6d3c33f801b2ae442..0e8888ca5f8cde764efa9e2cda8c59e9ecb3190c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -4200,7 +4200,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 39adc89b35213d5d5fb71bb4b7e0c641f77e4a06..45224dc3867892b298b006c17f7f85741fcc96d6 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/TamableAnimal.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/TamableAnimal.java
|
|
@@ -299,7 +299,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<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());
|