From 210cfcf3a6d418868be9287e840e5c83defed6f6 Mon Sep 17 00:00:00 2001 From: Manuel Frohn Date: Wed, 13 May 2026 13:47:29 +0200 Subject: [PATCH 1/3] Add player join chunk refrech --- .../listener/PlayerJoinListener.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java diff --git a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java new file mode 100644 index 00000000..20d70784 --- /dev/null +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java @@ -0,0 +1,29 @@ +package de.steamwar.fightsystem.listener; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class PlayerJoinListener implements Listener { + + @EventHandler() + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + Location loc = player.getLocation(); + int viewDistance = Bukkit.getViewDistance(); + + int chunkX = loc.getChunk().getX(); + int chunkZ = loc.getChunk().getZ(); + + // 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); + } + } + } +} From bdecec304adfeb195ed4024a4e10c073add48cde Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 15 May 2026 20:26:15 +0200 Subject: [PATCH 2/3] 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); + } } From 9f201f819117a2c135ca4dfeed4dc2478918426f Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 15 May 2026 21:50:09 +0200 Subject: [PATCH 3/3] update packet codec --- .../fightsystem/listener/PlayerJoinListener.java | 11 ++++++++++- 1 file changed, 10 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 85f1ce42..71ecf2a7 100644 --- a/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java +++ b/FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/listener/PlayerJoinListener.java @@ -1,5 +1,8 @@ package de.steamwar.fightsystem.listener; +import de.steamwar.fightsystem.states.FightState; +import de.steamwar.fightsystem.states.StateDependentListener; +import de.steamwar.linkage.Linked; import net.minecraft.network.protocol.game.ClientboundForgetLevelChunkPacket; import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; import net.minecraft.server.level.ServerPlayer; @@ -16,8 +19,13 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +@Linked public class PlayerJoinListener implements Listener { + public PlayerJoinListener() { + new StateDependentListener(true, FightState.All, this); + } + @EventHandler() public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -58,7 +66,8 @@ public class PlayerJoinListener implements Listener { nmsChunk, craftWorld.getHandle().getLightEngine(), null, - null + null, + true ); serverPlayer.connection.send(loadPacket); }