Fix portal exit resulting in bad teleport transition
This commit is contained in:
@ -13,18 +13,20 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTarget), teleportTarget.relatives());
|
PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTarget), teleportTarget.relatives());
|
||||||
- Location to = CraftLocation.toBukkit(absolutePosition.position(), teleportTarget.newLevel().getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
|
- Location to = CraftLocation.toBukkit(absolutePosition.position(), teleportTarget.newLevel().getWorld(), absolutePosition.yRot(), absolutePosition.xRot());
|
||||||
|
+ Vec3 velocity = absolutePosition.deltaMovement(); // Paper
|
||||||
+ Location to = CraftLocation.toBukkit(absolutePosition.position(), teleportTarget.newLevel().getWorld(), absolutePosition.yRot(), this.getXRot()); // Paper - use getXRot (doesn't respect DimensionTransition pitch) // Why?
|
+ Location to = CraftLocation.toBukkit(absolutePosition.position(), teleportTarget.newLevel().getWorld(), absolutePosition.yRot(), this.getXRot()); // Paper - use getXRot (doesn't respect DimensionTransition pitch) // Why?
|
||||||
// Paper start - gateway-specific teleport event
|
// Paper start - gateway-specific teleport event
|
||||||
final EntityTeleportEvent teleEvent;
|
final EntityTeleportEvent teleEvent;
|
||||||
if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.level.getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
|
if (this.portalProcess != null && this.portalProcess.isSamePortal(((net.minecraft.world.level.block.EndGatewayBlock) net.minecraft.world.level.block.Blocks.END_GATEWAY)) && this.level.getBlockEntity(this.portalProcess.getEntryPosition()) instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity theEndGatewayBlockEntity) {
|
||||||
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
@@ -0,0 +0,0 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||||
|
if (!to.equals(teleEvent.getTo())) {
|
||||||
to = teleEvent.getTo();
|
to = teleEvent.getTo();
|
||||||
teleportTarget = new TeleportTransition(((CraftWorld) to.getWorld()).getHandle(), CraftLocation.toVec3D(to), Vec3.ZERO, to.getYaw(), to.getPitch(), teleportTarget.missingRespawnBlock(), teleportTarget.asPassenger(), Set.of(), teleportTarget.postTeleportTransition(), teleportTarget.cause());
|
teleportTarget = new TeleportTransition(((CraftWorld) to.getWorld()).getHandle(), CraftLocation.toVec3D(to), Vec3.ZERO, to.getYaw(), to.getPitch(), teleportTarget.missingRespawnBlock(), teleportTarget.asPassenger(), Set.of(), teleportTarget.postTeleportTransition(), teleportTarget.cause());
|
||||||
|
+ // Paper start - Call EntityPortalExitEvent
|
||||||
|
+ velocity = Vec3.ZERO;
|
||||||
}
|
}
|
||||||
+ // Paper start - Call EntityPortalExitEvent
|
|
||||||
+ if (this.portalProcess != null) { // if in a portal
|
+ if (this.portalProcess != null) { // if in a portal
|
||||||
+ CraftEntity bukkitEntity = this.getBukkitEntity();
|
+ CraftEntity bukkitEntity = this.getBukkitEntity();
|
||||||
+ Vec3 velocity = teleportTarget.deltaMovement();
|
|
||||||
+ org.bukkit.event.entity.EntityPortalExitEvent event = new org.bukkit.event.entity.EntityPortalExitEvent(
|
+ org.bukkit.event.entity.EntityPortalExitEvent event = new org.bukkit.event.entity.EntityPortalExitEvent(
|
||||||
+ bukkitEntity,
|
+ bukkitEntity,
|
||||||
+ bukkitEntity.getLocation(), to.clone(),
|
+ bukkitEntity.getLocation(), to.clone(),
|
||||||
@ -32,11 +34,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ );
|
+ );
|
||||||
+ event.callEvent();
|
+ event.callEvent();
|
||||||
+
|
+
|
||||||
+ if (!event.isCancelled() && event.getTo() != null) {
|
+ // Only change the target if actually needed, since we reset relative flags
|
||||||
|
+ if (!event.isCancelled() && event.getTo() != null && (!event.getTo().equals(event.getFrom()) || !event.getAfter().equals(event.getBefore()))) {
|
||||||
+ to = event.getTo().clone();
|
+ to = event.getTo().clone();
|
||||||
+ velocity = org.bukkit.craftbukkit.util.CraftVector.toNMS(event.getAfter());
|
+ velocity = org.bukkit.craftbukkit.util.CraftVector.toNMS(event.getAfter());
|
||||||
|
+ teleportTarget = new TeleportTransition(((CraftWorld) to.getWorld()).getHandle(), CraftLocation.toVec3D(to), velocity, to.getYaw(), to.getPitch(), teleportTarget.missingRespawnBlock(), teleportTarget.asPassenger(), Set.of(), teleportTarget.postTeleportTransition(), teleportTarget.cause());
|
||||||
+ }
|
+ }
|
||||||
+ teleportTarget = new TeleportTransition(((CraftWorld) to.getWorld()).getHandle(), CraftLocation.toVec3D(to), velocity, to.getYaw(), to.getPitch(), teleportTarget.missingRespawnBlock(), teleportTarget.asPassenger(), Set.of(), teleportTarget.postTeleportTransition(), teleportTarget.cause());
|
|
||||||
+ }
|
+ }
|
||||||
+ if (this.isRemoved()) {
|
+ if (this.isRemoved()) {
|
||||||
+ return null;
|
+ return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user