diff --git a/leaves-server/minecraft-patches/features/0058-Faster-chunk-serialization.patch b/leaves-server/minecraft-patches/features/0058-Faster-chunk-serialization.patch index 68e0ebf9..79c88d93 100644 --- a/leaves-server/minecraft-patches/features/0058-Faster-chunk-serialization.patch +++ b/leaves-server/minecraft-patches/features/0058-Faster-chunk-serialization.patch @@ -16,7 +16,7 @@ As part of: Lithium (https://github.com/CaffeineMC/lithium-fabric) Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/net/minecraft/util/BitStorage.java b/net/minecraft/util/BitStorage.java -index 02502d50f0255f5bbcc0ecb965abb48cc1a112da..674d714ba21fa0306283dae35ece466dcfcbdf6c 100644 +index 02502d50f0255f5bbcc0ecb965abb48cc1a112da..45f61e66b1c24af63e3840fc54c3564f6bc317af 100644 --- a/net/minecraft/util/BitStorage.java +++ b/net/minecraft/util/BitStorage.java @@ -38,4 +38,6 @@ public interface BitStorage extends ca.spottedleaf.moonrise.patches.block_counti @@ -24,10 +24,10 @@ index 02502d50f0255f5bbcc0ecb965abb48cc1a112da..674d714ba21fa0306283dae35ece466d } // Paper end - block counting + -+ void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out); // Leaves - Gale - Lithium - faster chunk serialization ++ void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler); // Leaves - Gale - Lithium - faster chunk serialization } diff --git a/net/minecraft/util/SimpleBitStorage.java b/net/minecraft/util/SimpleBitStorage.java -index e6306a68c8652d4c5d22d5ecb1416f5f931f76ee..bbebf19cfc78d31319948943fa3fea5229f4aaf3 100644 +index e6306a68c8652d4c5d22d5ecb1416f5f931f76ee..1c7986dbfd27c20e37824cab94ba61da3465ce9e 100644 --- a/net/minecraft/util/SimpleBitStorage.java +++ b/net/minecraft/util/SimpleBitStorage.java @@ -465,4 +465,45 @@ public class SimpleBitStorage implements BitStorage { @@ -37,7 +37,7 @@ index e6306a68c8652d4c5d22d5ecb1416f5f931f76ee..bbebf19cfc78d31319948943fa3fea52 + + // Leaves start - Gale - Lithium - faster chunk serialization + @Override -+ public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out) { ++ public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler) { + if (this.size >= Short.MAX_VALUE) { + throw new IllegalStateException("Array too large"); + } @@ -58,7 +58,7 @@ index e6306a68c8652d4c5d22d5ecb1416f5f931f76ee..bbebf19cfc78d31319948943fa3fea52 + int remappedId = mappings[value]; + + if (remappedId == 0) { -+ remappedId = dstPalette.idFor(srcPalette.valueFor(value)) + 1; ++ remappedId = dstPalette.idFor(srcPalette.valueFor(value), resizeHandler) + 1; + mappings[value] = (short) remappedId; + } + @@ -77,7 +77,7 @@ index e6306a68c8652d4c5d22d5ecb1416f5f931f76ee..bbebf19cfc78d31319948943fa3fea52 + } diff --git a/net/minecraft/util/ZeroBitStorage.java b/net/minecraft/util/ZeroBitStorage.java -index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..d58539fe376f548930b49141c87ec5eb23b29af7 100644 +index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..bdbeff9c93b6775cf9d4a2db878dada767d172ee 100644 --- a/net/minecraft/util/ZeroBitStorage.java +++ b/net/minecraft/util/ZeroBitStorage.java @@ -80,4 +80,6 @@ public class ZeroBitStorage implements BitStorage { @@ -85,10 +85,10 @@ index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..d58539fe376f548930b49141c87ec5eb } // Paper end - block counting + -+ @Override public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out) {} // Leaves - Gale - Lithium - faster chunk serialization ++ @Override public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler) {} // Leaves - Gale - Lithium - faster chunk serialization } diff --git a/net/minecraft/world/level/chunk/PalettedContainer.java b/net/minecraft/world/level/chunk/PalettedContainer.java -index 1843046fe145bb23f2e9cf3269fb05c0fb617603..0221b3f4e7dab46ff4c3c601db163307f4cbe3cf 100644 +index 1843046fe145bb23f2e9cf3269fb05c0fb617603..26fd253ea8a078526c01532f081ea6e22b35b041 100644 --- a/net/minecraft/world/level/chunk/PalettedContainer.java +++ b/net/minecraft/world/level/chunk/PalettedContainer.java @@ -23,6 +23,22 @@ import net.minecraft.util.ThreadingDetector; @@ -136,13 +136,13 @@ index 1843046fe145bb23f2e9cf3269fb05c0fb617603..0221b3f4e7dab46ff4c3c601db163307 + } + + if (elements == null) { -+ org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette compactedPalette = new org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette<>(registry, storage.getBits(), this.dummyPaletteResize); ++ org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette compactedPalette = new org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette<>(storage.getBits()); + short[] array = this.getOrCreate(strategy.entryCount()); + -+ storage.compact(this.data.palette(), compactedPalette, array); ++ storage.compact(this.data.palette(), compactedPalette, array, this); + + // If the palette didn't change during compaction, do a simple copy of the data array -+ if (hashPalette != null && hashPalette.getSize() == compactedPalette.getSize() && storage.getBits() == strategy.calculateBitsForSerialization(registry, hashPalette.getSize())) { // paletteSize can de-sync from palette - see https://github.com/CaffeineMC/lithium-fabric/issues/279 ++ if (hashPalette != null && hashPalette.getSize() == compactedPalette.getSize() && storage.getBits() == strategy.getConfigurationForPaletteSize(hashPalette.getSize()).bitsInStorage()) { // paletteSize can de-sync from palette - see https://github.com/CaffeineMC/lithium-fabric/issues/279 + data = this.asOptional(storage.getRaw().clone()); + elements = hashPalette.getElements(); + } else { diff --git a/leaves-server/minecraft-patches/features/0087-Servux-Protocol.patch b/leaves-server/minecraft-patches/features/0087-Servux-Protocol.patch index 5077984c..c94c852a 100644 --- a/leaves-server/minecraft-patches/features/0087-Servux-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0087-Servux-Protocol.patch @@ -20,7 +20,7 @@ index 4257c47d33e3773fac766817138cc21c55d9ab76..8638f3f7aa853802a60ddeb681d089e0 + // Leaves end - servux } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 215350f388d90159456154d5f970a6a89265ebc2..00bbba8d3ab8cb1115c1d9a45b772b1d1f269067 100644 +index 215350f388d90159456154d5f970a6a89265ebc2..f1715fafe3725bf534298ca3e400f96676725d03 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -2288,9 +2288,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -31,17 +31,17 @@ index 215350f388d90159456154d5f970a6a89265ebc2..00bbba8d3ab8cb1115c1d9a45b772b1d @Override public LevelData.RespawnData getRespawnData() { return this.getServer().getRespawnData(); -+ int i = this.getGameRules().getInt(GameRules.RULE_SPAWN_CHUNK_RADIUS) + 1; -+ if (i > 1) { -+ // Paper start - allow disabling gamerule limits -+ for (ChunkPos chunkPos : io.papermc.paper.util.MCUtil.getSpiralOutChunks(pos, i - 2)) { -+ this.getChunkSource().addTicketAtLevel(TicketType.START, chunkPos, ChunkLevel.ENTITY_TICKING_LEVEL); -+ } -+ // Paper end - allow disabling gamerule limits -+ } -+ -+ this.lastSpawnChunkRadius = i; -+ org.leavesmc.leaves.protocol.servux.ServuxHudDataProtocol.refreshSpawnMetadata = true; // Leaves - servux ++ // TODO: 1.21.9 removed spawn chunk, should we keep this? ++ // int i = this.getGameRules().getInt(GameRules.RULE_SPAWN_CHUNK_RADIUS) + 1; ++ // if (i > 1) { ++ // // Paper start - allow disabling gamerule limits ++ // for (ChunkPos chunkPos : io.papermc.paper.util.MCUtil.getSpiralOutChunks(pos, i - 2)) { ++ // this.getChunkSource().addTicketAtLevel(TicketType.START, chunkPos, ChunkLevel.ENTITY_TICKING_LEVEL); ++ // } ++ // // Paper end - allow disabling gamerule limits ++ // } ++ // this.lastSpawnChunkRadius = i; ++ // org.leavesmc.leaves.protocol.servux.ServuxHudDataProtocol.refreshSpawnMetadata = true; // Leaves - servux } public LongSet getForceLoadedChunks() { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/world/chunk/LithiumHashPalette.java b/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/world/chunk/LithiumHashPalette.java index e814196d..105eac4f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/world/chunk/LithiumHashPalette.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/world/chunk/LithiumHashPalette.java @@ -23,30 +23,24 @@ import static it.unimi.dsi.fastutil.Hash.FAST_LOAD_FACTOR; /** * Generally provides better performance over the vanilla {@link net.minecraft.world.level.chunk.HashMapPalette} when calling - * {@link LithiumHashPalette#idFor(Object)} through using a faster backing map and reducing pointer chasing. + * {@link LithiumHashPalette#idFor(Object, PaletteResize)} through using a faster backing map and reducing pointer chasing. */ public class LithiumHashPalette implements Palette { private static final int ABSENT_VALUE = -1; - - private final IdMap idList; - private final PaletteResize resizeHandler; private final int indexBits; - private final Reference2IntOpenHashMap table; private T[] entries; private int size = 0; - private LithiumHashPalette(IdMap idList, PaletteResize resizeHandler, int indexBits, T[] entries, Reference2IntOpenHashMap table, int size) { - this.idList = idList; - this.resizeHandler = resizeHandler; + private LithiumHashPalette(int indexBits, T[] entries, Reference2IntOpenHashMap table, int size) { this.indexBits = indexBits; this.entries = entries; this.table = table; this.size = size; } - public LithiumHashPalette(IdMap idList, int bits, PaletteResize resizeHandler, List list) { - this(idList, bits, resizeHandler); + public LithiumHashPalette(int bits, List list) { + this(bits); for (T t : list) { this.addEntry(t); @@ -54,10 +48,8 @@ public class LithiumHashPalette implements Palette { } @SuppressWarnings("unchecked") - public LithiumHashPalette(IdMap idList, int bits, PaletteResize resizeHandler) { - this.idList = idList; + public LithiumHashPalette(int bits) { this.indexBits = bits; - this.resizeHandler = resizeHandler; int capacity = 1 << bits; @@ -67,11 +59,11 @@ public class LithiumHashPalette implements Palette { } @Override - public int idFor(@NotNull T obj) { + public int idFor(@NotNull T obj, @NotNull PaletteResize resizeHandler) { int id = this.table.getInt(obj); if (id == ABSENT_VALUE) { - id = this.computeEntry(obj); + id = this.computeEntry(obj, resizeHandler); } return id; @@ -88,14 +80,14 @@ public class LithiumHashPalette implements Palette { return false; } - private int computeEntry(T obj) { + private int computeEntry(T obj, PaletteResize resizeHandler) { int id = this.addEntry(obj); if (id >= 1 << this.indexBits) { - if (this.resizeHandler == null) { + if (resizeHandler == null) { throw new IllegalStateException("Cannot grow"); } else { - id = this.resizeHandler.onResize(this.indexBits + 1, obj); + id = resizeHandler.onResize(this.indexBits + 1, obj); } } @@ -151,32 +143,32 @@ public class LithiumHashPalette implements Palette { } @Override - public void read(FriendlyByteBuf buf) { + public void read(FriendlyByteBuf buf, @NotNull IdMap idMap) { this.clear(); int entryCount = buf.readVarInt(); for (int i = 0; i < entryCount; ++i) { - this.addEntry(this.idList.byIdOrThrow(buf.readVarInt())); + this.addEntry(idMap.byIdOrThrow(buf.readVarInt())); } } @Override - public void write(FriendlyByteBuf buf) { + public void write(FriendlyByteBuf buf, @NotNull IdMap idMap) { int size = this.size; buf.writeVarInt(size); for (int i = 0; i < size; ++i) { - buf.writeVarInt(this.idList.getId(this.valueFor(i))); + buf.writeVarInt(idMap.getId(this.valueFor(i))); } } @Override - public int getSerializedSize() { + public int getSerializedSize(@NotNull IdMap idMap) { int size = VarInt.getByteSize(this.size); for (int i = 0; i < this.size; ++i) { - size += VarInt.getByteSize(this.idList.getId(this.valueFor(i))); + size += VarInt.getByteSize(idMap.getId(this.valueFor(i))); } return size; @@ -188,8 +180,8 @@ public class LithiumHashPalette implements Palette { } @Override - public @NotNull Palette copy(@NotNull PaletteResize resizeHandler) { - return new LithiumHashPalette<>(this.idList, resizeHandler, this.indexBits, this.entries.clone(), this.table.clone(), this.size); + public @NotNull Palette copy() { + return new LithiumHashPalette<>(this.indexBits, this.entries.clone(), this.table.clone(), this.size); } private void clear() { @@ -203,7 +195,7 @@ public class LithiumHashPalette implements Palette { return Arrays.asList(copy); } - public static Palette create(int bits, IdMap idList, PaletteResize listener, List list) { - return new LithiumHashPalette<>(idList, bits, listener, list); + public static Palette create(int bits, List list) { + return new LithiumHashPalette<>(bits, list); } } \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java index f5c33c35..c64b88e7 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java @@ -101,7 +101,7 @@ public class ServuxHudDataProtocol implements LeavesProtocol { sendPacket(player, new HudDataPayload(HudDataPayloadType.PACKET_S2C_METADATA, metadata)); } - public static void refreshSpawnMetadata(ServerPlayer player) { + public static void refreshSpawnMetadata(ServerPlayer player) { // TODO: 1.21.9 removed spawn chunk, should we keep this? CompoundTag metadata = new CompoundTag(); metadata.putString("id", HudDataPayload.CHANNEL.toString()); metadata.putString("servux", ServuxProtocol.SERVUX_STRING); @@ -168,7 +168,7 @@ public class ServuxHudDataProtocol implements LeavesProtocol { metadata.putInt("spawnPosX", spawnPos.getX()); metadata.putInt("spawnPosY", spawnPos.getY()); metadata.putInt("spawnPosZ", spawnPos.getZ()); - metadata.putInt("spawnChunkRadius", level.getGameRules().getInt(GameRules.RULE_SPAWN_CHUNK_RADIUS)); + // metadata.putInt("spawnChunkRadius", level.getGameRules().getInt(GameRules.RULE_SPAWN_CHUNK_RADIUS)); // TODO: 1.21.9 removed spawn chunk, should we keep this? if (LeavesConfig.protocol.servux.hudMetadataShareSeed) { metadata.putLong("worldSeed", level.getSeed());