private boolean connects(BlockFace side, int blockState) { final BlockData blockData = ConnectionData.blockConnectionData.get(blockState); return blockData != null && blockData.connectsTo("redstoneConnections", side.opposite()); } }
private static Byte getStates(WrappedBlockData blockData) { byte states = 0; String type = blockData.getValue("type"); if (type.equals("left")) states |= 1; if (type.equals("right")) states |= 2; states |= (BlockFace.valueOf(blockData.getValue("facing").toUpperCase()).ordinal() << 2); if (blockData.getMinecraftKey().equals("minecraft:trapped_chest")) states |= 16; return states; }
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;
private int getShape(UserConnection user, Position position, StairData stair) { BlockFace facing = stair.getFacing(); 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())){ 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()) { BlockFace facing2 = relativeStair.getFacing(); if (facing.getAxis() != facing2.getAxis() && checkOpposite(user, stair, position, facing2)){ return facing2 == rotateAntiClockwise(facing) ? 1 : 2; // inner_left : inner_right } } return 0; // straight }
public boolean connectsTo(String blockConnection, BlockFace face) { final Boolean[] booleans = connectData.get(blockConnection); return booleans != null && booleans[face.ordinal()]; } }
static void init() { ChestConnectionHandler connectionHandler = new ChestConnectionHandler(); for (Map.Entry<String, Integer> 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); } }
@Override public int connect(UserConnection user, Position position, int blockState) { StairData stairData = stairDataMap.get(blockState); if (stairData == null) return blockState; short s = 0; if (stairData.isBottom()) s |= 1; s |= getShape(user, position, stairData) << 1; s |= stairData.getType() << 4; s |= stairData.getFacing().ordinal() << 9; Integer newBlockState = connectedBlocks.get(s); return newBlockState == null ? blockState : newBlockState; }
public AbstractStempConnectionHandler(String baseStateId, String blockId, String toKey) { this.baseStateId = ConnectionData.getId(baseStateId); for (Map.Entry<String, Integer> 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()); } 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 public int connect(UserConnection user, Position position, int blockState) { BlockFace facing = chestFacings.get(blockState); byte states = 0; states |= (facing.ordinal() << 2); boolean trapped = trappedChests.contains(blockState); if (trapped) states |= 16; int relative; if (chestFacings.containsKey(relative = getBlockData(user, position.getRelative(BlockFace.NORTH))) && trapped == trappedChests.contains(relative)) { states |= facing == BlockFace.WEST ? 1 : 2; } else if (chestFacings.containsKey(relative = getBlockData(user, position.getRelative(BlockFace.SOUTH))) && trapped == trappedChests.contains(relative)) { states |= facing == BlockFace.EAST ? 1 : 2; } else if (chestFacings.containsKey(relative = getBlockData(user, position.getRelative(BlockFace.WEST))) && trapped == trappedChests.contains(relative)) { states |= facing == BlockFace.NORTH ? 2 : 1; } else if (chestFacings.containsKey(relative = getBlockData(user, position.getRelative(BlockFace.EAST))) && trapped == trappedChests.contains(relative)) { states |= facing == BlockFace.SOUTH ? 2 : 1; } Integer newBlockState = connectedStates.get(states); return newBlockState == null ? blockState : newBlockState; } }
static void init() { TripwireConnectionHandler connectionHandler = new TripwireConnectionHandler(); for (Map.Entry<String, Integer> blockState : ConnectionData.keyToId.entrySet()) { String key = blockState.getKey().split("\\[")[0]; 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()); 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); } } }
protected boolean connects(BlockFace side, int blockState) { return blockStates.contains(blockState) || blockConnections != null && ConnectionData.blockConnectionData.containsKey(blockState) && ConnectionData.blockConnectionData.get(blockState).connectsTo(blockConnections, side.opposite()); } }
private static short getStates(StairData stairData) { short s = 0; if (stairData.isBottom()) s |= 1; s |= stairData.getShape() << 1; s |= stairData.getType() << 4; s |= stairData.getFacing().ordinal() << 9; return s; }
static void init() { List<String> baseDoors = new LinkedList<>(); baseDoors.add("minecraft:oak_door"); baseDoors.add("minecraft:birch_door"); baseDoors.add("minecraft:jungle_door"); baseDoors.add("minecraft:dark_oak_door"); baseDoors.add("minecraft:acacia_door"); baseDoors.add("minecraft:spruce_door"); baseDoors.add("minecraft:iron_door"); DoorConnectionHandler connectionHandler = new DoorConnectionHandler(); for (Map.Entry<String, Integer> blockState : ConnectionData.keyToId.entrySet()) { String key = blockState.getKey().split("\\[")[0]; int type = baseDoors.indexOf(key); if (type == -1) continue; WrappedBlockData blockData = WrappedBlockData.fromString(blockState.getKey()); int id = blockState.getValue(); 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); connectedStates.put(getStates(doorData), id); ConnectionData.connectionHandlerMap.put(id, connectionHandler); } }
@Override public int connect(UserConnection user, Position position, int blockState) { DoorData doorData = doorDataMap.get(blockState); if (doorData == null) return blockState; short s = 0; s |= (doorData.getType() & 0x7) << 6; if (doorData.isLower()) { DoorData upperHalf = doorDataMap.get(getBlockData(user, position.getRelative(BlockFace.TOP))); if (upperHalf == null) return blockState; s |= 1; if (doorData.isOpen()) s |= 2; if (upperHalf.isPowered()) s |= 4; if (upperHalf.isRightHinge()) s |= 8; s |= doorData.getFacing().ordinal() << 4; } else { DoorData lowerHalf = doorDataMap.get(getBlockData(user, position.getRelative(BlockFace.BOTTOM))); if (lowerHalf == null) return blockState; if (lowerHalf.isOpen()) s |= 2; if (doorData.isPowered()) s |= 4; if (doorData.isRightHinge()) s |= 8; s |= lowerHalf.getFacing().ordinal() << 4; } Integer newBlockState = connectedStates.get(s); return newBlockState == null ? blockState : newBlockState; }
blockData.getValue("half").equals("bottom"), shape, (byte) type, BlockFace.valueOf(blockData.getValue("facing").toUpperCase()) );
private static short getStates(DoorData doorData) { short s = 0; if (doorData.isLower()) s |= 1; if (doorData.isOpen()) s |= 2; if (doorData.isPowered()) s |= 4; if (doorData.isRightHinge()) s |= 8; s |= doorData.getFacing().ordinal() << 4; s |= (doorData.getType() & 0x7) << 6; return s; }