Port ChunkSending (#21)
* Port ChunkSending * cleanup --------- Co-authored-by: AlphaKR93 <dev@alpha93.kr>
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: IPECTER <ipectert@gmail.com>
|
||||
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;
|
||||
+
|
||||
+ }
|
||||
}
|
||||
90
patches/server/0009-Implement-ChunkSending.patch
Normal file
90
patches/server/0009-Implement-ChunkSending.patch
Normal file
@@ -0,0 +1,90 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: IPECTER <ipectert@gmail.com>
|
||||
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<java.util.Map.Entry<ChunkPos, List<Packet<?>>>> 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<ChunkPos, List<Packet<?>>> 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<Packet<?>> 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<ChunkPos, List<Packet<?>>> chunksToSend = java.util.Collections.synchronizedMap(new java.util.HashMap<>());
|
||||
public void trackChunk(ChunkPos chunkPos, Packet<?> chunkDataPacket) {
|
||||
+ if (this.level.plazmaLevelConfiguration().chunkSending.enabled) {
|
||||
+ List<Packet<?>> 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){
|
||||
Reference in New Issue
Block a user