226 lines
10 KiB
Java
226 lines
10 KiB
Java
![]() |
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<Block> PLACE_LAST = new HashSet<Block>();
|
||
|
private static final Set<Block> PLACE_FINAL = new HashSet<Block>();
|
||
|
private static final Map<State, Vec3i> STATE_ATTACH = new HashMap<State, Vec3i>();
|
||
|
private static final Map<Block, Vec3i> BLOCK_ATTACH = new HashMap<Block, Vec3i>();
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|