diff options
Diffstat (limited to 'serverlist-server/src/main/com')
4 files changed, 90 insertions, 18 deletions
diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java index 1aa2b11..007c833 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java @@ -16,6 +16,17 @@ import org.cloudburstmc.protocol.bedrock.data.*; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.packet.*; import org.cloudburstmc.protocol.common.util.OptionalBoolean; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemGroup; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemCategory; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.common.DefinitionRegistry; +import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -286,9 +297,20 @@ public class BCPlayer { session.sendPacket(startGamePacket); - // Required to be sent for 1.16.100 + // Previously was able to send empty ItemData array to fulfill this; Game client crashes now + // though if contents/groups are empty. Also tried setting it to lists that have single phony entries... + // Example: + // creativeItemData.add(new CreativeItemData(ItemData.AIR, 0, 0); + // creativeItemGroupData.add(new CreativeItemGroup(CreativeItemCategory.ALL, "", ItemData.AIR)); + // + // ... but no dice (Either crashes client or client shows a 'Server returned broken packet' error) + // , unless I'm missing something + // + // Unless I'm missing something, I'm assuming this version requires the actual parsed creative_items.json + // to be passed-in, will need to figure out parsing the file with the new format. CreativeContentPacket creativeContentPacket = new CreativeContentPacket(); - creativeContentPacket.setContents(new ItemData[0]); + creativeContentPacket.getContents().addAll(BedrockConnect.paletteManager.CREATIVE_ITEM_DATA); + creativeContentPacket.getGroups().addAll(BedrockConnect.paletteManager.CREATIVE_ITEM_GROUPS); session.sendPacket(creativeContentPacket); spawn(); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java index 1304833..3e58f49 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java @@ -46,7 +46,7 @@ public class BedrockConnect { public static int globalPacketLimit = RakConstants.DEFAULT_GLOBAL_PACKET_LIMIT; - public static String release = "1.52"; + public static String release = "1.53"; public static HashMap<String, String> featuredServerIps; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java index 97edf53..a3f4820 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java @@ -24,6 +24,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v712.Bedrock_v712; import org.cloudburstmc.protocol.bedrock.codec.v729.Bedrock_v729; import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748; import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766; +import org.cloudburstmc.protocol.bedrock.codec.v776.Bedrock_v776; import java.util.ArrayList; import java.util.List; @@ -35,8 +36,8 @@ public class BedrockProtocol { /** * Latest available version */ - public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v766.CODEC.toBuilder() - .minecraftVersion("1.21.50") + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v776.CODEC.toBuilder() + .minecraftVersion("1.21.60") .build(); @@ -98,6 +99,9 @@ public class BedrockProtocol { SUPPORTED_BEDROCK_CODECS.add(Bedrock_v748.CODEC.toBuilder() .minecraftVersion("1.21.40 - 1.21.44") .build()); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v766.CODEC.toBuilder() + .minecraftVersion("1.21.50 - 1.21.51") + .build()); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java index fdc5a63..fa4c803 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java @@ -12,6 +12,9 @@ import org.cloudburstmc.nbt.NbtList; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.nbt.NbtUtils; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemGroup; +import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemCategory; import java.io.*; import java.nio.ByteOrder; @@ -62,6 +65,9 @@ public class PaletteManager { public static final List<ItemData> CREATIVE_ITEMS; + public static final List<CreativeItemData> CREATIVE_ITEM_DATA; + public static final List<CreativeItemGroup> CREATIVE_ITEM_GROUPS; + static { /* Load creative items */ InputStream stream = BedrockConnect.class.getClassLoader().getResourceAsStream("tables/creative_items.json"); @@ -74,32 +80,72 @@ public class PaletteManager { } List<ItemData> creativeItems = new ArrayList<>(); + List<CreativeItemData> creativeItemData = new ArrayList<>(); for (JsonNode itemNode : creativeItemEntries) { - short damage = 0; + int damage = 0; + int count = 1; + int groupId = 0; + NbtMap tag = null; + if (itemNode.has("damage")) { - damage = itemNode.get("damage").numberValue().shortValue(); + damage = itemNode.get("damage").asInt(); + } + if (itemNode.has("count")) { + damage = itemNode.get("count").asInt(); + } + if (itemNode.has("groupId")) { + groupId = itemNode.get("groupId").asInt(); } if (itemNode.has("nbt_b64")) { byte[] bytes = Base64.getDecoder().decode(itemNode.get("nbt_b64").asText()); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); try { - NbtMap tag = (NbtMap) NbtUtils.createReaderLE(bais).readTag(); - creativeItems.add(ItemData.builder() - .netId(itemNode.get("id").asInt()) - .damage(damage) - .count(1) - .tag(tag).build()); + tag = (NbtMap) NbtUtils.createReaderLE(bais).readTag(); } catch (IOException e) { e.printStackTrace(); } - } else { - creativeItems.add(ItemData.builder() - .netId(itemNode.get("id").asInt()) - .damage(damage) - .count(1).build()); } + + ItemData item = ItemData.builder() + .netId(itemNode.get("id").asInt()) + .damage(damage) + .count(count) + .tag(tag).build(); + // Change to something like this? + // ItemData.builder() + // .definition(definition) + // .damage(damage) + // .count(count) + // .tag(tag) + // .blockDefinition(blockDefinition); + creativeItems.add(item); + creativeItemData.add(new CreativeItemData(item, item.getNetId(), groupId)); } + CREATIVE_ITEMS = creativeItems; + CREATIVE_ITEM_DATA = creativeItemData; + + InputStream groupStream = BedrockConnect.class.getClassLoader().getResourceAsStream("tables/creative_items.json"); + + JsonNode creativeItemGroupEntries; + try { + creativeItemGroupEntries = JSON_MAPPER.readTree(groupStream).get("groups"); + } catch (Exception e) { + throw new AssertionError("Unable to load creative item groups", e); + } + + List<CreativeItemGroup> creativeItemGroups = new ArrayList<>(); + for (JsonNode creativeItemEntry : creativeItemGroupEntries) { + CreativeItemCategory category = CreativeItemCategory.valueOf(creativeItemEntry.get("category").asText().toUpperCase(Locale.ROOT)); + String name = creativeItemEntry.get("name").asText(); + + JsonNode icon = creativeItemEntry.get("icon"); + String identifier = icon.get("id").asText(); + + creativeItemGroups.add(new CreativeItemGroup(category, name, ItemData.AIR)); + } + + CREATIVE_ITEM_GROUPS = creativeItemGroups; } |
