From bdecec304adfeb195ed4024a4e10c073add48cde Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 15 May 2026 20:26:15 +0200 Subject: [PATCH] Update with nms based refresh --- .../listener/PlayerJoinListener.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) 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); + } }