diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java index 20d70784..85f1ce42 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java @@ -1,7 +1,16 @@ package de.steamwar.fightsystem.listener; +import net.minecraft.network.protocol.game.ClientboundForgetLevelChunkPacket; +import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.LevelChunk; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -12,6 +21,7 @@ public class PlayerJoinListener implements Listener { @EventHandler() public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); + World world = player.getWorld(); Location loc = player.getLocation(); int viewDistance = Bukkit.getViewDistance(); @@ -22,8 +32,34 @@ public class PlayerJoinListener implements Listener { // Iterate through the chunks around the player and force a resend for (int x = -viewDistance; x <= viewDistance; x++) { for (int z = -viewDistance; z <= viewDistance; z++) { - player.getWorld().refreshChunk(chunkX + x, chunkZ + z); + Chunk chunk = world.getChunkAt(chunkX + x, chunkZ + z); + this.forceRefreshChunkForPlayer(player, chunk); } } } + + public void forceRefreshChunkForPlayer(Player player, Chunk bukkitChunk) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + CraftWorld craftWorld = (CraftWorld) bukkitChunk.getWorld(); + + int chunkX = bukkitChunk.getX(); + int chunkZ = bukkitChunk.getZ(); + + LevelChunk nmsChunk = craftWorld.getHandle().getChunkSource().getChunk(chunkX, chunkZ, false); + if (nmsChunk == null) { + // Chunk isn't loaded in memory on the server side; + return; + } + + ClientboundForgetLevelChunkPacket unloadPacket = new ClientboundForgetLevelChunkPacket(new ChunkPos(chunkX, chunkZ)); + serverPlayer.connection.send(unloadPacket); + + ClientboundLevelChunkWithLightPacket loadPacket = new ClientboundLevelChunkWithLightPacket( + nmsChunk, + craftWorld.getHandle().getLightEngine(), + null, + null + ); + serverPlayer.connection.send(loadPacket); + } }