Fix endermite spawn position

The player teleport has been moved up in ThrownEnderpearl to prevent
endermite spawning in case of a cancelled teleport. This however placed
the player at the teleport destination prior to the endermite spawn
logic, creating the entity at the wrong location.

The commit stores the location of the player pre teleportation and uses
said location for spawning the endermite instead.

Co-authored-by: Helvetica Volubi <suisuroru@blue-millennium.fun>
Reviewed-in: https://github.com/PaperMC/Paper/pull/12912
This commit is contained in:
Lumine1909
2025-08-05 00:48:55 +08:00
committed by Bjarne Koll
parent 6d0833ece5
commit 9694886daa
@@ -1,10 +1,13 @@
--- a/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
+++ b/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
@@ -119,11 +_,18 @@
@@ -119,11 +_,21 @@
Vec3 vec3 = this.oldPosition();
if (owner instanceof ServerPlayer serverPlayer) {
if (serverPlayer.connection.isAcceptingMessages()) {
+ // CraftBukkit start
+ // Store pre teleportation position as the teleport has been moved up.
+ final double preTeleportX = serverPlayer.getX(), preTeleportY = serverPlayer.getY(), preTeleportZ = serverPlayer.getZ();
+ final float preTeleportYRot = serverPlayer.getYRot(), preTeleportXRot = serverPlayer.getXRot();
+ ServerPlayer serverPlayer1 = serverPlayer.teleport(new TeleportTransition(serverLevel, vec3, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.ROTATION, Relative.DELTA), TeleportTransition.DO_NOTHING, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.ENDER_PEARL));
+ if (serverPlayer1 == null) {
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT);
@@ -14,8 +17,9 @@
if (this.random.nextFloat() < 0.05F && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) {
Endermite endermite = EntityType.ENDERMITE.create(serverLevel, EntitySpawnReason.TRIGGERED);
if (endermite != null) {
endermite.snapTo(owner.getX(), owner.getY(), owner.getZ(), owner.getYRot(), owner.getXRot());
- endermite.snapTo(owner.getX(), owner.getY(), owner.getZ(), owner.getYRot(), owner.getXRot());
- serverLevel.addFreshEntity(endermite);
+ endermite.snapTo(preTeleportX, preTeleportY, preTeleportZ, preTeleportYRot, preTeleportXRot); // Paper - spawn endermite at pre teleport position as teleport has been moved up
+ serverLevel.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL);
}
}