package game.init; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import game.block.Block; import game.block.BlockBed; import game.block.BlockDoor; import game.color.DyeColor; import game.world.Facing; import game.world.State; import game.world.Vec3i; public abstract class ReorderRegistry { private static final Set PLACE_LAST = new HashSet(); private static final Set PLACE_FINAL = new HashSet(); private static final Map STATE_ATTACH = new HashMap(); private static final Map BLOCK_ATTACH = new HashMap(); public static boolean shouldPlaceLast(Block id) { return PLACE_LAST.contains(id); } public static boolean shouldPlaceFinal(Block id) { return PLACE_FINAL.contains(id) || id instanceof BlockDoor; } public static Vec3i getAttachment(State state) { Vec3i direction = BLOCK_ATTACH.get(state.getBlock()); if (direction != null) return direction; return STATE_ATTACH.get(state); } static void register() { for(WoodType wood : WoodType.values()) { PLACE_LAST.add(BlockRegistry.getRegisteredBlock(wood.getName() + "_sapling")); } // PLACE_LAST.add(Blocks.bed); for(DyeColor color : BlockBed.COLORS) { PLACE_LAST.add(BlockRegistry.getRegisteredBlock(color.getName() + "_bed")); } PLACE_LAST.add(Blocks.golden_rail); PLACE_LAST.add(Blocks.detector_rail); PLACE_LAST.add(Blocks.tallgrass); PLACE_LAST.add(Blocks.deadbush); PLACE_LAST.add(Blocks.piston_head); PLACE_LAST.add(Blocks.flower); PLACE_LAST.add(Blocks.brown_mushroom); PLACE_LAST.add(Blocks.red_mushroom_block); PLACE_LAST.add(Blocks.torch); PLACE_LAST.add(Blocks.fire); PLACE_LAST.add(Blocks.redstone); PLACE_LAST.add(Blocks.wheat); PLACE_LAST.add(Blocks.ladder); PLACE_LAST.add(Blocks.rail); PLACE_LAST.add(Blocks.lever); PLACE_LAST.add(Blocks.stone_pressure_plate); PLACE_LAST.add(Blocks.wooden_pressure_plate); PLACE_LAST.add(Blocks.unlit_redstone_torch); PLACE_LAST.add(Blocks.redstone_torch); PLACE_LAST.add(Blocks.stone_button); PLACE_LAST.add(Blocks.snow_layer); PLACE_LAST.add(Blocks.portal); PLACE_LAST.add(Blocks.repeater); PLACE_LAST.add(Blocks.powered_repeater); PLACE_LAST.add(Blocks.trapdoor); PLACE_LAST.add(Blocks.vine); PLACE_LAST.add(Blocks.waterlily); PLACE_LAST.add(Blocks.soul_wart); PLACE_LAST.add(Blocks.piston); PLACE_LAST.add(Blocks.sticky_piston); PLACE_LAST.add(Blocks.piston_head); PLACE_LAST.add(Blocks.piston_extension); PLACE_LAST.add(Blocks.cocoa); PLACE_LAST.add(Blocks.tripwire_hook); PLACE_LAST.add(Blocks.string); PLACE_LAST.add(Blocks.flower_pot); PLACE_LAST.add(Blocks.carrot); PLACE_LAST.add(Blocks.potato); PLACE_LAST.add(Blocks.wooden_button); PLACE_LAST.add(Blocks.anvil); // becomes relevant with asynchronous placement PLACE_LAST.add(Blocks.light_weighted_pressure_plate); PLACE_LAST.add(Blocks.heavy_weighted_pressure_plate); PLACE_LAST.add(Blocks.comparator); PLACE_LAST.add(Blocks.powered_comparator); PLACE_LAST.add(Blocks.activator_rail); PLACE_LAST.add(Blocks.iron_trapdoor); PLACE_LAST.add(Blocks.carpet); PLACE_LAST.add(Blocks.double_plant); PLACE_LAST.add(Blocks.daylight_detector_inverted); // shouldPlaceLast.add(Blocks.daylight_detector); PLACE_LAST.add(Blocks.blue_mushroom); PLACE_LAST.add(Blocks.red_button); } static { PLACE_FINAL.add(Blocks.sign); PLACE_FINAL.add(Blocks.wall_sign); PLACE_FINAL.add(Blocks.cactus); PLACE_FINAL.add(Blocks.reeds); PLACE_FINAL.add(Blocks.cake); PLACE_FINAL.add(Blocks.piston_head); PLACE_FINAL.add(Blocks.piston_extension); PLACE_FINAL.add(Blocks.banner); PLACE_FINAL.add(Blocks.wall_banner); } private static void addAttach(State state, Facing dir) { STATE_ATTACH.put(state, dir.getDirectionVec()); } private static void addAttach(Block block, Facing dir) { BLOCK_ATTACH.put(block, dir.getDirectionVec()); } private static void addCardinals(Block type, int west, int north, int east, int south) { addAttach(type.getStateFromMeta(west), Facing.WEST); addAttach(type.getStateFromMeta(north), Facing.NORTH); addAttach(type.getStateFromMeta(east), Facing.EAST); addAttach(type.getStateFromMeta(south), Facing.SOUTH); } static { for(WoodType wood : WoodType.values()) { addAttach(BlockRegistry.getRegisteredBlock(wood.getName() + "_sapling"), Facing.DOWN); } addAttach(Blocks.tallgrass, Facing.DOWN); addAttach(Blocks.deadbush, Facing.DOWN); for (int offset = 0; offset < 16; offset += 8) { addAttach(Blocks.piston_head.getStateFromMeta(offset + 0), Facing.UP); addAttach(Blocks.piston_head.getStateFromMeta(offset + 1), Facing.DOWN); addCardinals(Blocks.piston_head, offset + 2, offset + 5, offset + 3, offset + 4); } addAttach(Blocks.flower, Facing.DOWN); addAttach(Blocks.brown_mushroom, Facing.DOWN); addAttach(Blocks.red_mushroom, Facing.DOWN); for (Block blockId : new Block[] { Blocks.torch, Blocks.redstone_torch, Blocks.unlit_redstone_torch }) { addAttach(blockId.getStateFromMeta(0), Facing.DOWN); addAttach(blockId.getStateFromMeta(5), Facing.DOWN); // According to the wiki, this one is history. Keeping both, for now... addCardinals(blockId, 4, 1, 3, 2); } addAttach(Blocks.redstone, Facing.DOWN); addAttach(Blocks.wheat, Facing.DOWN); addAttach(Blocks.sign, Facing.DOWN); addCardinals(Blocks.ladder, 2, 5, 3, 4); addCardinals(Blocks.wall_sign, 2, 5, 3, 4); for (int offset = 0; offset < 16; offset += 8) { addCardinals(Blocks.lever, offset + 4, offset + 1, offset + 3, offset + 2); addAttach(Blocks.lever.getStateFromMeta(offset + 5), Facing.DOWN); addAttach(Blocks.lever.getStateFromMeta(offset + 6), Facing.DOWN); addAttach(Blocks.lever.getStateFromMeta(offset + 7), Facing.UP); addAttach(Blocks.lever.getStateFromMeta(offset + 0), Facing.UP); } addAttach(Blocks.stone_pressure_plate, Facing.DOWN); addAttach(Blocks.iron_door, Facing.DOWN); addAttach(Blocks.wooden_pressure_plate, Facing.DOWN); // redstone torches: see torches for (int offset = 0; offset < 16; offset += 8) { addCardinals(Blocks.stone_button, offset + 4, offset + 1, offset + 3, offset + 2); addCardinals(Blocks.wooden_button, offset + 4, offset + 1, offset + 3, offset + 2); addCardinals(Blocks.red_button, offset + 4, offset + 1, offset + 3, offset + 2); } addAttach(Blocks.stone_button.getStateFromMeta(0), Facing.UP); addAttach(Blocks.stone_button.getStateFromMeta(5), Facing.DOWN); addAttach(Blocks.wooden_button.getStateFromMeta(0), Facing.UP); addAttach(Blocks.wooden_button.getStateFromMeta(5), Facing.DOWN); addAttach(Blocks.red_button.getStateFromMeta(0), Facing.UP); addAttach(Blocks.red_button.getStateFromMeta(5), Facing.DOWN); addAttach(Blocks.cactus, Facing.DOWN); addAttach(Blocks.reeds, Facing.DOWN); addAttach(Blocks.cake, Facing.DOWN); addAttach(Blocks.repeater, Facing.DOWN); addAttach(Blocks.powered_repeater, Facing.DOWN); for (int offset = 0; offset < 16; offset += 4) { addCardinals(Blocks.trapdoor, offset + 0, offset + 3, offset + 1, offset + 2); addCardinals(Blocks.iron_trapdoor, offset + 0, offset + 3, offset + 1, offset + 2); } addAttach(Blocks.pumpkin_stem, Facing.DOWN); addAttach(Blocks.melon_stem, Facing.DOWN); // vines are complicated, but I'll list the single-attachment variants anyway addAttach(Blocks.vine.getStateFromMeta(0), Facing.UP); addCardinals(Blocks.vine, 1, 2, 4, 8); addAttach(Blocks.soul_wart, Facing.DOWN); for (int offset = 0; offset < 16; offset += 4) { addCardinals(Blocks.cocoa, offset + 0, offset + 1, offset + 2, offset + 3); } for (int offset = 0; offset < 16; offset += 4) { addCardinals(Blocks.tripwire_hook, offset + 2, offset + 3, offset + 0, offset + 1); } addAttach(Blocks.string, Facing.DOWN); addAttach(Blocks.flower_pot, Facing.DOWN); addAttach(Blocks.carrot, Facing.DOWN); addAttach(Blocks.potato, Facing.DOWN); addAttach(Blocks.anvil, Facing.DOWN); addAttach(Blocks.light_weighted_pressure_plate, Facing.DOWN); addAttach(Blocks.heavy_weighted_pressure_plate, Facing.DOWN); addAttach(Blocks.comparator, Facing.DOWN); addAttach(Blocks.powered_comparator, Facing.DOWN); addAttach(Blocks.carpet, Facing.DOWN); addAttach(Blocks.double_plant, Facing.DOWN); addAttach(Blocks.banner, Facing.DOWN); addCardinals(Blocks.wall_banner, 4, 2, 5, 3); addAttach(Blocks.oak_door, Facing.DOWN); addAttach(Blocks.spruce_door, Facing.DOWN); addAttach(Blocks.birch_door, Facing.DOWN); addAttach(Blocks.jungle_door, Facing.DOWN); addAttach(Blocks.acacia_door, Facing.DOWN); addAttach(Blocks.dark_oak_door, Facing.DOWN); addAttach(Blocks.cherry_door, Facing.DOWN); addAttach(Blocks.maple_door, Facing.DOWN); // Rails are hardcoded to be attached to the block below them. // In addition to that, let's attach ascending rails to the block they're ascending towards. for (int offset = 0; offset < 16; offset += 8) { addCardinals(Blocks.golden_rail, offset + 3, offset + 4, offset + 2, offset + 5); addCardinals(Blocks.detector_rail, offset + 3, offset + 4, offset + 2, offset + 5); addCardinals(Blocks.rail, offset + 3, offset + 4, offset + 2, offset + 5); addCardinals(Blocks.activator_rail, offset + 3, offset + 4, offset + 2, offset + 5); } addAttach(Blocks.blue_mushroom, Facing.DOWN); } }