diff --git a/patches/server/0008-Implement-ChunkSending-Configuration.patch b/patches/server/0008-Implement-ChunkSending-Configuration.patch new file mode 100644 index 0000000..ad50c40 --- /dev/null +++ b/patches/server/0008-Implement-ChunkSending-Configuration.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Thu, 23 Mar 2023 14:25:09 +0900 +Subject: [PATCH] Implement ChunkSending - Configuration + + +diff --git a/src/main/java/org/plazmamc/plazma/configurations/LevelConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/LevelConfigurations.java +index d1b5b269173c43452960bbe38d5d940f2089c0fa..1f0b3cc1bad949147f632e6ace40ac61235acbc1 100644 +--- a/src/main/java/org/plazmamc/plazma/configurations/LevelConfigurations.java ++++ b/src/main/java/org/plazmamc/plazma/configurations/LevelConfigurations.java +@@ -21,4 +21,12 @@ public class LevelConfigurations extends ConfigurationPart { + + @Setting(Configuration.VERSION_FIELD) + public int version = CURRENT_VERSION; ++ ++ public ChunkSending chunkSending; ++ public class ChunkSending extends ConfigurationPart { ++ ++ public boolean enabled = true; ++ public int maxChunksPerTick = 5; ++ ++ } + } diff --git a/patches/server/0009-Implement-ChunkSending.patch b/patches/server/0009-Implement-ChunkSending.patch new file mode 100644 index 0000000..0604315 --- /dev/null +++ b/patches/server/0009-Implement-ChunkSending.patch @@ -0,0 +1,90 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Thu, 23 Mar 2023 14:32:26 +0900 +Subject: [PATCH] Implement ChunkSending + +Original: someaddons/chunksending +Copyright (C) 2023 someaddons + +diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java +index 904fcdeb7937d36208cc9a8d5eca9ef3a5b2cd9e..7f749579fe056a8436e6625204ae31f1fcc15f32 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java ++++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java +@@ -362,15 +362,14 @@ public class ChunkHolder { + } + + Object[] backingSet = players.getBackingSet(); +- for (int i = 0, len = backingSet.length; i < len; ++i) { +- if (!(backingSet[i] instanceof ServerPlayer player)) { +- continue; +- } +- if (!this.chunkMap.playerChunkManager.isChunkSent(player, this.pos.x, this.pos.z, onlyOnWatchDistanceEdge)) { +- continue; +- } ++ // Plazma start - Implement ChunkSending ++ for (Object o : backingSet) { ++ if (!(o instanceof ServerPlayer player) ++ || !this.chunkMap.playerChunkManager.isChunkSent(player, this.pos.x, this.pos.z, onlyOnWatchDistanceEdge) ++ || (this.chunkMap.level.plazmaLevelConfiguration().chunkSending.enabled && player.attachToPending(pos, packet))) continue; + player.connection.send(packet); + } ++ // Plazma end + // Paper end - per player view distance + } + +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index 74238a87d1ff3391aac5812b24b84af228baeaa4..3d900e323e1e11b56ad2a7d8f8ebcb71c069cfe0 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -727,8 +727,36 @@ public class ServerPlayer extends Player { + } + } + // Purpur end ++ // Plazma start - Implement ChunkSending ++ if (this.level.plazmaLevelConfiguration().chunkSending.enabled) { ++ if (chunksToSend.isEmpty()) return; ++ ++ if (disconnected) { ++ chunksToSend.clear(); ++ return; ++ } ++ ++ final List>>> packets = new java.util.ArrayList<>(chunksToSend.entrySet()); ++ packets.sort(java.util.Comparator.comparingDouble(e -> e.getKey().getMiddleBlockPosition(getBlockY()).distSqr(blockPosition()))); ++ ++ for (int i = 0; i < packets.size() && i < this.level.plazmaLevelConfiguration().chunkSending.maxChunksPerTick; i++) { ++ final java.util.Map.Entry>> entry = packets.get(i); ++ for (final Packet packet : entry.getValue()) { ++ connection.send(packet); ++ } ++ chunksToSend.remove(entry.getKey()); ++ } ++ } + } + ++ public boolean attachToPending(final ChunkPos pos, final Packet packet) { ++ final List> packetList = chunksToSend.get(pos); ++ if (packetList == null) return false; ++ packetList.add(packet); ++ return true; ++ } ++ // Plazma end ++ + public void doTick() { + try { + if (valid && !this.isSpectator() || !this.touchingUnloadedChunk()) { // Paper - don't tick dead players that are not in the world currently (pending respawn) +@@ -2345,7 +2373,14 @@ public class ServerPlayer extends Player { + return true; // Paper + } + ++ // Plazma start - Implement ChunkSending ++ private final java.util.Map>> chunksToSend = java.util.Collections.synchronizedMap(new java.util.HashMap<>()); + public void trackChunk(ChunkPos chunkPos, Packet chunkDataPacket) { ++ if (this.level.plazmaLevelConfiguration().chunkSending.enabled) { ++ List> packetList = chunksToSend.computeIfAbsent(chunkPos, k -> new java.util.ArrayList<>()); ++ packetList.add(chunkDataPacket); ++ } ++ // Plazma end + this.connection.send(chunkDataPacket); + // Paper start + if(io.papermc.paper.event.packet.PlayerChunkLoadEvent.getHandlerList().getRegisteredListeners().length > 0){