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 c21a9a6ca..54932df94 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 @@ -249,6 +249,7 @@ public class ConnectionData { initActions.addAll(ChorusPlantConnectionHandler.init()); initActions.add(TripwireConnectionHandler.init()); initActions.add(SnowyGrassConnectionHandler.init()); + initActions.add(FireConnectionHandler.init()); if (Via.getConfig().isVineClimbFix()) { initActions.add(VineConnectionHandler.init()); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FireConnectionHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FireConnectionHandler.java new file mode 100644 index 000000000..e3ddc50bc --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/blockconnections/FireConnectionHandler.java @@ -0,0 +1,71 @@ +package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.blockconnections; + +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.BlockFace; +import us.myles.ViaVersion.api.minecraft.Position; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class FireConnectionHandler extends ConnectionHandler { + private static final String[] WOOD_TYPES = {"oak", "spruce", "birch", "jungle", "acacia", "dark_oak"}; + private static final Map connectedBlocks = new HashMap<>(); + private static final Set flammableBlocks = new HashSet<>(); + + private static void addWoodTypes(Set set, String suffix) { + for (String woodType : WOOD_TYPES) { + set.add("minecraft:" + woodType + suffix); + } + } + + static ConnectionData.ConnectorInitAction init() { + Set flammabeIds = new HashSet<>(); + flammabeIds.add("minecraft:tnt"); + flammabeIds.add("minecraft:vine"); + flammabeIds.add("minecraft:bookshelf"); + flammabeIds.add("minecraft:hay_block"); + flammabeIds.add("minecraft:deadbush"); + addWoodTypes(flammabeIds, "_slab"); + addWoodTypes(flammabeIds, "_log"); + addWoodTypes(flammabeIds, "_planks"); + addWoodTypes(flammabeIds, "_leaves"); + addWoodTypes(flammabeIds, "_fence"); + addWoodTypes(flammabeIds, "_fence_gate"); + addWoodTypes(flammabeIds, "_stairs"); + + FireConnectionHandler connectionHandler = new FireConnectionHandler(); + return blockData -> { + String key = blockData.getMinecraftKey(); + if (key.contains("_wool") || key.contains("_carpet") || flammabeIds.contains(key)) { + flammableBlocks.add(blockData.getSavedBlockStateId()); + } else if (key.equals("minecraft:fire")) { + int id = blockData.getSavedBlockStateId(); + connectedBlocks.put(getStates(blockData), id); + ConnectionData.connectionHandlerMap.put(id, connectionHandler); + } + }; + } + + private static byte getStates(WrappedBlockData blockData) { + byte states = 0; + if (blockData.getValue("east").equals("true")) states |= 1; + if (blockData.getValue("north").equals("true")) states |= 2; + if (blockData.getValue("south").equals("true")) states |= 4; + if (blockData.getValue("up").equals("true")) states |= 8; + if (blockData.getValue("west").equals("true")) states |= 16; + return states; + } + + @Override + public int connect(UserConnection user, Position position, int blockState) { + byte states = 0; + if (flammableBlocks.contains(getBlockData(user, position.getRelative(BlockFace.EAST)))) states |= 1; + if (flammableBlocks.contains(getBlockData(user, position.getRelative(BlockFace.NORTH)))) states |= 2; + if (flammableBlocks.contains(getBlockData(user, position.getRelative(BlockFace.SOUTH)))) states |= 4; + if (flammableBlocks.contains(getBlockData(user, position.getRelative(BlockFace.TOP)))) states |= 8; + if (flammableBlocks.contains(getBlockData(user, position.getRelative(BlockFace.WEST)))) states |= 16; + return connectedBlocks.get(states); + } +}