diff --git a/src/main/java/org/oryxel/gfp/packets/client/ClientPositionPacket.java b/src/main/java/org/oryxel/gfp/packets/client/ClientPositionPacket.java index 46cee5d..557f0f8 100644 --- a/src/main/java/org/oryxel/gfp/packets/client/ClientPositionPacket.java +++ b/src/main/java/org/oryxel/gfp/packets/client/ClientPositionPacket.java @@ -87,7 +87,7 @@ public void onPacketReceived(CloudburstPacketEvent event) { session.lastRealPosInt = realIntPos; - if (Vector3f.from(packet.getPosition().getX(), 0, packet.getPosition().getZ()).length() < GFPExtension.config.maxPosition()) { + if (Math.abs(packet.getPosition().getX()) <= GFPExtension.config.maxPosition() && Math.abs(packet.getPosition().getZ()) <= GFPExtension.config.maxPosition()) { return; } @@ -203,6 +203,7 @@ public void packetReceived(MCPLPacketEvent event) { session.getChunkCache().sendChunksWithOffset(); session.getEntityCache().resendWithOffset(); session.sendWorldSpawn(); + session.resendVehicle(); }); } } diff --git a/src/main/java/org/oryxel/gfp/session/CachedSession.java b/src/main/java/org/oryxel/gfp/session/CachedSession.java index a95cf85..74fe6d7 100644 --- a/src/main/java/org/oryxel/gfp/session/CachedSession.java +++ b/src/main/java/org/oryxel/gfp/session/CachedSession.java @@ -5,7 +5,10 @@ import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.math.vector.Vector3i; import org.cloudburstmc.protocol.bedrock.BedrockServerSession; +import org.cloudburstmc.protocol.bedrock.data.entity.EntityLinkData; +import org.cloudburstmc.protocol.bedrock.packet.SetEntityLinkPacket; import org.cloudburstmc.protocol.bedrock.packet.SetSpawnPositionPacket; +import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.entity.type.player.SessionPlayerEntity; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.DimensionUtils; @@ -29,7 +32,7 @@ public class CachedSession { @Getter @Setter - private Vector3i offset = Vector3i.from(0, 0 ,0); + private Vector3i offset = Vector3i.from(0, 0, 0); public Vector3i lastRealPosInt = Vector3i.ZERO; public Vector3f rotation = Vector3f.ZERO; @@ -64,6 +67,7 @@ public void reOffsetPlayer(double x, double z, Vector3i newOffset) { this.chunkCache.sendChunksWithOffset(); this.entityCache.resendWithOffset(); this.sendWorldSpawn(); + this.resendVehicle(); } public void sendWorldSpawn() { @@ -77,4 +81,35 @@ public void sendWorldSpawn() { spawnPositionPacket.setSpawnType(SetSpawnPositionPacket.Type.WORLD_SPAWN); this.session.sendUpstreamPacket(spawnPositionPacket); } + + public void resendVehicle() { + SessionPlayerEntity player = this.session.getPlayerEntity(); + + Entity vehicle = player.getVehicle(); + if (vehicle == null) { + return; + } + + SetEntityLinkPacket unmount = new SetEntityLinkPacket(); + unmount.setEntityLink(new EntityLinkData( + vehicle.geyserId(), + player.geyserId(), + EntityLinkData.Type.REMOVE, + false, + false, + 0f) + ); + SetEntityLinkPacket mount = new SetEntityLinkPacket(); + mount.setEntityLink(new EntityLinkData( + vehicle.geyserId(), + player.geyserId(), + EntityLinkData.Type.RIDER, + false, + false, + 0f) + ); + + this.session.sendUpstreamPacket(unmount); + this.session.sendUpstreamPacket(mount); + } }