Fixed players being able to move during teleport

This commit is contained in:
themode 2021-03-08 16:49:16 +01:00
parent 2e17c8a8e1
commit 8ab29368a6
4 changed files with 22 additions and 21 deletions

View File

@ -91,7 +91,9 @@ public class Player extends LivingEntity implements CommandSender {
private DimensionType dimensionType;
private GameMode gameMode;
protected final Set<Chunk> viewableChunks = new CopyOnWriteArraySet<>();
private final AtomicInteger teleportId = new AtomicInteger();
private int receivedTeleportId;
private final Queue<ClientPlayPacket> packets = Queues.newConcurrentLinkedQueue();
private final boolean levelFlat;
@ -1927,6 +1929,18 @@ public class Player extends LivingEntity implements CommandSender {
playerConnection.sendPacket(updateViewPositionPacket);
}
public int getLastSentTeleportId() {
return teleportId.get();
}
public int getLastReceivedTeleportId() {
return receivedTeleportId;
}
public void refreshReceivedTeleportId(int receivedTeleportId) {
this.receivedTeleportId = receivedTeleportId;
}
/**
* Used for synchronization purpose, mainly for teleportation
*/

View File

@ -2,12 +2,8 @@ package net.minestom.server.listener;
import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.Instance;
import net.minestom.server.network.packet.client.play.ClientPlayerPacket;
import net.minestom.server.network.packet.client.play.ClientPlayerPositionAndRotationPacket;
import net.minestom.server.network.packet.client.play.ClientPlayerPositionPacket;
import net.minestom.server.network.packet.client.play.ClientPlayerRotationPacket;
import net.minestom.server.network.packet.client.play.*;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.chunk.ChunkUtils;
import org.jetbrains.annotations.NotNull;
@ -48,6 +44,11 @@ public class PlayerPositionListener {
yaw, pitch, onGround);
}
public static void teleportConfirmListener(ClientTeleportConfirmPacket packet, Player player) {
final int packetTeleportId = packet.teleportId;
player.refreshReceivedTeleportId(packetTeleportId);
}
private static void processMovement(@NotNull Player player, double x, double y, double z,
float yaw, float pitch, boolean onGround) {
final Instance instance = player.getInstance();
@ -58,9 +59,7 @@ public class PlayerPositionListener {
}
// Prevent the player from moving during a teleport
final double distance = player.getPosition().getDistance(x, y, z);
final int chunkRange = player.getChunkRange() * Chunk.CHUNK_SECTION_SIZE;
if (distance >= chunkRange) {
if (player.getLastSentTeleportId() != player.getLastReceivedTeleportId()) {
return;
}

View File

@ -1,12 +0,0 @@
package net.minestom.server.listener;
import net.minestom.server.entity.Player;
import net.minestom.server.network.packet.client.play.ClientTeleportConfirmPacket;
public class TeleportListener {
public static void listener(ClientTeleportConfirmPacket packet, Player player) {
// Empty
}
}

View File

@ -39,6 +39,7 @@ public final class PacketListenerManager {
setListener(ClientPlayerRotationPacket.class, PlayerPositionListener::playerLookListener);
setListener(ClientPlayerPositionPacket.class, PlayerPositionListener::playerPositionListener);
setListener(ClientPlayerPositionAndRotationPacket.class, PlayerPositionListener::playerPositionAndLookListener);
setListener(ClientTeleportConfirmPacket.class, PlayerPositionListener::teleportConfirmListener);
setListener(ClientPlayerDiggingPacket.class, PlayerDiggingListener::playerDiggingListener);
setListener(ClientAnimationPacket.class, AnimationListener::animationListener);
setListener(ClientInteractEntityPacket.class, UseEntityListener::useEntityListener);
@ -50,7 +51,6 @@ public final class PacketListenerManager {
setListener(ClientTabCompletePacket.class, TabCompleteListener::listener);
setListener(ClientPluginMessagePacket.class, PluginMessageListener::listener);
setListener(ClientPlayerAbilitiesPacket.class, AbilitiesListener::listener);
setListener(ClientTeleportConfirmPacket.class, TeleportListener::listener);
setListener(ClientResourcePackStatusPacket.class, ResourcePackListener::listener);
setListener(ClientAdvancementTabPacket.class, AdvancementTabListener::listener);
setListener(ClientSpectatePacket.class, SpectateListener::listener);