From 9d8a2a9680b6f2a3123b93c66691e9e3b15affc8 Mon Sep 17 00:00:00 2001 From: KennyTV <28825609+KennyTV@users.noreply.github.com> Date: Sat, 19 Jan 2019 19:19:24 +0100 Subject: [PATCH] Don't cycle through mappings in every connection handler --- .../AbstractFenceConnectionHandler.java | 23 +- .../AbstractStempConnectionHandler.java | 30 +- .../BasicFenceConnectionHandler.java | 23 +- .../ChestConnectionHandler.java | 25 +- .../ChorusPlantConnectionHandler.java | 28 +- .../blockconnections/ConnectionData.java | 337 +++++++++--------- .../DoorConnectionHandler.java | 43 +-- .../FlowerConnectionHandler.java | 24 +- .../GlassConnectionHandler.java | 47 +-- .../MelonConnectionHandler.java | 8 +- .../NetherFenceConnectionHandler.java | 8 +- .../PumpkinConnectionHandler.java | 8 +- .../RedstoneConnectionHandler.java | 25 +- .../StairConnectionHandler.java | 65 ++-- .../TripwireConnectionHandler.java | 38 +- .../WallConnectionHandler.java | 15 +- .../blockconnections/WrappedBlockData.java | 6 +- 17 files changed, 402 insertions(+), 351 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractFenceConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractFenceConnectionHandler.java index eb034452c..14a172ff7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractFenceConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractFenceConnectionHandler.java @@ -17,18 +17,23 @@ public abstract class AbstractFenceConnectionHandler extends ConnectionHandler { private Map connectedBlockStates = new HashMap<>(); private static final StairConnectionHandler STAIR_CONNECTION_HANDLER = new StairConnectionHandler(); - public AbstractFenceConnectionHandler(String blockConnections, String key) { + public AbstractFenceConnectionHandler(String blockConnections) { this.blockConnections = blockConnections; + } - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - if (key.equals(blockState.getKey().split("\\[")[0])) { - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); - if (blockData.hasData("waterlogged") && blockData.getValue("waterlogged").equals("true")) continue; - blockStates.add(blockState.getValue()); - ConnectionData.connectionHandlerMap.put(blockState.getValue(), this); - connectedBlockStates.put(getStates(blockData), blockState.getValue()); + public ConnectionData.ConnectorInitAction getInitAction(final String key) { + final AbstractFenceConnectionHandler handler = this; + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (key.equals(blockData.getMinecraftKey())) { + if (blockData.hasData("waterlogged") && blockData.getValue("waterlogged").equals("true")) return; + blockStates.add(blockData.getSavedBlockStateId()); + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), handler); + connectedBlockStates.put(getStates(blockData), blockData.getSavedBlockStateId()); + } } - } + }; } protected byte getStates(WrappedBlockData blockData) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractStempConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractStempConnectionHandler.java index efd06e25d..b949f129d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractStempConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/AbstractStempConnectionHandler.java @@ -17,23 +17,27 @@ public class AbstractStempConnectionHandler extends ConnectionHandler { private Map stemps = new HashMap<>(); - public AbstractStempConnectionHandler(String baseStateId, String blockId, String toKey) { + public AbstractStempConnectionHandler(String baseStateId) { this.baseStateId = ConnectionData.getId(baseStateId); + } - for (Map.Entry entry : ConnectionData.keyToId.entrySet()) { - String key = entry.getKey().split("\\[")[0]; - if (entry.getValue() == this.baseStateId || blockId.equals(key)) { - if (entry.getValue() != this.baseStateId) { - this.blockId.add(entry.getValue()); + public ConnectionData.ConnectorInitAction getInitAction(final String blockId, final String toKey) { + final AbstractStempConnectionHandler handler = this; + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (blockData.getSavedBlockStateId() == baseStateId || blockId.equals(blockData.getMinecraftKey())) { + if (blockData.getSavedBlockStateId() != baseStateId) { + handler.blockId.add(blockData.getSavedBlockStateId()); + } + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), handler); + } + if (blockData.getMinecraftKey().equals(toKey)) { + String facing = blockData.getValue("facing").toUpperCase(); + stemps.put(BlockFace.valueOf(facing), blockData.getSavedBlockStateId()); } - ConnectionData.connectionHandlerMap.put(entry.getValue(), this); } - if (key.equals(toKey)) { - WrappedBlockData data = WrappedBlockData.fromString(entry.getKey()); - String facing = data.getValue("facing").toUpperCase(); - stemps.put(BlockFace.valueOf(facing), entry.getValue()); - } - } + }; } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/BasicFenceConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/BasicFenceConnectionHandler.java index 5fcf32d77..5f38bc25b 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/BasicFenceConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/BasicFenceConnectionHandler.java @@ -1,17 +1,22 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; +import java.util.ArrayList; +import java.util.List; + public class BasicFenceConnectionHandler extends AbstractFenceConnectionHandler { - static void init() { - new BasicFenceConnectionHandler("fenceConnections", "minecraft:oak_fence"); - new BasicFenceConnectionHandler("fenceConnections", "minecraft:birch_fence"); - new BasicFenceConnectionHandler("fenceConnections", "minecraft:jungle_fence"); - new BasicFenceConnectionHandler("fenceConnections", "minecraft:dark_oak_fence"); - new BasicFenceConnectionHandler("fenceConnections", "minecraft:acacia_fence"); - new BasicFenceConnectionHandler("fenceConnections", "minecraft:spruce_fence"); + static List init() { + List actions = new ArrayList<>(); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:oak_fence")); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:birch_fence")); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:jungle_fence")); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:dark_oak_fence")); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:acacia_fence")); + actions.add(new BasicFenceConnectionHandler("fenceConnections").getInitAction("minecraft:spruce_fence")); + return actions; } - public BasicFenceConnectionHandler(String blockConnections, String key) { - super(blockConnections, key); + public BasicFenceConnectionHandler(String blockConnections) { + super(blockConnections); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChestConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChestConnectionHandler.java index a3f9739bc..2cab89b9d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChestConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChestConnectionHandler.java @@ -14,18 +14,19 @@ class ChestConnectionHandler extends ConnectionHandler { private static Map connectedStates = new HashMap<>(); private static Set trappedChests = new HashSet<>(); - static void init() { - ChestConnectionHandler connectionHandler = new ChestConnectionHandler(); - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - String key = blockState.getKey().split("\\[")[0]; - if (!key.equals("minecraft:chest") && !key.equals("minecraft:trapped_chest")) continue; - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); - if (blockData.getValue("waterlogged").equals("true")) continue; - chestFacings.put(blockState.getValue(), BlockFace.valueOf(blockData.getValue("facing").toUpperCase())); - if (key.equalsIgnoreCase("minecraft:trapped_chest")) trappedChests.add(blockState.getValue()); - connectedStates.put(getStates(blockData), blockState.getValue()); - ConnectionData.connectionHandlerMap.put(blockState.getValue(), connectionHandler); - } + static ConnectionData.ConnectorInitAction init() { + final ChestConnectionHandler connectionHandler = new ChestConnectionHandler(); + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (!blockData.getMinecraftKey().equals("minecraft:chest") && !blockData.getMinecraftKey().equals("minecraft:trapped_chest")) return; + if (blockData.getValue("waterlogged").equals("true")) return; + chestFacings.put(blockData.getSavedBlockStateId(), BlockFace.valueOf(blockData.getValue("facing").toUpperCase())); + if (blockData.getMinecraftKey().equalsIgnoreCase("minecraft:trapped_chest")) trappedChests.add(blockData.getSavedBlockStateId()); + connectedStates.put(getStates(blockData), blockData.getSavedBlockStateId()); + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), connectionHandler); + } + }; } private static Byte getStates(WrappedBlockData blockData) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChorusPlantConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChorusPlantConnectionHandler.java index 9b726a294..72d7c0a94 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChorusPlantConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ChorusPlantConnectionHandler.java @@ -4,23 +4,35 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.BlockFace; import us.myles.ViaVersion.api.minecraft.Position; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class ChorusPlantConnectionHandler extends AbstractFenceConnectionHandler { private int endstone; - static void init() { - new ChorusPlantConnectionHandler("minecraft:chorus_plant"); + static List init() { + List actions = new ArrayList<>(2); + ChorusPlantConnectionHandler handler = new ChorusPlantConnectionHandler(); + actions.add(handler.getInitAction("minecraft:chorus_plant")); + actions.add(handler.getExtraAction()); + return actions; } - public ChorusPlantConnectionHandler(String key) { - super(null, key); + public ChorusPlantConnectionHandler() { + super(null); endstone = ConnectionData.getId("minecraft:end_stone"); - for (Map.Entry entry : ConnectionData.keyToId.entrySet()) { - if (entry.getKey().split("\\[")[0].equals("minecraft:chorus_flower")) { - getBlockStates().add(entry.getValue()); + } + + public ConnectionData.ConnectorInitAction getExtraAction() { + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (blockData.getMinecraftKey().equals("minecraft:chorus_flower")) { + getBlockStates().add(blockData.getSavedBlockStateId()); + } } - } + }; } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java index ef39faec2..a457313ee 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/ConnectionData.java @@ -16,195 +16,204 @@ import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.provi import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections.providers.PacketBlockConnectionProvider; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.data.MappingData; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; public class ConnectionData { - static Map idToKey = new HashMap<>(); - static Map keyToId = new HashMap<>(); - static Map connectionHandlerMap = new HashMap<>(); - static Map blockConnectionData = new HashMap<>(); - static Set occludingStates = new HashSet<>(); + static Map idToKey = new HashMap<>(); + static Map keyToId = new HashMap<>(); + static Map connectionHandlerMap = new HashMap<>(); + static Map blockConnectionData = new HashMap<>(); + static Set occludingStates = new HashSet<>(); - public static void update(UserConnection user, Position position) { - for (int x = -1; x <= 1; x++) { - for (int z = -1; z <= 1; z++) { - for (int y = -1; y <= 1; y++) { - if (Math.abs(x) + Math.abs(y) + Math.abs(z) != 1) continue; - Position pos = new Position(position.getX() + x, position.getY() + y, position.getZ() + z); - int blockState = Via.getManager().getProviders().get(BlockConnectionProvider.class).getBlockdata(user, pos); - if (!connects(blockState)) continue; - int newBlockState = connect(user, pos, blockState); - if (newBlockState == blockState) continue; + public static void update(UserConnection user, Position position) { + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + for (int y = -1; y <= 1; y++) { + if (Math.abs(x) + Math.abs(y) + Math.abs(z) != 1) continue; + Position pos = new Position(position.getX() + x, position.getY() + y, position.getZ() + z); + int blockState = Via.getManager().getProviders().get(BlockConnectionProvider.class).getBlockdata(user, pos); + if (!connects(blockState)) continue; + int newBlockState = connect(user, pos, blockState); + if (newBlockState == blockState) continue; - PacketWrapper blockUpdatePacket = new PacketWrapper(0x0B, null, user); - blockUpdatePacket.write(Type.POSITION, pos); - blockUpdatePacket.write(Type.VAR_INT, newBlockState); - try { - blockUpdatePacket.send(Protocol1_13To1_12_2.class, true, false); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - } - } - } + PacketWrapper blockUpdatePacket = new PacketWrapper(0x0B, null, user); + blockUpdatePacket.write(Type.POSITION, pos); + blockUpdatePacket.write(Type.VAR_INT, newBlockState); + try { + blockUpdatePacket.send(Protocol1_13To1_12_2.class, true, false); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + } - public static BlockConnectionProvider getProvider() { - return Via.getManager().getProviders().get(BlockConnectionProvider.class); - } + public static BlockConnectionProvider getProvider() { + return Via.getManager().getProviders().get(BlockConnectionProvider.class); + } - public static void updateBlockStorage(UserConnection userConnection, Position position, int blockState) { - if (!needStoreBlocks()) return; - if (ConnectionData.isWelcome(blockState)) { - ConnectionData.getProvider().storeBlock(userConnection, position, blockState); - } else { - ConnectionData.getProvider().removeBlock(userConnection, position); - } - } + public static void updateBlockStorage(UserConnection userConnection, Position position, int blockState) { + if (!needStoreBlocks()) return; + if (ConnectionData.isWelcome(blockState)) { + ConnectionData.getProvider().storeBlock(userConnection, position, blockState); + } else { + ConnectionData.getProvider().removeBlock(userConnection, position); + } + } - public static void clearBlockStorage(UserConnection connection) { - if (!needStoreBlocks()) return; - getProvider().clearStorage(connection); - } + public static void clearBlockStorage(UserConnection connection) { + if (!needStoreBlocks()) return; + getProvider().clearStorage(connection); + } - public static boolean needStoreBlocks() { - return getProvider().storesBlocks(); - } + public static boolean needStoreBlocks() { + return getProvider().storesBlocks(); + } - public static void connectBlocks(UserConnection user, Chunk chunk) { - long xOff = chunk.getX() << 4; - long zOff = chunk.getZ() << 4; + public static void connectBlocks(UserConnection user, Chunk chunk) { + long xOff = chunk.getX() << 4; + long zOff = chunk.getZ() << 4; - for (int i = 0; i < chunk.getSections().length; i++) { - ChunkSection section = chunk.getSections()[i]; - if (section == null) continue; + for (int i = 0; i < chunk.getSections().length; i++) { + ChunkSection section = chunk.getSections()[i]; + if (section == null) continue; - boolean willConnect = false; + boolean willConnect = false; - for (int p = 0; p < section.getPaletteSize(); p++) { - int id = section.getPaletteEntry(p); - if (ConnectionData.connects(id)) { - willConnect = true; - break; - } - } - if (!willConnect) continue; + for (int p = 0; p < section.getPaletteSize(); p++) { + int id = section.getPaletteEntry(p); + if (ConnectionData.connects(id)) { + willConnect = true; + break; + } + } + if (!willConnect) continue; - long yOff = i << 4; + long yOff = i << 4; - for (int x = 0; x < 16; x++) { - for (int y = 0; y < 16; y++) { - for (int z = 0; z < 16; z++) { - int block = section.getFlatBlock(x, y, z); + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for (int z = 0; z < 16; z++) { + int block = section.getFlatBlock(x, y, z); - if (ConnectionData.connects(block)) { - block = ConnectionData.connect(user, new Position(xOff + x, yOff + y, zOff + z), block); - section.setFlatBlock(x, y, z, block); - } + if (ConnectionData.connects(block)) { + block = ConnectionData.connect(user, new Position(xOff + x, yOff + y, zOff + z), block); + section.setFlatBlock(x, y, z, block); + } - if (x == 0) { - update(user, new Position(xOff - 1, yOff + y, zOff + z)); - } else if (x == 15) { - update(user, new Position(xOff + 16, yOff + y, zOff + z)); - } - if (z == 0) { - update(user, new Position(xOff + x, yOff + y, zOff - 1)); - } else if (z == 15) { - update(user, new Position(xOff + x, yOff + y, zOff + 16)); - } - } - } - } - } - } + if (x == 0) { + update(user, new Position(xOff - 1, yOff + y, zOff + z)); + } else if (x == 15) { + update(user, new Position(xOff + 16, yOff + y, zOff + z)); + } + if (z == 0) { + update(user, new Position(xOff + x, yOff + y, zOff - 1)); + } else if (z == 15) { + update(user, new Position(xOff + x, yOff + y, zOff + 16)); + } + } + } + } + } + } - public static void init() { - if (!Via.getConfig().isServersideBlockConnections()) return; - Via.getPlatform().getLogger().info("Loading block connection mappings ..."); - JsonObject mapping1_13 = MappingData.loadData("mapping-1.13.json"); - JsonObject blocks1_13 = mapping1_13.getAsJsonObject("blocks"); - for (Entry blockState : blocks1_13.entrySet()) { - Integer id = Integer.parseInt(blockState.getKey()); - String key = blockState.getValue().getAsString(); - idToKey.put(id, key); - keyToId.put(key, id); - } + public static void init() { + if (!Via.getConfig().isServersideBlockConnections()) return; + Via.getPlatform().getLogger().info("Loading block connection mappings ..."); + JsonObject mapping1_13 = MappingData.loadData("mapping-1.13.json"); + JsonObject blocks1_13 = mapping1_13.getAsJsonObject("blocks"); + for (Entry blockState : blocks1_13.entrySet()) { + Integer id = Integer.parseInt(blockState.getKey()); + String key = blockState.getValue().getAsString(); + idToKey.put(id, key); + keyToId.put(key, id); + } - if (!Via.getConfig().isReduceBlockStorageMemory()) { - JsonObject mappingBlockConnections = MappingData.loadData("blockConnections.json"); - for (Entry entry : mappingBlockConnections.entrySet()) { - int id = keyToId.get(entry.getKey()); - BlockData blockData = new BlockData(); - for (Entry type : entry.getValue().getAsJsonObject().entrySet()) { - String name = type.getKey(); - JsonObject object = type.getValue().getAsJsonObject(); - Boolean[] data = new Boolean[6]; - for (BlockFace value : BlockFace.values()) { - String face = value.toString().toLowerCase(); - if (object.has(face)) { - data[value.ordinal()] = object.getAsJsonPrimitive(face).getAsBoolean(); - } else { - data[value.ordinal()] = false; - } - } - blockData.put(name, data); - } - blockConnectionData.put(id, blockData); - } - } + if (!Via.getConfig().isReduceBlockStorageMemory()) { + JsonObject mappingBlockConnections = MappingData.loadData("blockConnections.json"); + for (Entry entry : mappingBlockConnections.entrySet()) { + int id = keyToId.get(entry.getKey()); + BlockData blockData = new BlockData(); + for (Entry type : entry.getValue().getAsJsonObject().entrySet()) { + String name = type.getKey(); + JsonObject object = type.getValue().getAsJsonObject(); + Boolean[] data = new Boolean[6]; + for (BlockFace value : BlockFace.values()) { + String face = value.toString().toLowerCase(); + if (object.has(face)) { + data[value.ordinal()] = object.getAsJsonPrimitive(face).getAsBoolean(); + } else { + data[value.ordinal()] = false; + } + } + blockData.put(name, data); + } + blockConnectionData.put(id, blockData); + } + } - JsonObject blockData = MappingData.loadData("blockData.json"); - JsonArray occluding = blockData.getAsJsonArray("occluding"); - for (JsonElement jsonElement : occluding) { - occludingStates.add(keyToId.get(jsonElement.getAsString())); - } + JsonObject blockData = MappingData.loadData("blockData.json"); + JsonArray occluding = blockData.getAsJsonArray("occluding"); + for (JsonElement jsonElement : occluding) { + occludingStates.add(keyToId.get(jsonElement.getAsString())); + } - PumpkinConnectionHandler.init(); - MelonConnectionHandler.init(); - BasicFenceConnectionHandler.init(); - NetherFenceConnectionHandler.init(); - WallConnectionHandler.init(); - MelonConnectionHandler.init(); - GlassConnectionHandler.init(); - ChestConnectionHandler.init(); - DoorConnectionHandler.init(); - RedstoneConnectionHandler.init(); - StairConnectionHandler.init(); - FlowerConnectionHandler.init(); - ChorusPlantConnectionHandler.init(); - TripwireConnectionHandler.init(); + List initActions = new ArrayList<>(); + initActions.add(PumpkinConnectionHandler.init()); + initActions.add(MelonConnectionHandler.init()); + initActions.addAll(BasicFenceConnectionHandler.init()); + initActions.add(NetherFenceConnectionHandler.init()); + initActions.addAll(WallConnectionHandler.init()); + initActions.add(MelonConnectionHandler.init()); + initActions.addAll(GlassConnectionHandler.init()); + initActions.add(ChestConnectionHandler.init()); + initActions.add(DoorConnectionHandler.init()); + initActions.add(RedstoneConnectionHandler.init()); + initActions.add(StairConnectionHandler.init()); + initActions.add(FlowerConnectionHandler.init()); + initActions.addAll(ChorusPlantConnectionHandler.init()); + initActions.add(TripwireConnectionHandler.init()); + for (Entry entry : keyToId.entrySet()) { + WrappedBlockData wrappedBlockData = WrappedBlockData.fromString(entry.getKey()); + for (ConnectorInitAction action : initActions) { + action.check(wrappedBlockData); + } + } - if (Via.getConfig().getBlockConnectionMethod().equalsIgnoreCase("packet")) { - Via.getManager().getProviders().register(BlockConnectionProvider.class, new PacketBlockConnectionProvider()); - } - } + if (Via.getConfig().getBlockConnectionMethod().equalsIgnoreCase("packet")) { + Via.getManager().getProviders().register(BlockConnectionProvider.class, new PacketBlockConnectionProvider()); + } + } - public static boolean isWelcome(int blockState) { - return blockConnectionData.containsKey(blockState) || connectionHandlerMap.containsKey(blockState); - } + public static boolean isWelcome(int blockState) { + return blockConnectionData.containsKey(blockState) || connectionHandlerMap.containsKey(blockState); + } - public static boolean connects(int blockState) { - return connectionHandlerMap.containsKey(blockState); - } + public static boolean connects(int blockState) { + return connectionHandlerMap.containsKey(blockState); + } - public static int connect(UserConnection user, Position position, int blockState) { - if (connectionHandlerMap.containsKey(blockState)) { - ConnectionHandler handler = connectionHandlerMap.get(blockState); - return handler.connect(user, position, blockState); - } else { - return blockState; - } - } + public static int connect(UserConnection user, Position position, int blockState) { + if (connectionHandlerMap.containsKey(blockState)) { + ConnectionHandler handler = connectionHandlerMap.get(blockState); + return handler.connect(user, position, blockState); + } else { + return blockState; + } + } - public static int getId(String key) { - return keyToId.containsKey(key) ? keyToId.get(key) : -1; - } + public static int getId(String key) { + return keyToId.containsKey(key) ? keyToId.get(key) : -1; + } - public static String getKey(int id) { - return idToKey.get(id); - } + public static String getKey(int id) { + return idToKey.get(id); + } + + interface ConnectorInitAction { + + void check(WrappedBlockData blockData); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/DoorConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/DoorConnectionHandler.java index ddb829f6f..655a008b7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/DoorConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/DoorConnectionHandler.java @@ -16,8 +16,8 @@ public class DoorConnectionHandler extends ConnectionHandler { private static Map doorDataMap = new HashMap<>(); private static Map connectedStates = new HashMap<>(); - static void init() { - List baseDoors = new LinkedList<>(); + static ConnectionData.ConnectorInitAction init() { + final List baseDoors = new LinkedList<>(); baseDoors.add("minecraft:oak_door"); baseDoors.add("minecraft:birch_door"); baseDoors.add("minecraft:jungle_door"); @@ -26,30 +26,31 @@ public class DoorConnectionHandler extends ConnectionHandler { baseDoors.add("minecraft:spruce_door"); baseDoors.add("minecraft:iron_door"); - DoorConnectionHandler connectionHandler = new DoorConnectionHandler(); - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - String key = blockState.getKey().split("\\[")[0]; - int type = baseDoors.indexOf(key); - if (type == -1) continue; + final DoorConnectionHandler connectionHandler = new DoorConnectionHandler(); + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + int type = baseDoors.indexOf(blockData.getMinecraftKey()); + if (type == -1) return; - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); - int id = blockState.getValue(); + int id = blockData.getSavedBlockStateId(); - DoorData doorData = new DoorData( - blockData.getValue("half").equals("lower"), - blockData.getValue("hinge").equals("right"), - blockData.getValue("powered").equals("true"), - blockData.getValue("open").equals("true"), - BlockFace.valueOf(blockData.getValue("facing").toUpperCase()), - type - ); + DoorData doorData = new DoorData( + blockData.getValue("half").equals("lower"), + blockData.getValue("hinge").equals("right"), + blockData.getValue("powered").equals("true"), + blockData.getValue("open").equals("true"), + BlockFace.valueOf(blockData.getValue("facing").toUpperCase()), + type + ); - doorDataMap.put(id, doorData); + doorDataMap.put(id, doorData); - connectedStates.put(getStates(doorData), id); + connectedStates.put(getStates(doorData), id); - ConnectionData.connectionHandlerMap.put(id, connectionHandler); - } + ConnectionData.connectionHandlerMap.put(id, connectionHandler); + } + }; } private static short getStates(DoorData doorData) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java index 946a9ffc2..b35992dca 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FlowerConnectionHandler.java @@ -14,8 +14,8 @@ import java.util.Set; public class FlowerConnectionHandler extends ConnectionHandler { private static Map flowers = new HashMap<>(); - static void init() { - Set baseFlower = new HashSet<>(); + static ConnectionData.ConnectorInitAction init() { + final Set baseFlower = new HashSet<>(); baseFlower.add("minecraft:rose_bush"); baseFlower.add("minecraft:sunflower"); baseFlower.add("minecraft:peony"); @@ -23,17 +23,19 @@ public class FlowerConnectionHandler extends ConnectionHandler { baseFlower.add("minecraft:large_fern"); baseFlower.add("minecraft:lilac"); - FlowerConnectionHandler handler = new FlowerConnectionHandler(); - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - WrappedBlockData data = WrappedBlockData.fromString(blockState.getKey()); - if (baseFlower.contains(data.getMinecraftKey())) { - ConnectionData.connectionHandlerMap.put(blockState.getValue(), handler); - if (data.getValue("half").equals("lower")) { - data.set("half", "upper"); - flowers.put(blockState.getValue(), data.getBlockStateId()); + final FlowerConnectionHandler handler = new FlowerConnectionHandler(); + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (baseFlower.contains(blockData.getMinecraftKey())) { + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), handler); + if (blockData.getValue("half").equals("lower")) { + blockData.set("half", "upper"); + flowers.put(blockData.getSavedBlockStateId(), blockData.getBlockStateId()); + } } } - } + }; } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/GlassConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/GlassConnectionHandler.java index e014fc4d5..77e4b9817 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/GlassConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/GlassConnectionHandler.java @@ -4,31 +4,36 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.Position; import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import java.util.ArrayList; +import java.util.List; + public class GlassConnectionHandler extends AbstractFenceConnectionHandler { - static void init() { - new GlassConnectionHandler("paneConnections", "minecraft:white_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:orange_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:magenta_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:light_blue_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:yellow_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:lime_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:pink_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:gray_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:light_gray_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:cyan_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:purple_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:blue_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:brown_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:green_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:red_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:black_stained_glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:glass_pane"); - new GlassConnectionHandler("paneConnections", "minecraft:iron_bars"); + static List init() { + List actions = new ArrayList<>(18); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:white_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:orange_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:magenta_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:light_blue_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:yellow_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:lime_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:pink_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:gray_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:light_gray_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:cyan_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:purple_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:blue_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:brown_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:green_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:red_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:black_stained_glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:glass_pane")); + actions.add(new GlassConnectionHandler("paneConnections").getInitAction("minecraft:iron_bars")); + return actions; } - public GlassConnectionHandler(String blockConnections, String key) { - super(blockConnections, key); + public GlassConnectionHandler(String blockConnections) { + super(blockConnections); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/MelonConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/MelonConnectionHandler.java index c800832a9..9f8339ec7 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/MelonConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/MelonConnectionHandler.java @@ -2,11 +2,11 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; public class MelonConnectionHandler extends AbstractStempConnectionHandler { - public MelonConnectionHandler(String baseStateId, String blockId, String toKey) { - super(baseStateId, blockId, toKey); + public MelonConnectionHandler(String baseStateId) { + super(baseStateId); } - static void init() { - new MelonConnectionHandler("minecraft:melon_stem[age=7]", "minecraft:melon", "minecraft:attached_melon_stem"); + static ConnectionData.ConnectorInitAction init() { + return new MelonConnectionHandler("minecraft:melon_stem[age=7]").getInitAction("minecraft:melon", "minecraft:attached_melon_stem"); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/NetherFenceConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/NetherFenceConnectionHandler.java index ee300ebe1..b021999d9 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/NetherFenceConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/NetherFenceConnectionHandler.java @@ -2,11 +2,11 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; public class NetherFenceConnectionHandler extends AbstractFenceConnectionHandler { - static void init() { - new NetherFenceConnectionHandler("netherFenceConnections", "minecraft:nether_brick_fence"); + static ConnectionData.ConnectorInitAction init() { + return new NetherFenceConnectionHandler("netherFenceConnections").getInitAction("minecraft:nether_brick_fence"); } - public NetherFenceConnectionHandler(String blockConnections, String key) { - super(blockConnections, key); + public NetherFenceConnectionHandler(String blockConnections) { + super(blockConnections); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/PumpkinConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/PumpkinConnectionHandler.java index 3e88edca2..24b819ca8 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/PumpkinConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/PumpkinConnectionHandler.java @@ -2,11 +2,11 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; public class PumpkinConnectionHandler extends AbstractStempConnectionHandler { - static void init() { - new PumpkinConnectionHandler("minecraft:pumpkin_stem[age=7]", "minecraft:carved_pumpkin", "minecraft:attached_pumpkin_stem"); + static ConnectionData.ConnectorInitAction init() { + return new PumpkinConnectionHandler("minecraft:pumpkin_stem[age=7]").getInitAction("minecraft:carved_pumpkin", "minecraft:attached_pumpkin_stem"); } - public PumpkinConnectionHandler(String baseStateId, String blockId, String toKey) { - super(baseStateId, blockId, toKey); + public PumpkinConnectionHandler(String baseStateId) { + super(baseStateId); } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java index 90948e1e9..4c8f74d97 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/RedstoneConnectionHandler.java @@ -14,18 +14,19 @@ public class RedstoneConnectionHandler extends ConnectionHandler { private static Map connectedBlockStates = new HashMap<>(); private static Map powerMappings = new HashMap<>(); - static void init() { - RedstoneConnectionHandler connectionHandler = new RedstoneConnectionHandler(); - String redstoneKey = "minecraft:redstone_wire"; - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - String key = blockState.getKey().split("\\[")[0]; - if (!redstoneKey.equals(key)) continue; - redstone.add(blockState.getValue()); - ConnectionData.connectionHandlerMap.put(blockState.getValue(), connectionHandler); - WrappedBlockData blockData = WrappedBlockData.fromStateId(blockState.getValue()); - connectedBlockStates.put(getStates(blockData), blockData.getBlockStateId()); - powerMappings.put(blockData.getBlockStateId(), Integer.valueOf(blockData.getValue("power"))); - } + static ConnectionData.ConnectorInitAction init() { + final RedstoneConnectionHandler connectionHandler = new RedstoneConnectionHandler(); + final String redstoneKey = "minecraft:redstone_wire"; + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (!redstoneKey.equals(blockData.getMinecraftKey())) return; + redstone.add(blockData.getSavedBlockStateId()); + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), connectionHandler); + connectedBlockStates.put(getStates(blockData), blockData.getSavedBlockStateId()); + powerMappings.put(blockData.getSavedBlockStateId(), Integer.valueOf(blockData.getValue("power"))); + } + }; } private static short getStates(WrappedBlockData data) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/StairConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/StairConnectionHandler.java index 7875e6831..dbe832671 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/StairConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/StairConnectionHandler.java @@ -16,8 +16,8 @@ public class StairConnectionHandler extends ConnectionHandler { private static Map stairDataMap = new HashMap<>(); private static Map connectedBlocks = new HashMap<>(); - static void init() { - List baseStairs = new LinkedList<>(); + static ConnectionData.ConnectorInitAction init() { + final List baseStairs = new LinkedList<>(); baseStairs.add("minecraft:oak_stairs"); baseStairs.add("minecraft:cobblestone_stairs"); baseStairs.add("minecraft:brick_stairs"); @@ -36,36 +36,37 @@ public class StairConnectionHandler extends ConnectionHandler { baseStairs.add("minecraft:prismarine_brick_stairs"); baseStairs.add("minecraft:dark_prismarine_stairs"); - StairConnectionHandler connectionHandler = new StairConnectionHandler(); - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - String key = blockState.getKey().split("\\[")[0]; - int type = baseStairs.indexOf(key); - if (type == -1) continue; + final StairConnectionHandler connectionHandler = new StairConnectionHandler(); + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + int type = baseStairs.indexOf(blockData.getMinecraftKey()); + if (type == -1) return; - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); - if (blockData.getValue("waterlogged").equals("true")) continue; + if (blockData.getValue("waterlogged").equals("true")) return; - byte shape; - switch (blockData.getValue("shape")) { - case "straight": shape = 0; break; - case "inner_left": shape = 1; break; - case "inner_right": shape = 2; break; - case "outer_left": shape = 3; break; - case "outer_right": shape = 4; break; - default: continue; + byte shape; + switch (blockData.getValue("shape")) { + case "straight": shape = 0; break; + case "inner_left": shape = 1; break; + case "inner_right": shape = 2; break; + case "outer_left": shape = 3; break; + case "outer_right": shape = 4; break; + default: return; + } + + StairData stairData = new StairData( + blockData.getValue("half").equals("bottom"), + shape, (byte) type, + BlockFace.valueOf(blockData.getValue("facing").toUpperCase()) + ); + + stairDataMap.put(blockData.getSavedBlockStateId(), stairData); + connectedBlocks.put(getStates(stairData), blockData.getSavedBlockStateId()); + + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), connectionHandler); } - - StairData stairData = new StairData( - blockData.getValue("half").equals("bottom"), - shape, (byte) type, - BlockFace.valueOf(blockData.getValue("facing").toUpperCase()) - ); - - stairDataMap.put(blockState.getValue(), stairData); - connectedBlocks.put(getStates(stairData), blockState.getValue()); - - ConnectionData.connectionHandlerMap.put(blockState.getValue(), connectionHandler); - } + }; } private static short getStates(StairData stairData) { @@ -98,15 +99,15 @@ public class StairConnectionHandler extends ConnectionHandler { StairData relativeStair = stairDataMap.get(getBlockData(user, position.getRelative(facing))); if (relativeStair != null && relativeStair.isBottom() == stair.isBottom()) { BlockFace facing2 = relativeStair.getFacing(); - if (facing.getAxis() != facing2.getAxis() && checkOpposite(user, stair, position, facing2.opposite())){ + if (facing.getAxis() != facing2.getAxis() && checkOpposite(user, stair, position, facing2.opposite())) { return facing2 == rotateAntiClockwise(facing) ? 3 : 4; // outer_left : outer_right } } relativeStair = stairDataMap.get(getBlockData(user, position.getRelative(facing.opposite()))); - if(relativeStair != null && relativeStair.isBottom() == stair.isBottom()) { + if (relativeStair != null && relativeStair.isBottom() == stair.isBottom()) { BlockFace facing2 = relativeStair.getFacing(); - if (facing.getAxis() != facing2.getAxis() && checkOpposite(user, stair, position, facing2)){ + if (facing.getAxis() != facing2.getAxis() && checkOpposite(user, stair, position, facing2)) { return facing2 == rotateAntiClockwise(facing) ? 1 : 2; // inner_left : inner_right } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/TripwireConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/TripwireConnectionHandler.java index 651cec4c1..ac5cb83e3 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/TripwireConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/TripwireConnectionHandler.java @@ -15,29 +15,27 @@ public class TripwireConnectionHandler extends ConnectionHandler { private static Map connectedBlocks = new HashMap<>(); private static Map tripwireHooks = new HashMap<>(); - static void init() { - TripwireConnectionHandler connectionHandler = new TripwireConnectionHandler(); - for (Map.Entry blockState : ConnectionData.keyToId.entrySet()) { - String key = blockState.getKey().split("\\[")[0]; + static ConnectionData.ConnectorInitAction init() { + final TripwireConnectionHandler connectionHandler = new TripwireConnectionHandler(); + return new ConnectionData.ConnectorInitAction() { + @Override + public void check(WrappedBlockData blockData) { + if (blockData.getMinecraftKey().equals("minecraft:tripwire_hook")) { + tripwireHooks.put(blockData.getSavedBlockStateId(), BlockFace.valueOf(blockData.getValue("facing").toUpperCase())); + } else if (blockData.getMinecraftKey().equals("minecraft:tripwire")) { + TripwireData tripwireData = new TripwireData( + blockData.getValue("attached").equals("true"), + blockData.getValue("disarmed").equals("true"), + blockData.getValue("powered").equals("true") + ); - if (key.equals("minecraft:tripwire_hook")) { - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); - tripwireHooks.put(blockState.getValue(), BlockFace.valueOf(blockData.getValue("facing").toUpperCase())); - } else if (key.equals("minecraft:tripwire")) { - WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); + tripwireDataMap.put(blockData.getSavedBlockStateId(), tripwireData); + connectedBlocks.put(getStates(blockData), blockData.getSavedBlockStateId()); - TripwireData tripwireData = new TripwireData( - blockData.getValue("attached").equals("true"), - blockData.getValue("disarmed").equals("true"), - blockData.getValue("powered").equals("true") - ); - - tripwireDataMap.put(blockState.getValue(), tripwireData); - connectedBlocks.put(getStates(blockData), blockState.getValue()); - - ConnectionData.connectionHandlerMap.put(blockState.getValue(), connectionHandler); + ConnectionData.connectionHandlerMap.put(blockData.getSavedBlockStateId(), connectionHandler); + } } - } + }; } private static byte getStates(WrappedBlockData blockData) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WallConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WallConnectionHandler.java index a31b79686..8acf6a875 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WallConnectionHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WallConnectionHandler.java @@ -4,18 +4,23 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.minecraft.BlockFace; import us.myles.ViaVersion.api.minecraft.Position; +import java.util.ArrayList; +import java.util.List; + public class WallConnectionHandler extends AbstractFenceConnectionHandler { private static final BlockFace[] BLOCK_FACES = {BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST}; private static final int[] OPPOSITES = {3, 2, 1, 0}; - static void init() { - new WallConnectionHandler("cobbleWallConnections", "minecraft:cobblestone_wall"); - new WallConnectionHandler("cobbleWallConnections", "minecraft:mossy_cobblestone_wall"); + static List init() { + List actions = new ArrayList<>(2); + actions.add(new WallConnectionHandler("cobbleWallConnections").getInitAction("minecraft:cobblestone_wall")); + actions.add(new WallConnectionHandler("cobbleWallConnections").getInitAction("minecraft:mossy_cobblestone_wall")); + return actions; } - public WallConnectionHandler(String blockConnections, String key) { - super(blockConnections, key); + public WallConnectionHandler(String blockConnections) { + super(blockConnections); } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WrappedBlockData.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WrappedBlockData.java index 04c2a7ed1..3fe5074c0 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WrappedBlockData.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/WrappedBlockData.java @@ -9,6 +9,8 @@ import java.util.Map.Entry; public class WrappedBlockData { @Getter private String minecraftKey; + @Getter + private int savedBlockStateId; private LinkedHashMap blockData = new LinkedHashMap<>(); public static WrappedBlockData fromString(String s) { @@ -36,8 +38,8 @@ public class WrappedBlockData { return fromString("minecraft:air"); } - private WrappedBlockData(String key) { - minecraftKey = key; + private WrappedBlockData(String minecraftKey) { + this.minecraftKey = minecraftKey; } public String toString() {