Volver al índice

src/main/java/ar/com/companeros/body/LocalPacketListener.java

package ar.com.companeros.body;

import net.minecraft.network.PacketSendListener;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket;
import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;

/** Conserva interacciones vanilla; la sesión realiza el tick de jugador exactamente una vez. */
final class LocalPacketListener extends ServerGamePacketListenerImpl {
    private final MinecraftServer server;

    LocalPacketListener(MinecraftServer server, LocalConnection transport, ServerPlayer player) {
        super(server, transport, player);
        this.server = server;
    }

    @Override public void tick() { }

    @Override public void send(Packet<?> packet, PacketSendListener completion) {
        super.send(packet, completion);
        if (packet instanceof ClientboundPlayerPositionPacket position) {
            // El participante local acepta la posición servidor, incluida la transición de dimensión.
            handleAcceptTeleportPacket(new ServerboundAcceptTeleportationPacket(position.getId()));
            resetPosition();
        }
    }

    @Override public void disconnect(Component reason) {
        PlayerSessions.remove(server, player.getUUID());
    }
}