mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-31 17:20:11 +02:00
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 9115281f SPIGOT-6832: Improve Player#getPing docs CraftBukkit Changes: fd3478bc7 #967: Store last lava contact location for events Spigot Changes: dbf49382 Rebuild patches 58cb9d26 #113: Use simulationDistance for entity activation range base
87 lines
4.2 KiB
Diff
87 lines
4.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <spottedleaf@users.noreply.github.com>
|
|
Date: Fri, 4 Jun 2021 17:06:52 -0400
|
|
Subject: [PATCH] Fix dangerous end portal logic
|
|
|
|
End portals could teleport entities during move calls. Stupid
|
|
logic given the caller will never expect that kind of thing,
|
|
and will result in all kinds of dupes.
|
|
|
|
Move the tick logic into the post tick, where portaling was
|
|
designed to happen in the first place.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index 9bb77e98466544aa8efe603618348990e8e40546..4049a35d44c8351e81d7867b3524fa960ecc2d71 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -388,6 +388,36 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i
|
|
return chunkMap.playerEntityTrackerTrackMaps[type.ordinal()].getObjectsInRange(MCUtil.getCoordinateKey(this));
|
|
}
|
|
// Paper end - optimise entity tracking
|
|
+ // Paper start - make end portalling safe
|
|
+ public BlockPos portalBlock;
|
|
+ public ServerLevel portalWorld;
|
|
+ public void tickEndPortal() {
|
|
+ BlockPos pos = this.portalBlock;
|
|
+ ServerLevel world = this.portalWorld;
|
|
+ this.portalBlock = null;
|
|
+ this.portalWorld = null;
|
|
+
|
|
+ if (pos == null || world == null || world != this.level) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ if (this.isPassenger() || this.isVehicle() || !this.canChangeDimensions() || this.isRemoved() || !this.valid || !this.isAlive()) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ ResourceKey<Level> resourcekey = world.getTypeKey() == LevelStem.END ? Level.OVERWORLD : Level.END; // CraftBukkit - SPIGOT-6152: send back to main overworld in custom ends
|
|
+ ServerLevel worldserver = world.getServer().getLevel(resourcekey);
|
|
+
|
|
+ org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(this.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
|
|
+ event.callEvent();
|
|
+
|
|
+ if (this instanceof ServerPlayer) {
|
|
+ ((ServerPlayer)this).changeDimension(worldserver, PlayerTeleportEvent.TeleportCause.END_PORTAL);
|
|
+ return;
|
|
+ }
|
|
+ this.teleportTo(worldserver, null);
|
|
+ }
|
|
+ // Paper end - make end portalling safe
|
|
|
|
public Entity(EntityType<?> type, Level world) {
|
|
this.id = Entity.ENTITY_COUNTER.incrementAndGet();
|
|
@@ -2531,6 +2561,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i
|
|
}
|
|
|
|
this.processPortalCooldown();
|
|
+ this.tickEndPortal(); // Paper - make end portalling safe
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
|
index b8305112c759ecb62ef9ad972e57ff85ceff20dc..19892cb3cb290add4f094dc87bb22106e4f07a24 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
|
@@ -53,16 +53,10 @@ public class EndPortalBlock extends BaseEntityBlock {
|
|
// return; // CraftBukkit - always fire event in case plugins wish to change it
|
|
}
|
|
|
|
- // CraftBukkit start - Entity in portal
|
|
- EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
|
|
- world.getCraftServer().getPluginManager().callEvent(event);
|
|
-
|
|
- if (entity instanceof ServerPlayer) {
|
|
- ((ServerPlayer) entity).changeDimension(worldserver, PlayerTeleportEvent.TeleportCause.END_PORTAL);
|
|
- return;
|
|
- }
|
|
- // CraftBukkit end
|
|
- entity.changeDimension(worldserver);
|
|
+ // Paper start - move all of this logic into portal tick
|
|
+ entity.portalWorld = ((ServerLevel)world);
|
|
+ entity.portalBlock = pos.immutable();
|
|
+ // Paper end - move all of this logic into portal tick
|
|
}
|
|
|
|
}
|