90 lines
5.2 KiB
Diff
90 lines
5.2 KiB
Diff
From 11b5d09894304d6fc730dadb581b06196c71d704 Mon Sep 17 00:00:00 2001
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
Date: Tue, 14 Jan 2020 09:12:55 +0000
|
|
Subject: [PATCH] Fix entity teleportation exceptions
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 58e79df57..810a5edb6 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -2574,6 +2574,20 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
return teleportTo(dimensionmanager, null);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private EntityPortalEvent callEntityPortalEvent(WorldServer worldserver1, BlockPosition blockposition, int searchRadius) {
|
|
+ Location enter = this.getBukkitEntity().getLocation();
|
|
+ Location exit = new Location(worldserver1.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
|
+
|
|
+ EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, searchRadius);
|
|
+ event.getEntity().getServer().getPluginManager().callEvent(event);
|
|
+ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) {
|
|
+ return null;
|
|
+ }
|
|
+
|
|
+ return event;
|
|
+ }
|
|
+ // paper end
|
|
@Nullable
|
|
public Entity teleportTo(DimensionManager dimensionmanager, BlockPosition location) {
|
|
// CraftBukkit end
|
|
@@ -2599,7 +2613,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
// CraftBukkit start - EntityPortalEvent
|
|
// SPIGOT-5136 - don't fire event for CraftEntity.teleport
|
|
int searchRadius = world.paperConfig.portalSearchRadius; // Paper - use portal search radius as default
|
|
- if (location == null) {
|
|
+ if (location == null) { /* // Paper - move up
|
|
Location enter = this.getBukkitEntity().getLocation();
|
|
Location exit = new Location(worldserver1.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
|
|
|
@@ -2613,14 +2627,27 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
|
|
blockposition = new BlockPosition(exit.getX(), exit.getY(), exit.getZ());
|
|
searchRadius = event.getSearchRadius();
|
|
- }
|
|
+ */} // Paper - move up
|
|
// CraftBukkit end
|
|
|
|
if (blockposition == null) { // CraftBukkit
|
|
+ ;
|
|
if (dimensionmanager1.getType() == DimensionManager.THE_END && dimensionmanager == DimensionManager.OVERWORLD) { // CraftBukkit
|
|
- blockposition = worldserver1.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver1.getSpawn());
|
|
+ EntityPortalEvent portalEvent = callEntityPortalEvent(worldserver1, worldserver1.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver1.getSpawn()), 1); // Paper - EntityPortalEvent - hardcode 1, no search here
|
|
+ // Paper start
|
|
+ if (portalEvent == null) return null;
|
|
+ Location exit = portalEvent.getTo();
|
|
+ worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
|
|
+ blockposition = new BlockPosition(exit.getX(), exit.getY(), exit.getZ());
|
|
+ //Paper end
|
|
} else if (dimensionmanager.getType() == DimensionManager.THE_END) { // CraftBukkit
|
|
- blockposition = worldserver1.getDimensionSpawn();
|
|
+ EntityPortalEvent portalEvent = callEntityPortalEvent(worldserver1, worldserver1.getDimensionSpawn(), 1); // Paper - EntityPortalEvent - hardcode 1, no search here
|
|
+ // Paper start
|
|
+ if (portalEvent == null) return null;
|
|
+ Location exit = portalEvent.getTo();
|
|
+ worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
|
|
+ blockposition = new BlockPosition(exit.getX(), exit.getY(), exit.getZ());
|
|
+ //Paper end
|
|
} else {
|
|
double d0 = this.locX();
|
|
double d1 = this.locZ();
|
|
@@ -2644,6 +2671,14 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
Vec3D vec3d1 = this.getPortalOffset();
|
|
|
|
blockposition = new BlockPosition(d0, this.locY(), d1);
|
|
+ // Paper start - EntityPortalEvent
|
|
+ EntityPortalEvent portalEvent = callEntityPortalEvent(worldserver1, blockposition, searchRadius);
|
|
+ if (portalEvent == null) return null;
|
|
+ Location exit = portalEvent.getTo();
|
|
+ worldserver1 = ((CraftWorld) exit.getWorld()).getHandle();
|
|
+ blockposition = new BlockPosition(exit.getX(), exit.getY(), exit.getZ());
|
|
+ searchRadius = portalEvent.getSearchRadius();
|
|
+ // Paper end
|
|
ShapeDetector.Shape shapedetector_shape = worldserver1.getTravelAgent().findPortal(blockposition, vec3d, this.getPortalDirection(), vec3d1.x, vec3d1.y, this instanceof EntityHuman, searchRadius); // CraftBukkit - search radius
|
|
|
|
if (shapedetector_shape == null) {
|
|
--
|
|
2.24.1
|
|
|