Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: Build LimboAPI
run: ./gradlew build
- name: Upload LimboAPI
uses: actions/upload-artifact@v3.0.0
uses: actions/upload-artifact@v4.6.2
with:
name: LimboAPI
path: "*/build/libs/*.jar"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Build LimboAPI
run: ./gradlew build
- name: Upload LimboAPI
uses: actions/upload-artifact@v3.0.0
uses: actions/upload-artifact@v4.6.2
with:
name: LimboAPI
path: "*/build/libs/*.jar"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public enum BlockEntityVersion {
MINECRAFT_1_20_5(EnumSet.of(ProtocolVersion.MINECRAFT_1_20_5)),
MINECRAFT_1_21(EnumSet.of(ProtocolVersion.MINECRAFT_1_21)),
MINECRAFT_1_21_2(EnumSet.of(ProtocolVersion.MINECRAFT_1_21_2)),
MINECRAFT_1_21_4(EnumSet.of(ProtocolVersion.MINECRAFT_1_21_4));
MINECRAFT_1_21_4(EnumSet.of(ProtocolVersion.MINECRAFT_1_21_4)),
MINECRAFT_1_21_5(EnumSet.of(ProtocolVersion.MINECRAFT_1_21_5));

private static final EnumMap<ProtocolVersion, BlockEntityVersion> MC_VERSION_TO_ITEM_VERSIONS = new EnumMap<>(ProtocolVersion.class);

Expand Down Expand Up @@ -68,6 +69,7 @@ public static BlockEntityVersion parse(String from) {
case "1.21" -> MINECRAFT_1_21;
case "1.21.2" -> MINECRAFT_1_21_2;
case "1.21.4" -> MINECRAFT_1_21_4;
case "1.21.5" -> MINECRAFT_1_21_5;
default -> LEGACY;
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ public interface CompactStorage {

int getBitsPerEntry();

int getDataLength();
@Deprecated(forRemoval = true)
default int getDataLength() {
return this.getDataLength(ProtocolVersion.MINIMUM_VERSION);
}

int getDataLength(ProtocolVersion version);

long[] getData();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ public enum WorldVersion {
MINECRAFT_1_20(EnumSet.range(ProtocolVersion.MINECRAFT_1_20, ProtocolVersion.MINECRAFT_1_20_2)),
MINECRAFT_1_20_3(ProtocolVersion.MINECRAFT_1_20_3),
MINECRAFT_1_20_5(EnumSet.range(ProtocolVersion.MINECRAFT_1_20_5, ProtocolVersion.MINECRAFT_1_21)),
MINECRAFT_1_21_2(EnumSet.range(ProtocolVersion.MINECRAFT_1_21_2, ProtocolVersion.MINECRAFT_1_21_2)),
MINECRAFT_1_21_4(EnumSet.range(ProtocolVersion.MINECRAFT_1_21_4, ProtocolVersion.MAXIMUM_VERSION));
MINECRAFT_1_21_2(ProtocolVersion.MINECRAFT_1_21_2),
MINECRAFT_1_21_4(ProtocolVersion.MINECRAFT_1_21_4),
MINECRAFT_1_21_5(EnumSet.range(ProtocolVersion.MINECRAFT_1_21_5, ProtocolVersion.MAXIMUM_VERSION));

private static final EnumMap<ProtocolVersion, WorldVersion> MC_VERSION_TO_ITEM_VERSIONS = new EnumMap<>(ProtocolVersion.class);

Expand Down Expand Up @@ -76,6 +77,7 @@ public static WorldVersion parse(String from) {
case "1.20.5" -> MINECRAFT_1_20_5;
case "1.21.2" -> MINECRAFT_1_21_2;
case "1.21.4" -> MINECRAFT_1_21_4;
case "1.21.5" -> MINECRAFT_1_21_5;
default -> LEGACY;
};
}
Expand Down
6 changes: 4 additions & 2 deletions plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,8 @@ enum MinecraftVersion {
MINECRAFT_1_20_5(766),
MINECRAFT_1_21(767),
MINECRAFT_1_21_2(768),
MINECRAFT_1_21_4(769)
MINECRAFT_1_21_4(769),
MINECRAFT_1_21_5(770)

public static final List<MinecraftVersion> WORLD_VERSIONS = List.of(
MINECRAFT_1_13,
Expand All @@ -147,7 +148,8 @@ enum MinecraftVersion {
MINECRAFT_1_20_3,
MINECRAFT_1_20_5,
MINECRAFT_1_21_2,
MINECRAFT_1_21_4
MINECRAFT_1_21_4,
MINECRAFT_1_21_5
)

public static final MinecraftVersion MINIMUM_VERSION = MINECRAFT_1_7_2
Expand Down
11 changes: 11 additions & 0 deletions plugin/mapping/fallbackdata.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
{
"MINECRAFT_1_21_4": {
"minecraft:wildflowers": "minecraft:glow_lichen",
"minecraft:leaf_litter": "minecraft:glow_lichen",
"minecraft:test_block": "minecraft:structure_block",
"minecraft:test_instance_block": "minecraft:structure_block",
"minecraft:bush": "minecraft:short_grass",
"minecraft:firefly_bush": "minecraft:short_grass",
"minecraft:short_dry_grass": "minecraft:short_grass",
"minecraft:tall_dry_grass": "minecraft:short_grass",
"minecraft:cactus_flower": "minecraft:brain_coral_fan"
},
"MINECRAFT_1_21_2": {
"minecraft:resin_clump": "minecraft:glow_lichen",
"minecraft:resin_block": "minecraft:cut_copper",
Expand Down
2 changes: 1 addition & 1 deletion plugin/src/main/java/net/elytrium/limboapi/LimboAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@
@SuppressFBWarnings("MS_EXPOSE_REP")
public class LimboAPI implements LimboFactory {

private static final int SUPPORTED_MAXIMUM_PROTOCOL_VERSION_NUMBER = 769;
private static final int SUPPORTED_MAXIMUM_PROTOCOL_VERSION_NUMBER = 770;

@MonotonicNonNull
private static Logger LOGGER;
Expand Down
2 changes: 1 addition & 1 deletion plugin/src/main/java/net/elytrium/limboapi/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public static class MAIN {
"1_7_2, 1_7_6, 1_8, 1_9, 1_9_1, 1_9_2, 1_9_4, 1_10, 1_11, 1_11_1, 1_12, 1_12_1, 1_12_2,",
"1_13, 1_13_1, 1_13_2, 1_14, 1_14_1, 1_14_2, 1_14_3, 1_14_4, 1_15, 1_15_1, 1_15_2,",
"1_16, 1_16_1, 1_16_2, 1_16_3, 1_16_4, 1_17, 1_17_1, 1_18, 1_18_2, 1_19, 1_19_1, 1_19_3,",
"1_20, 1_20_2, 1_20_3, 1_20_5, 1_21, 1_21_2, 1_21_4, LATEST"
"1_20, 1_20_2, 1_20_3, 1_20_5, 1_21, 1_21_2, 1_21_4, 1_21_5, LATEST"
})
public String PREPARE_MIN_VERSION = "1_7_2";
public String PREPARE_MAX_VERSION = "LATEST";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,9 @@ public int get(int index) {
public void write(Object byteBufObject, ProtocolVersion version) {
Preconditions.checkArgument(byteBufObject instanceof ByteBuf);
ByteBuf buf = (ByteBuf) byteBufObject;
ProtocolUtils.writeVarInt(buf, this.data.length);
if (version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) < 0) {
ProtocolUtils.writeVarInt(buf, this.data.length);
}
for (long l : this.data) {
buf.writeLong(l);
}
Expand All @@ -137,7 +139,11 @@ public int getBitsPerEntry() {
}

@Override
public int getDataLength() {
public int getDataLength(ProtocolVersion version) {
if (version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) >= 0) {
return this.data.length * 8;
}

return ProtocolUtils.varIntBytes(this.data.length) + this.data.length * 8;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public int getBitsPerEntry() {
}

@Override
public int getDataLength() {
public int getDataLength(ProtocolVersion version) {
return ProtocolUtils.varIntBytes(this.data.length) + this.data.length * 8;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,8 @@ public static void init() throws Throwable {
createMapping(0x1F, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x20, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x22, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x23, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x23, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x22, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
ChunkDataPacket.class, ChunkDataPacket::new,
Expand All @@ -214,7 +215,8 @@ public static void init() throws Throwable {
createMapping(0x24, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x25, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x27, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x28, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x28, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x27, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
ChunkUnloadPacket.class, ChunkUnloadPacket::new,
Expand All @@ -233,7 +235,8 @@ public static void init() throws Throwable {
createMapping(0x1E, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x1F, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x21, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x22, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x22, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x21, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
DefaultSpawnPositionPacket.class, DefaultSpawnPositionPacket::new,
Expand All @@ -253,7 +256,8 @@ public static void init() throws Throwable {
createMapping(0x52, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x54, ProtocolVersion.MINECRAFT_1_20_3, true),
createMapping(0x56, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x5B, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x5B, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x5A, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
MapDataPacket.class, MapDataPacket::new,
Expand All @@ -270,7 +274,8 @@ public static void init() throws Throwable {
createMapping(0x29, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x2A, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x2C, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x2D, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x2D, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x2C, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
PlayerAbilitiesPacket.class, PlayerAbilitiesPacket::new,
Expand All @@ -289,7 +294,8 @@ public static void init() throws Throwable {
createMapping(0x34, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x36, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x38, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x3A, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x3A, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x39, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
PositionRotationPacket.class, PositionRotationPacket::new,
Expand All @@ -308,7 +314,8 @@ public static void init() throws Throwable {
createMapping(0x3C, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x3E, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x40, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x42, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x42, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x41, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
SetExperiencePacket.class, SetExperiencePacket::new,
Expand All @@ -326,7 +333,8 @@ public static void init() throws Throwable {
createMapping(0x58, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x5A, ProtocolVersion.MINECRAFT_1_20_3, true),
createMapping(0x5C, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x61, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x61, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x60, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
SetSlotPacket.class, SetSlotPacket::new,
Expand All @@ -341,7 +349,8 @@ public static void init() throws Throwable {
createMapping(0x13, ProtocolVersion.MINECRAFT_1_19, true),
createMapping(0x12, ProtocolVersion.MINECRAFT_1_19_3, true),
createMapping(0x14, ProtocolVersion.MINECRAFT_1_19_4, true),
createMapping(0x15, ProtocolVersion.MINECRAFT_1_20_2, true)
createMapping(0x15, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x14, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
TimeUpdatePacket.class, TimeUpdatePacket::new,
Expand All @@ -361,7 +370,8 @@ public static void init() throws Throwable {
createMapping(0x60, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x62, ProtocolVersion.MINECRAFT_1_20_3, true),
createMapping(0x64, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x6B, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x6B, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x6A, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
UpdateViewPositionPacket.class, UpdateViewPositionPacket::new, // ViewCentre, ChunkRenderDistanceCenter
Expand All @@ -376,7 +386,8 @@ public static void init() throws Throwable {
createMapping(0x50, ProtocolVersion.MINECRAFT_1_20_2, true),
createMapping(0x52, ProtocolVersion.MINECRAFT_1_20_3, true),
createMapping(0x54, ProtocolVersion.MINECRAFT_1_20_5, true),
createMapping(0x58, ProtocolVersion.MINECRAFT_1_21_2, true)
createMapping(0x58, ProtocolVersion.MINECRAFT_1_21_2, true),
createMapping(0x57, ProtocolVersion.MINECRAFT_1_21_5, true)
);
register(LIMBO_STATE_REGISTRY, PacketDirection.CLIENTBOUND,
UpdateTagsPacket.class, UpdateTagsPacket::new,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public void write(ByteBuf buf, ProtocolVersion version) {
this.storage.write(buf, version);
}

public int getDataLength() {
public int getDataLength(ProtocolVersion version) {
int length = 1;
if (this.storage.getBitsPerEntry() <= 8) {
length += ProtocolUtils.varIntBytes(this.palette.size());
Expand All @@ -102,7 +102,7 @@ public int getDataLength() {
}
}

return length + this.storage.getDataLength();
return length + this.storage.getDataLength(version);
}

public BiomeStorage118 copy() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public int getDataLength(ProtocolVersion version) {
}
}

return length + this.storage.getDataLength();
return length + this.storage.getDataLength(version);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.Deflater;
import net.elytrium.limboapi.LimboAPI;
import net.elytrium.limboapi.api.chunk.VirtualBlock;
Expand All @@ -40,7 +42,9 @@
import net.elytrium.limboapi.mcprotocollib.BitStorage116;
import net.elytrium.limboapi.mcprotocollib.BitStorage19;
import net.elytrium.limboapi.protocol.util.NetworkSection;
import net.kyori.adventure.nbt.BinaryTag;
import net.kyori.adventure.nbt.CompoundBinaryTag;
import net.kyori.adventure.nbt.LongArrayBinaryTag;

public class ChunkDataPacket implements MinecraftPacket {

Expand All @@ -52,6 +56,7 @@ public class ChunkDataPacket implements MinecraftPacket {
private final BiomeData biomeData;
private final CompoundBinaryTag heightmap114;
private final CompoundBinaryTag heightmap116;
private final Map<Integer, long[]> heightmap1215;

public ChunkDataPacket(ChunkSnapshot chunkSnapshot, boolean hasLegacySkyLight, int maxSections) {
this.maxSections = maxSections;
Expand Down Expand Up @@ -80,9 +85,22 @@ public ChunkDataPacket(ChunkSnapshot chunkSnapshot, boolean hasLegacySkyLight, i
this.mask = mask;
this.heightmap114 = this.createHeightMap(true);
this.heightmap116 = this.createHeightMap(false);
this.heightmap1215 = new HashMap<>();
for (Map.Entry<String, ? extends BinaryTag> entry : this.heightmap116) {
this.heightmap1215.put(this.findHeightMapId(entry.getKey()), ((LongArrayBinaryTag) entry.getValue()).value());
}

this.biomeData = new BiomeData(this.chunk);
}

private int findHeightMapId(String key) {
return switch (key) {
case "WORLD_SURFACE" -> 1; /* taken from minecraft decompiled source code */
case "MOTION_BLOCKING" -> 4; /* taken from minecraft decompiled source code */
default -> throw new IllegalArgumentException("Unsupported heightmap: " + key);
};
}

public ChunkDataPacket() {
throw new IllegalStateException();
}
Expand Down Expand Up @@ -131,8 +149,17 @@ public void encode(ByteBuf buf, Direction direction, ProtocolVersion version) {
if (version.compareTo(ProtocolVersion.MINECRAFT_1_14) >= 0) {
if (version.compareTo(ProtocolVersion.MINECRAFT_1_16) < 0) {
ProtocolUtils.writeBinaryTag(buf, version, this.heightmap114);
} else {
} else if (version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) < 0) {
ProtocolUtils.writeBinaryTag(buf, version, this.heightmap116);
} else {
ProtocolUtils.writeVarInt(buf, this.heightmap1215.size());
for (Map.Entry<Integer, long[]> entry : this.heightmap1215.entrySet()) {
ProtocolUtils.writeVarInt(buf, entry.getKey());
ProtocolUtils.writeVarInt(buf, entry.getValue().length);
for (long l : entry.getValue()) {
buf.writeLong(l);
}
}
}
}

Expand Down Expand Up @@ -217,7 +244,8 @@ private ByteBuf createChunkData(ProtocolVersion version) {
dataLength += (version.compareTo(ProtocolVersion.MINECRAFT_1_13) < 0 ? 256 : 256 * 4);
}
if (version.compareTo(ProtocolVersion.MINECRAFT_1_18) >= 0) {
dataLength += (this.maxSections - this.nonNullSections) * 8;
int emptySectionSize = version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) >= 0 ? 6 : 8;
dataLength += (this.maxSections - this.nonNullSections) * emptySectionSize;
}

ByteBuf data = Unpooled.buffer(dataLength);
Expand All @@ -229,10 +257,15 @@ private ByteBuf createChunkData(ProtocolVersion version) {
data.writeShort(0); // Block count = 0.
data.writeByte(0); // BlockStorage: 0 bit per entry = Single palette.
ProtocolUtils.writeVarInt(data, Block.AIR.getID()); // Only air block in the palette.
ProtocolUtils.writeVarInt(data, 0); // BlockStorage: 0 entries.
if (version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) < 0) {
ProtocolUtils.writeVarInt(data, 0); // BlockStorage: 0 entries.
}

data.writeByte(0); // BiomeStorage: 0 bit per entry = Single palette.
ProtocolUtils.writeVarInt(data, Biome.PLAINS.getID()); // Only Plain biome in the palette.
ProtocolUtils.writeVarInt(data, 0); // BiomeStorage: 0 entries.
if (version.compareTo(ProtocolVersion.MINECRAFT_1_21_5) < 0) {
ProtocolUtils.writeVarInt(data, 0); // BiomeStorage: 0 entries.
}
}
}
}
Expand Down
Loading