tcr/java/src/game/init/ReorderRegistry.java

226 lines
10 KiB
Java
Raw Normal View History

2025-03-11 00:23:54 +01:00
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);
}
}