From 285d3872689d65daed81c14cbe67d456e291c650 Mon Sep 17 00:00:00 2001 From: Petr Ilin Date: Mon, 30 Jan 2023 01:14:01 +0300 Subject: [PATCH] 1.1.6: UpdateTags fix, chunk-radius-send-on-spawn config option --- README.md | 4 +- VERSION | 2 +- .../limboapi/api/chunk/VirtualBlock.java | 4 ++ build.gradle | 2 +- .../java/net/elytrium/limboapi/Settings.java | 12 ++++- .../elytrium/limboapi/server/LimboImpl.java | 52 ++++++++++++++----- .../limboapi/server/world/SimpleBlock.java | 12 ++++- .../server/world/SimpleTagManager.java | 8 +-- .../server/world/chunk/SimpleChunk.java | 8 +++ 9 files changed, 81 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 835622dc..80da8ecd 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Test server: [``ely.su``](https://hotmc.ru/minecraft-server-203216) net.elytrium.limboapi api - 1.1.4 + 1.1.6 provided @@ -70,7 +70,7 @@ Test server: [``ely.su``](https://hotmc.ru/minecraft-server-203216) } dependencies { - compileOnly("net.elytrium.limboapi:api:1.1.3") + compileOnly("net.elytrium.limboapi:api:1.1.6") } ``` diff --git a/VERSION b/VERSION index e25d8d9f..0664a8fd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.5 +1.1.6 diff --git a/api/src/main/java/net/elytrium/limboapi/api/chunk/VirtualBlock.java b/api/src/main/java/net/elytrium/limboapi/api/chunk/VirtualBlock.java index d0de62ac..9e89fa3f 100644 --- a/api/src/main/java/net/elytrium/limboapi/api/chunk/VirtualBlock.java +++ b/api/src/main/java/net/elytrium/limboapi/api/chunk/VirtualBlock.java @@ -23,6 +23,10 @@ public interface VirtualBlock { short getBlockID(ProtocolVersion version); + boolean isSupportedOn(ProtocolVersion version); + + boolean isSupportedOn(WorldVersion version); + short getBlockStateID(ProtocolVersion version); boolean isSolid(); diff --git a/build.gradle b/build.gradle index 7e0844eb..ecd09ea0 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ allprojects { apply(plugin: "org.cadixdev.licenser") setGroup("net.elytrium.limboapi") - setVersion("1.1.5") + setVersion("1.1.6") compileJava { getOptions().setEncoding("UTF-8") diff --git a/plugin/src/main/java/net/elytrium/limboapi/Settings.java b/plugin/src/main/java/net/elytrium/limboapi/Settings.java index d90a7dd0..d9e2888c 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/Settings.java +++ b/plugin/src/main/java/net/elytrium/limboapi/Settings.java @@ -95,8 +95,18 @@ public static class MAIN { public int SIMULATION_DISTANCE = 9; + @Comment({ + "How many chunks we should send when a player spawns.", + " 0 = send no chunks on spawn.", + " 1 = send only the spawn chunk.", + " 2 = send the spawn chunk and chunks next to the spawn chunk.", + " 3 = send the spawn chunk, chunks next to the spawn chunk and next to these chunks.", + " and so on.." + }) + public int CHUNK_RADIUS_SEND_ON_SPAWN = 2; + @Comment("How many chunks we should send per tick") - public int CHUNKS_PER_TICK = 8; + public int CHUNKS_PER_TICK = 16; @Create public MESSAGES MESSAGES; diff --git a/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java b/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java index ce7e1316..c36e8701 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java +++ b/plugin/src/main/java/net/elytrium/limboapi/server/LimboImpl.java @@ -60,6 +60,7 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -126,7 +127,8 @@ public class LimboImpl implements Limbo { private PreparedPacket joinPackets; private PreparedPacket fastRejoinPackets; private PreparedPacket safeRejoinPackets; - private List chunks; + private PreparedPacket firstChunks; + private List delayedChunks; private PreparedPacket respawnPackets; private boolean shouldRespawn = true; private boolean shouldUpdateTags = true; @@ -173,7 +175,8 @@ protected void refresh() { this.addPostJoin(this.fastRejoinPackets); this.addPostJoin(this.safeRejoinPackets); - this.chunks = this.createChunksPackets(); + this.firstChunks = this.createFirstChunks(); + this.delayedChunks = this.createDelayedChunksPackets(); this.respawnPackets = this.plugin.createPreparedPacket() .prepare( this.createPlayerPosAndLook( @@ -344,16 +347,14 @@ public void respawnPlayer(Player player) { MinecraftConnection connection = ((ConnectedPlayer) player).getConnection(); connection.delayedWrite(this.respawnPackets); + if (this.firstChunks != null) { + connection.write(this.firstChunks); + } int packetIndex = 0; - for (PreparedPacket chunk : this.chunks) { + for (PreparedPacket chunk : this.delayedChunks) { connection.eventLoop().schedule(() -> connection.write(chunk), (++packetIndex) * 50L, TimeUnit.MILLISECONDS); } - - // We should send first chunks without scheduling - if (this.chunks.size() != 0) { - connection.write(this.chunks.get(0)); - } } @Override @@ -479,7 +480,8 @@ private void localDispose() { this.fastRejoinPackets.release(); this.safeRejoinPackets.release(); this.respawnPackets.release(); - this.chunks.forEach(PreparedPacket::release); + this.firstChunks.release(); + this.delayedChunks.forEach(PreparedPacket::release); } // From Velocity. @@ -582,9 +584,27 @@ private AvailableCommands createAvailableCommandsPacket() { } } - private List createChunksPackets() { + private PreparedPacket createFirstChunks() { + PreparedPacket packet = this.plugin.createPreparedPacket(); List> orderedChunks = this.world.getOrderedChunks(); - if (orderedChunks.size() == 0) { + + int chunkCounter = 0; + for (List chunksWithSameDistance : orderedChunks) { + if (++chunkCounter > Settings.IMP.MAIN.CHUNK_RADIUS_SEND_ON_SPAWN) { + break; + } + + for (VirtualChunk chunk : chunksWithSameDistance) { + packet.prepare(this.createChunkData(chunk, this.world.getDimension())); + } + } + + return packet.build(); + } + + private List createDelayedChunksPackets() { + List> orderedChunks = this.world.getOrderedChunks(); + if (orderedChunks.size() <= Settings.IMP.MAIN.CHUNK_RADIUS_SEND_ON_SPAWN) { return List.of(); } @@ -592,11 +612,17 @@ private List createChunksPackets() { PreparedPacket packet = this.plugin.createPreparedPacket(); int chunkCounter = 0; - for (List chunksWithSameDistance : orderedChunks) { - for (VirtualChunk chunk : chunksWithSameDistance) { + Iterator> distanceIterator = orderedChunks.listIterator(); + for (int i = 0; i < Settings.IMP.MAIN.CHUNK_RADIUS_SEND_ON_SPAWN; i++) { + distanceIterator.next(); + } + + while (distanceIterator.hasNext()) { + for (VirtualChunk chunk : distanceIterator.next()) { if (++chunkCounter > Settings.IMP.MAIN.CHUNKS_PER_TICK) { packets.add(packet.build()); packet = this.plugin.createPreparedPacket(); + chunkCounter = 0; } packet.prepare(this.createChunkData(chunk, this.world.getDimension())); diff --git a/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleBlock.java b/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleBlock.java index 8b849cdc..6b251c66 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleBlock.java +++ b/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleBlock.java @@ -186,7 +186,7 @@ public short getID(ProtocolVersion version) { @Override public short getBlockID(WorldVersion version) { - return LEGACY_BLOCK_IDS_MAP.get(this.blockID).getOrDefault(version, this.blockID); + return LEGACY_BLOCK_IDS_MAP.get(this.blockID).get(version); } @Override @@ -194,6 +194,16 @@ public short getBlockID(ProtocolVersion version) { return this.getBlockID(WorldVersion.from(version)); } + @Override + public boolean isSupportedOn(WorldVersion version) { + return LEGACY_BLOCK_IDS_MAP.get(this.blockID).containsKey(version); + } + + @Override + public boolean isSupportedOn(ProtocolVersion version) { + return this.isSupportedOn(WorldVersion.from(version)); + } + @Override public short getBlockStateID(ProtocolVersion version) { return MODERN_BLOCK_STATE_IDS_MAP.get(version).getOrDefault(this.blockStateID, this.blockStateID); diff --git a/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleTagManager.java b/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleTagManager.java index 99de02ae..99bf8503 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleTagManager.java +++ b/plugin/src/main/java/net/elytrium/limboapi/server/world/SimpleTagManager.java @@ -48,9 +48,7 @@ public static void init() { LinkedTreeMap.class ); - fluids.forEach((id, protocolId) -> { - FLUIDS.put(id, Integer.valueOf(protocolId)); - }); + fluids.forEach((id, protocolId) -> FLUIDS.put(id, Integer.valueOf(protocolId))); LinkedTreeMap>> tags = gson.fromJson( new InputStreamReader( @@ -82,7 +80,9 @@ private static UpdateTagsPacket localGetTagsForVersion(LinkedTreeMap tagList.put(tagName, blockList.stream() - .map(e -> (int) SimpleBlock.fromModernID(e, Map.of()).getBlockID(version)) + .map(e -> SimpleBlock.fromModernID(e, Map.of())) + .filter(e -> e.isSupportedOn(version)) + .map(e -> (int) e.getBlockID(version)) .collect(Collectors.toList()))); break; } diff --git a/plugin/src/main/java/net/elytrium/limboapi/server/world/chunk/SimpleChunk.java b/plugin/src/main/java/net/elytrium/limboapi/server/world/chunk/SimpleChunk.java index aff3cf4d..3d0827ba 100644 --- a/plugin/src/main/java/net/elytrium/limboapi/server/world/chunk/SimpleChunk.java +++ b/plugin/src/main/java/net/elytrium/limboapi/server/world/chunk/SimpleChunk.java @@ -205,4 +205,12 @@ private static int getBiomeIndex(int posX, int posY, int posZ) { private static int getSectionIndex(int posY) { return posY >> 4; } + + @Override + public String toString() { + return "SimpleChunk{" + + "posX=" + this.posX + + ", posZ=" + this.posZ + + '}'; + } }