forked from SteamWar/SteamWar
Update with nms based refresh
This commit is contained in:
+37
-1
@@ -1,7 +1,16 @@
|
|||||||
package de.steamwar.fightsystem.listener;
|
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.Bukkit;
|
||||||
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
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.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@@ -12,6 +21,7 @@ public class PlayerJoinListener implements Listener {
|
|||||||
@EventHandler()
|
@EventHandler()
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
World world = player.getWorld();
|
||||||
|
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
int viewDistance = Bukkit.getViewDistance();
|
int viewDistance = Bukkit.getViewDistance();
|
||||||
@@ -22,8 +32,34 @@ public class PlayerJoinListener implements Listener {
|
|||||||
// Iterate through the chunks around the player and force a resend
|
// Iterate through the chunks around the player and force a resend
|
||||||
for (int x = -viewDistance; x <= viewDistance; x++) {
|
for (int x = -viewDistance; x <= viewDistance; x++) {
|
||||||
for (int z = -viewDistance; z <= viewDistance; z++) {
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user