From 8c09946bef16b6eb2f038fd0c7dec59f7fe98e78 Mon Sep 17 00:00:00 2001 From: James McCulloch Date: Tue, 14 Mar 2023 12:02:41 -0400 Subject: [PATCH] Fix fake players not teleporting to unloaded chunks (#1665) * fake-players-teleporting-fix: * Fix fake players not being moved on the chunkmap when teleporting * Fixes #1190 (Player bots cannot be teleported to unloaded chunks) * fake-players-teleporting-fix: * add missing access widener * Revert "fake-players-teleporting-fix:" This reverts commit 617702fca14035913103140d2e04fa33065bf628. * fake-players-teleporting-fix: * access awaitingTeleport in a nicer way * fake-players-teleporting-fix: * access awaitingTeleport in a nicer way --- .../ServerGamePacketListenerImplAccessor.java | 11 ++++++++ .../patches/NetHandlerPlayServerFake.java | 25 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 1 + 3 files changed, 37 insertions(+) create mode 100644 src/main/java/carpet/mixins/ServerGamePacketListenerImplAccessor.java diff --git a/src/main/java/carpet/mixins/ServerGamePacketListenerImplAccessor.java b/src/main/java/carpet/mixins/ServerGamePacketListenerImplAccessor.java new file mode 100644 index 00000000..b199fe8e --- /dev/null +++ b/src/main/java/carpet/mixins/ServerGamePacketListenerImplAccessor.java @@ -0,0 +1,11 @@ +package carpet.mixins; + +import net.minecraft.server.network.ServerGamePacketListenerImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerGamePacketListenerImpl.class) +public interface ServerGamePacketListenerImplAccessor { + @Accessor("awaitingTeleport") + public int getAwaitingTeleport(); +} diff --git a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java index d62dc27e..16f583c9 100644 --- a/src/main/java/carpet/patches/NetHandlerPlayServerFake.java +++ b/src/main/java/carpet/patches/NetHandlerPlayServerFake.java @@ -1,11 +1,16 @@ package carpet.patches; +import carpet.mixins.ServerGamePacketListenerImplAccessor; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket; +import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.entity.RelativeMovement; +import java.util.Set; public class NetHandlerPlayServerFake extends ServerGamePacketListenerImpl { @@ -27,6 +32,26 @@ public class NetHandlerPlayServerFake extends ServerGamePacketListenerImpl ((EntityPlayerMPFake) player).kill(message); } } + private boolean hasSpawned = false; + + @Override + public void teleport(double d, double e, double f, float g, float h, Set set) + { + super.teleport(d, e, f, g, h, set); + + handleAcceptTeleportPacket( + new ServerboundAcceptTeleportationPacket( ((ServerGamePacketListenerImplAccessor)this).getAwaitingTeleport() ) + ); + + if (!hasSpawned) { + hasSpawned = true; + } else { + handleMovePlayer( + new ServerboundMovePlayerPacket.PosRot(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot(), false) + ); + } + } + } diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 79ef3e0c..fab1e6d2 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -8,6 +8,7 @@ "MobCategory_spawnMixin", "Commands_customCommandsMixin", "ServerGamePacketListenerImplMixin", + "ServerGamePacketListenerImplAccessor", "PerfCommand_permissionMixin", "FillCommandMixin",