HexCasting/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java

274 lines
15 KiB
Java

package at.petrak.hexcasting.common.lib;
import at.petrak.hexcasting.api.block.circle.BlockAbstractImpetus;
import at.petrak.hexcasting.common.blocks.BlockConjured;
import at.petrak.hexcasting.common.blocks.BlockConjuredLight;
import at.petrak.hexcasting.common.blocks.BlockFlammable;
import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay;
import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicBookshelf;
import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicLigature;
import at.petrak.hexcasting.common.blocks.akashic.BlockAkashicRecord;
import at.petrak.hexcasting.common.blocks.circles.BlockEmptyImpetus;
import at.petrak.hexcasting.common.blocks.circles.BlockSlate;
import at.petrak.hexcasting.common.blocks.circles.directrix.BlockBooleanDirectrix;
import at.petrak.hexcasting.common.blocks.circles.directrix.BlockEmptyDirectrix;
import at.petrak.hexcasting.common.blocks.circles.directrix.BlockRedstoneDirectrix;
import at.petrak.hexcasting.common.blocks.circles.impetuses.BlockLookingImpetus;
import at.petrak.hexcasting.common.blocks.circles.impetuses.BlockRedstoneImpetus;
import at.petrak.hexcasting.common.blocks.circles.impetuses.BlockRightClickImpetus;
import at.petrak.hexcasting.common.blocks.decoration.*;
import com.mojang.datafixers.util.Pair;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import static at.petrak.hexcasting.api.HexAPI.modLoc;
public class HexBlocks {
public static void registerBlocks(BiConsumer<Block, ResourceLocation> r) {
for (var e : BLOCKS.entrySet()) {
r.accept(e.getValue(), e.getKey());
}
}
public static void registerBlockItems(BiConsumer<Item, ResourceLocation> r) {
for (var e : BLOCK_ITEMS.entrySet()) {
r.accept(new BlockItem(e.getValue().getFirst(), e.getValue().getSecond()), e.getKey());
}
}
private static final Map<ResourceLocation, Block> BLOCKS = new LinkedHashMap<>();
private static final Map<ResourceLocation, Pair<Block, Item.Properties>> BLOCK_ITEMS = new LinkedHashMap<>();
private static BlockBehaviour.Properties slateish() {
return BlockBehaviour.Properties
.of(Material.STONE, MaterialColor.DEEPSLATE)
.sound(SoundType.DEEPSLATE_TILES)
.strength(4f, 4f);
}
private static BlockBehaviour.Properties papery(MaterialColor color) {
return BlockBehaviour.Properties
.of(Material.PLANT, color)
.sound(SoundType.GRASS)
.instabreak();
}
private static BlockBehaviour.Properties akashicWoodyHard() {
return woodyHard(MaterialColor.COLOR_PURPLE);
}
private static BlockBehaviour.Properties woodyHard(MaterialColor color) {
return BlockBehaviour.Properties.of(Material.WOOD, color)
.sound(SoundType.WOOD)
.strength(3f, 4f);
}
private static BlockBehaviour.Properties edifiedWoody() {
return woody(MaterialColor.COLOR_PURPLE);
}
private static BlockBehaviour.Properties woody(MaterialColor color) {
return BlockBehaviour.Properties.of(Material.WOOD, color)
.sound(SoundType.WOOD)
.strength(2f);
}
private static BlockBehaviour.Properties leaves(MaterialColor color) {
return BlockBehaviour.Properties.of(Material.LEAVES, color)
.strength(0.2F)
.randomTicks()
.sound(SoundType.GRASS)
.noOcclusion()
.isValidSpawn((bs, level, pos, type) -> type == EntityType.OCELOT || type == EntityType.PARROT)
.isSuffocating(HexBlocks::never)
.isViewBlocking(HexBlocks::never);
}
// we have to make it emit light because otherwise it occludes itself and is always dark
private static BlockBehaviour.Properties quenched() {
return BlockBehaviour.Properties
.copy(Blocks.AMETHYST_BLOCK)
.lightLevel($ -> 4)
.noOcclusion();
}
// we give these faux items so Patchi can have an item to view with
public static final Block CONJURED_LIGHT = blockItem("conjured_light",
new BlockConjuredLight(
BlockBehaviour.Properties.of(Material.GLASS, MaterialColor.NONE)
.sound(SoundType.AMETHYST)
.lightLevel((state) -> 15)
.noLootTable()
.isValidSpawn(HexBlocks::never)
.instabreak()
.noCollission()
.isSuffocating(HexBlocks::never)
.isViewBlocking(HexBlocks::never)),
new Item.Properties());
public static final Block CONJURED_BLOCK = blockItem("conjured_block",
new BlockConjured(
BlockBehaviour.Properties.of(Material.GLASS, MaterialColor.NONE)
.sound(SoundType.AMETHYST)
.lightLevel((state) -> 2)
.noLootTable()
.isValidSpawn(HexBlocks::never)
.instabreak()
.noOcclusion()
.isSuffocating(HexBlocks::never)
.isViewBlocking(HexBlocks::never)),
new Item.Properties());
// "no" item because we add it manually
public static final BlockSlate SLATE = blockNoItem("slate", new BlockSlate(slateish()));
public static final BlockEmptyImpetus IMPETUS_EMPTY = blockItem("impetus/empty", new BlockEmptyImpetus(slateish()));
public static final BlockRightClickImpetus IMPETUS_RIGHTCLICK = blockItem("impetus/rightclick",
new BlockRightClickImpetus(slateish()
.lightLevel(bs -> bs.getValue(BlockAbstractImpetus.ENERGIZED) ? 15 : 0)));
public static final BlockLookingImpetus IMPETUS_LOOK = blockItem("impetus/look",
new BlockLookingImpetus(slateish()
.lightLevel(bs -> bs.getValue(BlockAbstractImpetus.ENERGIZED) ? 15 : 0)));
public static final BlockRedstoneImpetus IMPETUS_REDSTONE = blockItem("impetus/redstone",
new BlockRedstoneImpetus(slateish()
.lightLevel(bs -> bs.getValue(BlockAbstractImpetus.ENERGIZED) ? 15 : 0)));
public static final BlockEmptyDirectrix EMPTY_DIRECTRIX = blockItem("directrix/empty",
new BlockEmptyDirectrix(slateish()));
public static final BlockRedstoneDirectrix DIRECTRIX_REDSTONE = blockItem("directrix/redstone",
new BlockRedstoneDirectrix(slateish()));
public static final BlockBooleanDirectrix DIRECTRIX_BOOLEAN = blockItem("directrix/boolean",
new BlockBooleanDirectrix(slateish()));
public static final BlockAkashicRecord AKASHIC_RECORD = blockItem("akashic_record",
new BlockAkashicRecord(akashicWoodyHard().lightLevel(bs -> 15)));
public static final BlockAkashicBookshelf AKASHIC_BOOKSHELF = blockItem("akashic_bookshelf",
new BlockAkashicBookshelf(akashicWoodyHard()
.lightLevel(bs -> (bs.getValue(BlockAkashicBookshelf.HAS_BOOKS)) ? 15 : 0)));
public static final BlockAkashicLigature AKASHIC_LIGATURE = blockItem("akashic_connector",
new BlockAkashicLigature(akashicWoodyHard().lightLevel(bs -> 4)));
public static final BlockQuenchedAllay QUENCHED_ALLAY = blockItem("quenched_allay", new BlockQuenchedAllay(quenched()));
// Decoration?!
public static final BlockQuenchedAllay QUENCHED_ALLAY_TILES = blockItem("quenched_allay_tiles", new BlockQuenchedAllay(quenched()));
public static final BlockQuenchedAllay QUENCHED_ALLAY_BRICKS = blockItem("quenched_allay_bricks", new BlockQuenchedAllay(quenched()));
public static final BlockQuenchedAllay QUENCHED_ALLAY_BRICKS_SMALL = blockItem("quenched_allay_bricks_small", new BlockQuenchedAllay(quenched()));
public static final Block SLATE_BLOCK = blockItem("slate_block", new Block(slateish().strength(2f, 4f)));
public static final Block SLATE_TILES = blockItem("slate_tiles", new Block(slateish().strength(2f, 4f)));
public static final Block SLATE_BRICKS = blockItem("slate_bricks", new Block(slateish().strength(2f, 4f)));
public static final Block SLATE_BRICKS_SMALL = blockItem("slate_bricks_small", new Block(slateish().strength(2f, 4f)));
public static final RotatedPillarBlock SLATE_PILLAR = blockItem("slate_pillar", new RotatedPillarBlock(slateish().strength(2f, 4f)));
public static final SandBlock AMETHYST_DUST_BLOCK = blockItem("amethyst_dust_block",
new SandBlock(0xff_b38ef3, BlockBehaviour.Properties.of(Material.SAND, MaterialColor.COLOR_PURPLE)
.strength(0.5f).sound(SoundType.SAND)));
public static final AmethystBlock AMETHYST_TILES = blockItem("amethyst_tiles",
new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK)));
public static final AmethystBlock AMETHYST_BRICKS = blockItem("amethyst_bricks",
new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK)));
public static final AmethystBlock AMETHYST_BRICKS_SMALL = blockItem("amethyst_bricks_small",
new AmethystBlock(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK)));
public static final BlockAmethystDirectional AMETHYST_PILLAR = blockItem("amethyst_pillar",
new BlockAmethystDirectional(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK)));
public static final Block SLATE_AMETHYST_TILES = blockItem("slate_amethyst_tiles", new Block(slateish().strength(2f, 4f)));
public static final Block SLATE_AMETHYST_BRICKS = blockItem("slate_amethyst_bricks", new Block(slateish().strength(2f, 4f)));
public static final Block SLATE_AMETHYST_BRICKS_SMALL = blockItem("slate_amethyst_bricks_small", new Block(slateish().strength(2f, 4f)));
public static final RotatedPillarBlock SLATE_AMETHYST_PILLAR = blockItem("slate_amethyst_pillar",
new RotatedPillarBlock(slateish().strength(2f, 4f)));
public static final Block SCROLL_PAPER = blockItem("scroll_paper",
new BlockFlammable(papery(MaterialColor.TERRACOTTA_WHITE), 100, 60));
public static final Block ANCIENT_SCROLL_PAPER = blockItem("ancient_scroll_paper",
new BlockFlammable(papery(MaterialColor.TERRACOTTA_ORANGE), 100, 60));
public static final Block SCROLL_PAPER_LANTERN = blockItem("scroll_paper_lantern",
new BlockFlammable(papery(MaterialColor.TERRACOTTA_WHITE).lightLevel($ -> 15), 100, 60));
public static final Block ANCIENT_SCROLL_PAPER_LANTERN = blockItem(
"ancient_scroll_paper_lantern",
new BlockFlammable(papery(MaterialColor.TERRACOTTA_ORANGE).lightLevel($ -> 12), 100, 60));
public static final BlockSconce SCONCE = blockItem("amethyst_sconce",
new BlockSconce(BlockBehaviour.Properties.of(Material.AMETHYST, MaterialColor.COLOR_PURPLE)
.sound(SoundType.AMETHYST)
.strength(1f)
.lightLevel($ -> 15)),
HexItems.props().rarity(Rarity.RARE));
public static final BlockAkashicLog EDIFIED_LOG = blockItem("edified_log",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog EDIFIED_LOG_AMETHYST = blockItem("edified_log_amethyst",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog EDIFIED_LOG_AVENTURINE = blockItem("edified_log_aventurine",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog EDIFIED_LOG_CITRINE = blockItem("edified_log_citrine",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog EDIFIED_LOG_PURPLE = blockItem("edified_log_purple",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog STRIPPED_EDIFIED_LOG = blockItem("stripped_edified_log",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog EDIFIED_WOOD = blockItem("edified_wood",
new BlockAkashicLog(edifiedWoody()));
public static final BlockAkashicLog STRIPPED_EDIFIED_WOOD = blockItem("stripped_edified_wood",
new BlockAkashicLog(edifiedWoody()));
public static final Block EDIFIED_PLANKS = blockItem("edified_planks",
new BlockFlammable(edifiedWoody(), 20, 5));
public static final Block EDIFIED_PANEL = blockItem("edified_panel",
new BlockFlammable(edifiedWoody(), 20, 5));
public static final Block EDIFIED_TILE = blockItem("edified_tile",
new BlockFlammable(edifiedWoody(), 20, 5));
public static final DoorBlock EDIFIED_DOOR = blockItem("edified_door",
new BlockHexDoor(edifiedWoody().noOcclusion()));
public static final TrapDoorBlock EDIFIED_TRAPDOOR = blockItem("edified_trapdoor",
new BlockHexTrapdoor(edifiedWoody().noOcclusion()));
public static final StairBlock EDIFIED_STAIRS = blockItem("edified_stairs",
new BlockHexStairs(EDIFIED_PLANKS.defaultBlockState(), edifiedWoody().noOcclusion()));
public static final SlabBlock EDIFIED_SLAB = blockItem("edified_slab",
new BlockHexSlab(edifiedWoody().noOcclusion()));
public static final WoodButtonBlock EDIFIED_BUTTON = blockItem("edified_button",
new BlockHexWoodButton(edifiedWoody().noOcclusion().noCollission()));
public static final PressurePlateBlock EDIFIED_PRESSURE_PLATE = blockItem("edified_pressure_plate",
new BlockHexPressurePlate(PressurePlateBlock.Sensitivity.EVERYTHING,
edifiedWoody().noOcclusion().noCollission()));
public static final BlockAkashicLeaves AMETHYST_EDIFIED_LEAVES = blockItem("amethyst_edified_leaves",
new BlockAkashicLeaves(leaves(MaterialColor.COLOR_PURPLE)));
public static final BlockAkashicLeaves AVENTURINE_EDIFIED_LEAVES = blockItem("aventurine_edified_leaves",
new BlockAkashicLeaves(leaves(MaterialColor.COLOR_BLUE)));
public static final BlockAkashicLeaves CITRINE_EDIFIED_LEAVES = blockItem("citrine_edified_leaves",
new BlockAkashicLeaves(leaves(MaterialColor.COLOR_YELLOW)));
private static boolean never(Object... args) {
return false;
}
private static <T extends Block> T blockNoItem(String name, T block) {
var old = BLOCKS.put(modLoc(name), block);
if (old != null) {
throw new IllegalArgumentException("Typo? Duplicate id " + name);
}
return block;
}
private static <T extends Block> T blockItem(String name, T block) {
return blockItem(name, block, HexItems.props());
}
private static <T extends Block> T blockItem(String name, T block, Item.Properties props) {
blockNoItem(name, block);
var old = BLOCK_ITEMS.put(modLoc(name), new Pair<>(block, props));
if (old != null) {
throw new IllegalArgumentException("Typo? Duplicate id " + name);
}
return block;
}
}