package org.geysermc.connector.utils; import com.fasterxml.jackson.databind.ObjectMapper; import com.nukkitx.nbt.NbtUtils; import com.nukkitx.nbt.stream.NBTInputStream; import com.nukkitx.nbt.tag.CompoundTag; import com.nukkitx.nbt.tag.ListTag; import com.nukkitx.nbt.tag.Tag; import com.nukkitx.protocol.bedrock.packet.StartGamePacket; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.console.GeyserLogger; import org.geysermc.connector.network.translators.block.BlockEntry; import org.geysermc.connector.network.translators.item.ItemEntry; import java.io.InputStream; import java.util.*; public class Toolbox { public static final Collection ITEMS = new ArrayList<>(); public static ListTag BLOCKS; public static final Int2ObjectMap ITEM_ENTRIES = new Int2ObjectOpenHashMap<>(); public static final Int2ObjectMap BLOCK_ENTRIES = new Int2ObjectOpenHashMap<>(); public static void init() { InputStream stream = GeyserConnector.class.getClassLoader().getResourceAsStream("bedrock/runtime_block_states.dat"); if (stream == null) { throw new AssertionError("Unable to find bedrock/runtime_block_states.dat"); } ListTag blocksTag; NBTInputStream nbtInputStream = NbtUtils.createNetworkReader(stream); try { blocksTag = (ListTag) nbtInputStream.readTag(); nbtInputStream.close(); } catch (Exception ex) { GeyserLogger.DEFAULT.warning("Failed to get blocks from runtime block states, please report this error!"); throw new AssertionError(ex); } BLOCKS = blocksTag; InputStream stream2 = Toolbox.class.getClassLoader().getResourceAsStream("bedrock/items.json"); if (stream2 == null) { throw new AssertionError("Items Table not found"); } ObjectMapper startGameItemMapper = new ObjectMapper(); List startGameItems = new ArrayList<>(); try { startGameItems = startGameItemMapper.readValue(stream2, ArrayList.class); } catch (Exception e) { e.printStackTrace(); } for (Map entry : startGameItems) { ITEMS.add(new StartGamePacket.ItemEntry((String) entry.get("name"), (short) ((int) entry.get("id")))); } InputStream itemStream = Toolbox.class.getClassLoader().getResourceAsStream("mappings/items.json"); ObjectMapper itemMapper = new ObjectMapper(); Map> items = new HashMap<>(); try { items = itemMapper.readValue(itemStream, LinkedHashMap.class); } catch (Exception ex) { ex.printStackTrace(); } int itemIndex = 0; for (Map.Entry> itemEntry : items.entrySet()) { ITEM_ENTRIES.put(itemIndex, new ItemEntry(itemEntry.getKey(), itemIndex, (int) itemEntry.getValue().get("bedrock_id"), (int) itemEntry.getValue().get("bedrock_data"))); itemIndex++; } InputStream blockStream = Toolbox.class.getClassLoader().getResourceAsStream("mappings/blocks.json"); ObjectMapper blockMapper = new ObjectMapper(); Map> blocks = new HashMap<>(); try { blocks = blockMapper.readValue(blockStream, LinkedHashMap.class); } catch (Exception ex) { ex.printStackTrace(); } int javaIndex = -1; javaLoop: for (Map.Entry> javaEntry : blocks.entrySet()) { javaIndex++; String wantedIdentifier = (String) javaEntry.getValue().get("bedrock_identifier"); Map wantedStates = (Map) javaEntry.getValue().get("bedrock_states"); int bedrockIndex = -1; bedrockLoop: for (CompoundTag bedrockEntry : BLOCKS.getValue()) { bedrockIndex++; CompoundTag blockTag = bedrockEntry.getAsCompound("block"); if (blockTag.getAsString("name").equals(wantedIdentifier)) { if (wantedStates != null) { Map> bedrockStates = blockTag.getAsCompound("states").getValue(); for (Map.Entry stateEntry : wantedStates.entrySet()) { Tag bedrockStateTag = bedrockStates.get(stateEntry.getKey()); if (bedrockStateTag == null) continue bedrockLoop; Object bedrockStateValue = bedrockStateTag.getValue(); if (bedrockStateValue instanceof Byte) bedrockStateValue = ((Byte) bedrockStateValue).intValue(); if (!stateEntry.getValue().equals(bedrockStateValue)) continue bedrockLoop; } } BlockEntry blockEntry = new BlockEntry(javaEntry.getKey(), javaIndex, bedrockIndex); BLOCK_ENTRIES.put(javaIndex, blockEntry); continue javaLoop; } } GeyserLogger.DEFAULT.debug("Mapping " + javaEntry.getKey() + " was not found for bedrock edition!"); } } }