From 5fe3b04dc95337eeb607cc7ef3fdb9bf0134bdc5 Mon Sep 17 00:00:00 2001 From: alegian Date: Mon, 23 Feb 2026 10:19:28 +0200 Subject: [PATCH 1/6] start hole basics --- .../assets/thavma/blockstates/hole.json | 7 + .../resources/assets/thavma/lang/en_us.json | 1 + .../assets/thavma/models/block/hole.json | 3 + .../assets/thavma/models/item/hole.json | 1 + .../thavma/impl/common/block/AuraNodeBlock.kt | 4 +- .../thavma/impl/common/block/HoleBlock.kt | 25 ++ .../thavma/impl/common/block/entity/HoleBE.kt | 8 + .../thavma/impl/common/item/HoleFocus.kt | 7 + .../data/providers/T7BlockStateProvider.kt | 10 +- .../init/data/providers/T7LanguageProvider.kt | 258 +++++++----------- .../registries/deferred/T7BlockEntities.kt | 4 + .../impl/init/registries/deferred/T7Blocks.kt | 2 + .../impl/init/registries/deferred/T7Items.kt | 2 +- 13 files changed, 161 insertions(+), 171 deletions(-) create mode 100644 src/generated/resources/assets/thavma/blockstates/hole.json create mode 100644 src/generated/resources/assets/thavma/models/block/hole.json create mode 100644 src/generated/resources/assets/thavma/models/item/hole.json create mode 100644 src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt create mode 100644 src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt create mode 100644 src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt diff --git a/src/generated/resources/assets/thavma/blockstates/hole.json b/src/generated/resources/assets/thavma/blockstates/hole.json new file mode 100644 index 00000000..f123632a --- /dev/null +++ b/src/generated/resources/assets/thavma/blockstates/hole.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "thavma:block/hole" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/thavma/lang/en_us.json b/src/generated/resources/assets/thavma/lang/en_us.json index 802e4628..ed9b51dd 100644 --- a/src/generated/resources/assets/thavma/lang/en_us.json +++ b/src/generated/resources/assets/thavma/lang/en_us.json @@ -43,6 +43,7 @@ "block.thavma.greatwood_sapling": "Greatwood Sapling", "block.thavma.greatwood_slab": "Greatwood Slab", "block.thavma.greatwood_stairs": "Greatwood Stairs", + "block.thavma.hole": "Hole Block", "block.thavma.hungry_chest": "Hungry Chest", "block.thavma.ignis_infused_deepslate": "Ignis Infused Deepslate", "block.thavma.ignis_infused_stone": "Ignis Infused Stone", diff --git a/src/generated/resources/assets/thavma/models/block/hole.json b/src/generated/resources/assets/thavma/models/block/hole.json new file mode 100644 index 00000000..a3522aa1 --- /dev/null +++ b/src/generated/resources/assets/thavma/models/block/hole.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/air" +} \ No newline at end of file diff --git a/src/generated/resources/assets/thavma/models/item/hole.json b/src/generated/resources/assets/thavma/models/item/hole.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/generated/resources/assets/thavma/models/item/hole.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/java/me/alegian/thavma/impl/common/block/AuraNodeBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/AuraNodeBlock.kt index 176035fa..091dddf6 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/AuraNodeBlock.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/AuraNodeBlock.kt @@ -26,9 +26,7 @@ class AuraNodeBlock : TransparentBlock( return RenderShape.ENTITYBLOCK_ANIMATED } - override fun newBlockEntity(pos: BlockPos, blockState: BlockState): BlockEntity { - return AuraNodeBE(pos, blockState) - } + override fun newBlockEntity(pos: BlockPos, blockState: BlockState) = AuraNodeBE(pos, blockState) override fun getTicker(level: Level, state: BlockState, type: BlockEntityType): BlockEntityTicker? { return BaseEntityBlock.createTickerHelper(type, AURA_NODE.get(), AuraNodeBE::tick) diff --git a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt new file mode 100644 index 00000000..8c74f607 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -0,0 +1,25 @@ +package me.alegian.thavma.impl.common.block + +import me.alegian.thavma.impl.common.block.entity.HoleBE +import net.minecraft.core.BlockPos +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.EntityBlock +import net.minecraft.world.level.block.RenderShape +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.state.BlockState + +class HoleBlock : Block( + Properties.of() + .noCollission() + .noOcclusion() + .noTerrainParticles() + .strength(-1.0F, 3600000.0F) + .lightLevel { 7 } + .isValidSpawn(Blocks::never) + .noLootTable() +), EntityBlock { + override fun newBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = HoleBE(pos, state) + + override fun getRenderShape(state: BlockState) = RenderShape.INVISIBLE +} diff --git a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt new file mode 100644 index 00000000..36b1a7b3 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt @@ -0,0 +1,8 @@ +package me.alegian.thavma.impl.common.block.entity + +import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities +import net.minecraft.core.BlockPos +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.state.BlockState + +class HoleBE(pos: BlockPos, state: BlockState) : BlockEntity(T7BlockEntities.HOLE.get(), pos, state) diff --git a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt new file mode 100644 index 00000000..262475ed --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt @@ -0,0 +1,7 @@ +package me.alegian.thavma.impl.common.item + +import net.minecraft.world.item.Item + +class HoleFocus : Item( + Properties().stacksTo(1) +) diff --git a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockStateProvider.kt b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockStateProvider.kt index 2e6c1efe..1ad33266 100644 --- a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockStateProvider.kt +++ b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockStateProvider.kt @@ -22,6 +22,7 @@ import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_SAPLIN import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_SLAB import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_STAIRS import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.HUNGRY_CHEST +import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.HOLE import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.INFUSED_DEEPSLATES import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.INFUSED_STONES import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ITEM_HATCH @@ -50,7 +51,7 @@ import net.neoforged.neoforge.common.data.ExistingFileHelper class T7BlockStateProvider(output: PackOutput, exFileHelper: ExistingFileHelper) : BlockStateProvider(output, Thavma.MODID, exFileHelper) { override fun registerStatesAndModels() { simpleBlockWithItem( - CRUCIBLE.get(), this.models().getBuilder(CRUCIBLE.id.path) + CRUCIBLE.get(), models().getBuilder(CRUCIBLE.id.path) .parent(UncheckedModelFile("block/cauldron")) .texture("particle", rl("block/crucible_side")) .texture("top", rl("block/crucible_top")) @@ -64,7 +65,7 @@ class T7BlockStateProvider(output: PackOutput, exFileHelper: ExistingFileHelper) simpleBlockWithItem( ITEM_HATCH.get(), models() - .withExistingParent(name(ITEM_HATCH.get()), mcLoc("block/iron_trapdoor_top")) + .withExistingParent(ITEM_HATCH.id.path, mcLoc("block/iron_trapdoor_top")) .renderType(RenderType.cutout().name) .texture("texture", key(ITEM_HATCH.get()).withPrefix("block/")) .customLoader(WithTransformParentModel::Builder) @@ -105,6 +106,9 @@ class T7BlockStateProvider(output: PackOutput, exFileHelper: ExistingFileHelper) horizontalBlockWithItem(TABLE.get(), models().getExistingFile(key(TABLE.get()))) horizontalBlockWithItem(RESEARCH_TABLE.get(), models().getExistingFile(key(RESEARCH_TABLE.get()))) + simpleBlock(HOLE.get(), models().getBuilder(HOLE.id.path).parent(UncheckedModelFile("block/air"))) + itemModels().getBuilder(HOLE.id.path) + simpleBlockWithItem( ARCANE_LEVITATOR.get(), models().cubeBottomTop( @@ -179,7 +183,7 @@ class T7BlockStateProvider(output: PackOutput, exFileHelper: ExistingFileHelper) itemModels().withExistingParent(name(block), "item/chest").texture("particle", particle) } - fun sealingJar(block:Block){ + fun sealingJar(block: Block) { simpleBlock(block, models().getExistingFile(key(block))) blockEntityItem1x1x1(block, blockTexture(block)) } diff --git a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7LanguageProvider.kt b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7LanguageProvider.kt index 2ac38300..4ac89f63 100644 --- a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7LanguageProvider.kt +++ b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7LanguageProvider.kt @@ -5,7 +5,6 @@ import me.alegian.thavma.impl.client.T7KeyMappings import me.alegian.thavma.impl.client.gui.layer.ArcaneLensLayer import me.alegian.thavma.impl.client.gui.research_table.AspectWidget import me.alegian.thavma.impl.client.gui.research_table.ButtonWidget -import me.alegian.thavma.impl.client.gui.research_table.ResearchScreen import me.alegian.thavma.impl.client.gui.research_table.SocketWidget import me.alegian.thavma.impl.client.gui.tooltip.AspectClientTooltipComponent import me.alegian.thavma.impl.common.block.HungryChestBlock @@ -18,86 +17,16 @@ import me.alegian.thavma.impl.common.research.ResearchEntry import me.alegian.thavma.impl.common.wand.WandCoreMaterial import me.alegian.thavma.impl.common.wand.WandPlatingMaterial import me.alegian.thavma.impl.init.registries.T7Tags -import me.alegian.thavma.impl.init.registries.deferred.* -import me.alegian.thavma.impl.init.registries.deferred.T7Attributes.REVEALING -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ARCANE_LEVITATOR -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ARCANE_WORKBENCH -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.AURA_NODE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.CRACKED_ELEMENTAL_STONE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.CRUCIBLE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ELEMENTAL_CORE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ELEMENTAL_STONE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ELEMENTAL_STONE_BRICKS -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ELEMENTAL_STONE_SLAB -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ELEMENTAL_STONE_STAIRS -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ETERNAL_FLAME -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_LEAVES -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_LOG -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_PLANKS -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_SAPLING -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_SLAB -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.GREATWOOD_STAIRS -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.HUNGRY_CHEST -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ITEM_HATCH -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.LEVITATOR_COLUMN -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.MATRIX -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.ORICHALCUM_BLOCK -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.PEDESTAL -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.PILLAR -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.RESEARCH_TABLE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.SEALING_JAR -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.SILVERWOOD_LEAVES -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.SILVERWOOD_LOG -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.SILVERWOOD_PLANKS -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.SILVERWOOD_SAPLING -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.TABLE -import me.alegian.thavma.impl.init.registries.deferred.T7Blocks.THAVMITE_BLOCK -import me.alegian.thavma.impl.init.registries.deferred.T7Items.APPRENTICE_BOOTS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.APPRENTICE_CHESTPLATE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.APPRENTICE_LEGGINGS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ARCANE_LENS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.BOOK -import me.alegian.thavma.impl.init.registries.deferred.T7Items.DAWN_CHARM -import me.alegian.thavma.impl.init.registries.deferred.T7Items.EYE_OF_WARDEN -import me.alegian.thavma.impl.init.registries.deferred.T7Items.FABRIC -import me.alegian.thavma.impl.init.registries.deferred.T7Items.GOGGLES -import me.alegian.thavma.impl.init.registries.deferred.T7Items.GOGGLES_CURIO -import me.alegian.thavma.impl.init.registries.deferred.T7Items.GOLD_PLATING -import me.alegian.thavma.impl.init.registries.deferred.T7Items.GREATWOOD_CORE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.IRON_PLATING -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ORICHALCUM_INGOT -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ORICHALCUM_NUGGET -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ORICHALCUM_PLATING -import me.alegian.thavma.impl.init.registries.deferred.T7Items.RESEARCH_SCROLL -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ROTTEN_BRAIN -import me.alegian.thavma.impl.init.registries.deferred.T7Items.RUNE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.SILVERWOOD_CORE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_BOOTS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_CHESTPLATE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_HAMMER -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_HELMET -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_HOE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_INGOT -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_KATANA -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_LEGGINGS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_NUGGET -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_PICKAXE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_PLATING -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_SHOVEL -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_SWORD -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_VANGUARD_BOOTS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_VANGUARD_CHESTPLATE -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_VANGUARD_HELMET -import me.alegian.thavma.impl.init.registries.deferred.T7Items.THAVMITE_VANGUARD_LEGGINGS -import me.alegian.thavma.impl.init.registries.deferred.T7Items.ZEPHYR -import me.alegian.thavma.impl.init.registries.deferred.T7Items.wandOrThrow -import me.alegian.thavma.impl.init.registries.deferred.WandCoreMaterials.GREATWOOD -import me.alegian.thavma.impl.init.registries.deferred.WandCoreMaterials.SILVERWOOD -import me.alegian.thavma.impl.init.registries.deferred.WandCoreMaterials.WOOD -import me.alegian.thavma.impl.init.registries.deferred.WandPlatingMaterials.GOLD -import me.alegian.thavma.impl.init.registries.deferred.WandPlatingMaterials.IRON -import me.alegian.thavma.impl.init.registries.deferred.WandPlatingMaterials.ORICHALCUM -import me.alegian.thavma.impl.init.registries.deferred.WandPlatingMaterials.THAVMITE +import me.alegian.thavma.impl.init.registries.deferred.Aspects +import me.alegian.thavma.impl.init.registries.deferred.T7Blocks +import me.alegian.thavma.impl.init.registries.deferred.T7Items +import me.alegian.thavma.impl.init.registries.deferred.T7EntityTypes +import me.alegian.thavma.impl.init.registries.deferred.ResearchEntries +import me.alegian.thavma.impl.init.registries.deferred.ResearchCategories +import me.alegian.thavma.impl.init.registries.deferred.T7Attributes +import me.alegian.thavma.impl.init.registries.deferred.T7RecipeTypes +import me.alegian.thavma.impl.init.registries.deferred.WandCoreMaterials +import me.alegian.thavma.impl.init.registries.deferred.WandPlatingMaterials import me.alegian.thavma.impl.integration.RecipeViewerAliases import me.alegian.thavma.impl.integration.RecipeViewerDescriptions import net.minecraft.Util @@ -119,74 +48,74 @@ class T7LanguageProvider(output: PackOutput, locale: String) : LanguageProvider( add(Thavma.MODID, "Thavma") - add(IRON_PLATING.get(), "Iron Plating") - add(GOLD_PLATING.get(), "Gold Plating") - add(ORICHALCUM_PLATING.get(), "Orichalcum Plating") - add(THAVMITE_PLATING.get(), "Thavmite Plating") + add(T7Items.IRON_PLATING.get(), "Iron Plating") + add(T7Items.GOLD_PLATING.get(), "Gold Plating") + add(T7Items.ORICHALCUM_PLATING.get(), "Orichalcum Plating") + add(T7Items.THAVMITE_PLATING.get(), "Thavmite Plating") - add(EYE_OF_WARDEN.get(), "Eye of Warden") - add(ROTTEN_BRAIN.get(), "Rotten Brain") - add(FABRIC.get(), "Infused Fabric") + add(T7Items.EYE_OF_WARDEN.get(), "Eye of Warden") + add(T7Items.ROTTEN_BRAIN.get(), "Rotten Brain") + add(T7Items.FABRIC.get(), "Infused Fabric") - add(GREATWOOD_CORE.get(), "Greatwood Wand Core") - add(SILVERWOOD_CORE.get(), "Silverwood Wand Core") + add(T7Items.GREATWOOD_CORE.get(), "Greatwood Wand Core") + add(T7Items.SILVERWOOD_CORE.get(), "Silverwood Wand Core") - add(RUNE.get(), "Rune") - add(THAVMITE_INGOT.get(), "Thavmite Ingot") - add(THAVMITE_NUGGET.get(), "Thavmite Nugget") - add(ORICHALCUM_INGOT.get(), "Orichalcum Ingot") - add(ORICHALCUM_NUGGET.get(), "Orichalcum Nugget") - add(RESEARCH_SCROLL.get(), "Research Scroll") - add(ARCANE_LENS.get(), "Arcane Lens") - add(BOOK.get(), "Elements of Thavma") + add(T7Items.RUNE.get(), "Rune") + add(T7Items.THAVMITE_INGOT.get(), "Thavmite Ingot") + add(T7Items.THAVMITE_NUGGET.get(), "Thavmite Nugget") + add(T7Items.ORICHALCUM_INGOT.get(), "Orichalcum Ingot") + add(T7Items.ORICHALCUM_NUGGET.get(), "Orichalcum Nugget") + add(T7Items.RESEARCH_SCROLL.get(), "Research Scroll") + add(T7Items.ARCANE_LENS.get(), "Arcane Lens") + add(T7Items.BOOK.get(), "Elements of Thavma") add(T7Items.BASIC_AMULET.get(), "Basic Amulet") add(T7Items.BASIC_BELT.get(), "Basic Belt") add(T7Items.BASIC_RING.get(), "Basic Ring") - add(GOGGLES.get(), "Goggles Of Revealing") - add(GOGGLES_CURIO.get(), "Goggles Of Revealing (Curio)") - add(DAWN_CHARM.get(), "Charm of the Dawn") - add(APPRENTICE_BOOTS.get(), "[WIP]Apprentice Boots") - add(APPRENTICE_CHESTPLATE.get(), "[WIP]Apprentice Robes") - add(APPRENTICE_LEGGINGS.get(), "[WIP]Apprentice Pants") + add(T7Items.GOGGLES.get(), "Goggles Of Revealing") + add(T7Items.GOGGLES_CURIO.get(), "Goggles Of Revealing (Curio)") + add(T7Items.DAWN_CHARM.get(), "Charm of the Dawn") + add(T7Items.APPRENTICE_BOOTS.get(), "[WIP]Apprentice Boots") + add(T7Items.APPRENTICE_CHESTPLATE.get(), "[WIP]Apprentice Robes") + add(T7Items.APPRENTICE_LEGGINGS.get(), "[WIP]Apprentice Pants") - add(THAVMITE_BOOTS.get(), "Thavmite Boots") - add(THAVMITE_HELMET.get(), "Thavmite Helmet") - add(THAVMITE_CHESTPLATE.get(), "Thavmite Chestplate") - add(THAVMITE_LEGGINGS.get(), "Thavmite Leggings") + add(T7Items.THAVMITE_BOOTS.get(), "Thavmite Boots") + add(T7Items.THAVMITE_HELMET.get(), "Thavmite Helmet") + add(T7Items.THAVMITE_CHESTPLATE.get(), "Thavmite Chestplate") + add(T7Items.THAVMITE_LEGGINGS.get(), "Thavmite Leggings") - add(THAVMITE_VANGUARD_BOOTS.get(), "[WIP]Thavmite Vanguard Boots") - add(THAVMITE_VANGUARD_HELMET.get(), "[WIP]Thavmite Vanguard Helmet") - add(THAVMITE_VANGUARD_CHESTPLATE.get(), "[WIP]Thavmite Vanguard Chestplate") - add(THAVMITE_VANGUARD_LEGGINGS.get(), "[WIP]Thavmite Vanguard Leggings") + add(T7Items.THAVMITE_VANGUARD_BOOTS.get(), "[WIP]Thavmite Vanguard Boots") + add(T7Items.THAVMITE_VANGUARD_HELMET.get(), "[WIP]Thavmite Vanguard Helmet") + add(T7Items.THAVMITE_VANGUARD_CHESTPLATE.get(), "[WIP]Thavmite Vanguard Chestplate") + add(T7Items.THAVMITE_VANGUARD_LEGGINGS.get(), "[WIP]Thavmite Vanguard Leggings") for ((aspect, shard) in T7Items.SHARDS) add(shard.get(), aspectTranslations[aspect]!! + " Shard") - add(THAVMITE_SWORD.get(), "Thavmite Sword") + add(T7Items.THAVMITE_SWORD.get(), "Thavmite Sword") add(T7Items.THAVMITE_AXE.get(), "Thavmite Axe") - add(THAVMITE_PICKAXE.get(), "Thavmite Pickaxe") - add(THAVMITE_HAMMER.get(), "Thavmite Hammer") - add(THAVMITE_SHOVEL.get(), "Thavmite Shovel") - add(THAVMITE_HOE.get(), "Thavmite Hoe") - add(THAVMITE_KATANA.get(), "[WIP]Thavmite Katana") - add(ZEPHYR.get(), "[WIP]Zephyr") + add(T7Items.THAVMITE_PICKAXE.get(), "Thavmite Pickaxe") + add(T7Items.THAVMITE_HAMMER.get(), "Thavmite Hammer") + add(T7Items.THAVMITE_SHOVEL.get(), "Thavmite Shovel") + add(T7Items.THAVMITE_HOE.get(), "Thavmite Hoe") + add(T7Items.THAVMITE_KATANA.get(), "[WIP]Thavmite Katana") + add(T7Items.ZEPHYR.get(), "[WIP]Zephyr") add(T7Items.AXE_OF_THE_FOREST.get(), "Axe of the Forest") val platingNames: MutableMap = HashMap() - platingNames[IRON.get()] = "Iron Plated" - platingNames[GOLD.get()] = "Gold Plated" - platingNames[ORICHALCUM.get()] = "Orichalcum Plated" - platingNames[THAVMITE.get()] = "Thavmite Plated" + platingNames[WandPlatingMaterials.IRON.get()] = "Iron Plated" + platingNames[WandPlatingMaterials.GOLD.get()] = "Gold Plated" + platingNames[WandPlatingMaterials.ORICHALCUM.get()] = "Orichalcum Plated" + platingNames[WandPlatingMaterials.THAVMITE.get()] = "Thavmite Plated" val coreNames: MutableMap = HashMap() - coreNames[WOOD.get()] = "Wooden" - coreNames[GREATWOOD.get()] = "Greatwood" - coreNames[SILVERWOOD.get()] = "Silverwood" + coreNames[WandCoreMaterials.WOOD.get()] = "Wooden" + coreNames[WandCoreMaterials.GREATWOOD.get()] = "Greatwood" + coreNames[WandCoreMaterials.SILVERWOOD.get()] = "Silverwood" for ((pKey, pName) in platingNames) for ((cKey, cName) in coreNames) { - val wand = wandOrThrow(pKey, cKey) + val wand = T7Items.wandOrThrow(pKey, cKey) add(wand, "$pName $cName Wand") } @@ -199,48 +128,49 @@ class T7LanguageProvider(output: PackOutput, locale: String) : LanguageProvider( add(T7Items.FOCUS_EXCHANGE.get(), "Focus: Exchange") add(T7Items.FOCUS_LIGHTNING.get(), "[WIP]Focus: Lightning") - add(AURA_NODE.get(), "Aura Node") - add(CRUCIBLE.get(), "Crucible") - add(ARCANE_WORKBENCH.get(), "Arcane Workbench") - add(MATRIX.get(), "Infusion Matrix") - add(PILLAR.get(), "Infusion Pillar") - add(PEDESTAL.get(), "Infusion Pedestal") - add(RESEARCH_TABLE.get(), "Research Table") - add(TABLE.get(), "Table") - add(ITEM_HATCH.get(), "Item Hatch") - add(ELEMENTAL_STONE.get(), "Elemental Stone") - add(ELEMENTAL_STONE_STAIRS.get(), "Elemental Stone Stairs") - add(ELEMENTAL_STONE_SLAB.get(), "Elemental Stone Slab") - add(ELEMENTAL_CORE.get(), "Elemental Core") - add(CRACKED_ELEMENTAL_STONE.get(), "Cracked Elemental Stone") - add(ELEMENTAL_STONE_BRICKS.get(), "Elemental Stone Bricks") - - add(ARCANE_LEVITATOR.get(), "Arcane Levitator") - add(LEVITATOR_COLUMN.get(), "Arcane Levitator Column") + add(T7Blocks.AURA_NODE.get(), "Aura Node") + add(T7Blocks.CRUCIBLE.get(), "Crucible") + add(T7Blocks.ARCANE_WORKBENCH.get(), "Arcane Workbench") + add(T7Blocks.MATRIX.get(), "Infusion Matrix") + add(T7Blocks.PILLAR.get(), "Infusion Pillar") + add(T7Blocks.PEDESTAL.get(), "Infusion Pedestal") + add(T7Blocks.RESEARCH_TABLE.get(), "Research Table") + add(T7Blocks.TABLE.get(), "Table") + add(T7Blocks.ITEM_HATCH.get(), "Item Hatch") + add(T7Blocks.ELEMENTAL_STONE.get(), "Elemental Stone") + add(T7Blocks.ELEMENTAL_STONE_STAIRS.get(), "Elemental Stone Stairs") + add(T7Blocks.ELEMENTAL_STONE_SLAB.get(), "Elemental Stone Slab") + add(T7Blocks.ELEMENTAL_CORE.get(), "Elemental Core") + add(T7Blocks.CRACKED_ELEMENTAL_STONE.get(), "Cracked Elemental Stone") + add(T7Blocks.ELEMENTAL_STONE_BRICKS.get(), "Elemental Stone Bricks") + + add(T7Blocks.ARCANE_LEVITATOR.get(), "Arcane Levitator") + add(T7Blocks.LEVITATOR_COLUMN.get(), "Arcane Levitator Column") for ((aspect, infusedStone) in T7Blocks.INFUSED_STONES) add(infusedStone.get(), aspectTranslations[aspect]!! + " Infused Stone") for ((aspect, infusedDeepslate) in T7Blocks.INFUSED_DEEPSLATES) add(infusedDeepslate.get(), aspectTranslations[aspect]!! + " Infused Deepslate") - add(THAVMITE_BLOCK.get(), "Thavmite Block") - add(ORICHALCUM_BLOCK.get(), "Orichalcum Block") - - add(GREATWOOD_LOG.get(), "Greatwood Log") - add(GREATWOOD_LEAVES.get(), "Greatwood Leaves") - add(GREATWOOD_PLANKS.get(), "Greatwood Planks") - add(GREATWOOD_STAIRS.get(), "Greatwood Stairs") - add(GREATWOOD_SLAB.get(), "Greatwood Slab") - add(GREATWOOD_SAPLING.get(), "Greatwood Sapling") - add(SILVERWOOD_LOG.get(), "Silverwood Log") - add(SILVERWOOD_LEAVES.get(), "Silverwood Leaves") - add(SILVERWOOD_PLANKS.get(), "Silverwood Planks") - add(SILVERWOOD_SAPLING.get(), "Silverwood Sapling") - - add(SEALING_JAR.get(), "Sealing Jar") + add(T7Blocks.THAVMITE_BLOCK.get(), "Thavmite Block") + add(T7Blocks.ORICHALCUM_BLOCK.get(), "Orichalcum Block") + + add(T7Blocks.GREATWOOD_LOG.get(), "Greatwood Log") + add(T7Blocks.GREATWOOD_LEAVES.get(), "Greatwood Leaves") + add(T7Blocks.GREATWOOD_PLANKS.get(), "Greatwood Planks") + add(T7Blocks.GREATWOOD_STAIRS.get(), "Greatwood Stairs") + add(T7Blocks.GREATWOOD_SLAB.get(), "Greatwood Slab") + add(T7Blocks.GREATWOOD_SAPLING.get(), "Greatwood Sapling") + add(T7Blocks.SILVERWOOD_LOG.get(), "Silverwood Log") + add(T7Blocks.SILVERWOOD_LEAVES.get(), "Silverwood Leaves") + add(T7Blocks.SILVERWOOD_PLANKS.get(), "Silverwood Planks") + add(T7Blocks.SILVERWOOD_SAPLING.get(), "Silverwood Sapling") + + add(T7Blocks.SEALING_JAR.get(), "Sealing Jar") add(T7Items.NODE_JAR.get(), "Node in a Jar") - add(ETERNAL_FLAME.get(), "Eternal Flame") - add(HUNGRY_CHEST.get(), "Hungry Chest") + add(T7Blocks.ETERNAL_FLAME.get(), "Eternal Flame") + add(T7Blocks.HUNGRY_CHEST.get(), "Hungry Chest") + add(T7Blocks.HOLE.get(), "Hole Block") add(WorkbenchBlock.CONTAINER_TITLE, "Arcane Workbench") add(HungryChestBlock.CONTAINER_TITLE, "Hungry Chest") @@ -252,7 +182,7 @@ class T7LanguageProvider(output: PackOutput, locale: String) : LanguageProvider( add(ButtonWidget.leftTranslationId, "Previous Page") add(ButtonWidget.rightTranslationId, "Next Page") - add(REVEALING, "Revealing") + add(T7Attributes.REVEALING, "Revealing") add(T7EntityTypes.ANGRY_ZOMBIE.get(), "Angry Zombie") add(T7Items.ANGRY_ZOMBIE_SPAWN_EGG.get(), "Angry Zombie Spawn Egg") @@ -312,7 +242,7 @@ class T7LanguageProvider(output: PackOutput, locale: String) : LanguageProvider( """ ) - add(RESEARCH_SCROLL.get().completedTranslation(), "Completed Research") + add(T7Items.RESEARCH_SCROLL.get().completedTranslation(), "Completed Research") add(ResearchEntry.TOAST_TRANSLATION, "Research Complete!") add(ResearchEntry.SCROLL_GIVEN_TRANSLATION, "You have received a research scroll") add(ResearchEntry.PARENTS_UNKNOWN_TRANSLATION, "You are missing required knowledge for this research") diff --git a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7BlockEntities.kt b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7BlockEntities.kt index 30a0f912..d9e1c424 100644 --- a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7BlockEntities.kt +++ b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7BlockEntities.kt @@ -79,4 +79,8 @@ object T7BlockEntities { val HUNGRY_CHEST = REGISTRAR.register("hungry_chest") { -> BlockEntityType.Builder.of(::HungryChestBE, T7Blocks.HUNGRY_CHEST.get()).build(null) } + + val HOLE = REGISTRAR.register("hole") { -> + BlockEntityType.Builder.of(::HoleBE, T7Blocks.HOLE.get()).build(null) + } } diff --git a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Blocks.kt b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Blocks.kt index 3c3f0367..151d02da 100644 --- a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Blocks.kt +++ b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Blocks.kt @@ -99,6 +99,8 @@ object T7Blocks { val HUNGRY_CHEST = register("hungry_chest") { HungryChestBlock() } + val HOLE = register("hole") { HoleBlock() } + private fun register(name: String, sup: Supplier): DeferredBlock { val block = REGISTRAR.register(name, sup) T7Items.REGISTRAR.registerSimpleBlockItem(name, block) diff --git a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Items.kt b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Items.kt index 67c2a638..cf1c0abe 100644 --- a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Items.kt +++ b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7Items.kt @@ -198,7 +198,7 @@ object T7Items { val FOCUS_EXCAVATION = REGISTRAR.registerItem("focus_excavation") { ExcavationFocus() } val FOCUS_ENDERCHEST = REGISTRAR.registerItem("focus_enderchest") { EnderChestFocus() } val FOCUS_LIGHT = REGISTRAR.registerItem("focus_light") { LightFocus() } - val FOCUS_HOLE = REGISTRAR.registerItem("focus_hole", ::Item) + val FOCUS_HOLE = REGISTRAR.registerItem("focus_hole") { HoleFocus() } val FOCUS_ENDERPEARL = REGISTRAR.registerItem("focus_enderpearl") { EnderpearlFocus() } val FOCUS_EXCHANGE = REGISTRAR.registerItem("focus_exchange") { ExchangeFocus() } val FOCUS_LIGHTNING = REGISTRAR.registerItem("focus_lightning", ::Item) From 83c8da89c5ec14fc36c3d0ff60397bb0c4a1816d Mon Sep 17 00:00:00 2001 From: alegian Date: Mon, 23 Feb 2026 13:45:29 +0200 Subject: [PATCH 2/6] hole renderer --- .../tags/block/relocation_not_supported.json | 3 +- .../impl/client/event/T7ClientGameEvents.kt | 7 +++- .../impl/client/event/T7ClientModEvents.kt | 1 + .../client/renderer/blockentity/HoleBER.kt | 38 +++++++++++++++++++ .../thavma/impl/common/block/HoleBlock.kt | 11 ++++++ .../init/data/providers/T7BlockTagProvider.kt | 3 +- 6 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt diff --git a/src/generated/resources/data/c/tags/block/relocation_not_supported.json b/src/generated/resources/data/c/tags/block/relocation_not_supported.json index 0ddb9c27..93d49ffe 100644 --- a/src/generated/resources/data/c/tags/block/relocation_not_supported.json +++ b/src/generated/resources/data/c/tags/block/relocation_not_supported.json @@ -1,6 +1,7 @@ { "values": [ "thavma:research_table", - "thavma:infusion_pillar" + "thavma:infusion_pillar", + "thavma:hole" ] } \ No newline at end of file diff --git a/src/main/java/me/alegian/thavma/impl/client/event/T7ClientGameEvents.kt b/src/main/java/me/alegian/thavma/impl/client/event/T7ClientGameEvents.kt index fa90833c..0c354ed9 100644 --- a/src/main/java/me/alegian/thavma/impl/client/event/T7ClientGameEvents.kt +++ b/src/main/java/me/alegian/thavma/impl/client/event/T7ClientGameEvents.kt @@ -15,6 +15,7 @@ import me.alegian.thavma.impl.client.renderer.HammerHighlightRenderer import me.alegian.thavma.impl.client.renderer.NodeAbsorbRenderer import me.alegian.thavma.impl.common.aspect.AspectHelper import me.alegian.thavma.impl.common.block.AuraNodeBlock +import me.alegian.thavma.impl.common.block.HoleBlock import me.alegian.thavma.impl.common.data.capability.AspectContainer import me.alegian.thavma.impl.common.item.HammerItem import me.alegian.thavma.impl.common.item.WandItem @@ -59,8 +60,10 @@ private fun renderBlockHighlight(event: RenderHighlightEvent.Block) { allowHammerOutlineEvents = true } - // aura nodes have no outline - if (level.getBlockState(targetPos).block is AuraNodeBlock) event.isCanceled = true + if ( + level.getBlockState(targetPos).block === T7Blocks.AURA_NODE.get() || + level.getBlockState(targetPos).block === T7Blocks.HOLE.get() + ) event.isCanceled = true } private fun renderLevelAfterWeather(event: RenderLevelStageEvent) { diff --git a/src/main/java/me/alegian/thavma/impl/client/event/T7ClientModEvents.kt b/src/main/java/me/alegian/thavma/impl/client/event/T7ClientModEvents.kt index 35f385ad..cb3f7489 100644 --- a/src/main/java/me/alegian/thavma/impl/client/event/T7ClientModEvents.kt +++ b/src/main/java/me/alegian/thavma/impl/client/event/T7ClientModEvents.kt @@ -62,6 +62,7 @@ private fun registerEntityRenderers(event: RegisterRenderers) { event.registerBlockEntityRenderer(T7BlockEntities.MATRIX.get()) { _ -> MatrixBER() } event.registerBlockEntityRenderer(T7BlockEntities.PILLAR.get()) { _ -> PillarBER() } event.registerBlockEntityRenderer(T7BlockEntities.PEDESTAL.get()) { _ -> PedestalBER() } + event.registerBlockEntityRenderer(T7BlockEntities.HOLE.get()) { _ -> HoleBER() } event.registerBlockEntityRenderer(T7BlockEntities.HUNGRY_CHEST.get()) { ctx -> HungryChestBER(ctx) } event.registerEntityRenderer(T7EntityTypes.FANCY_ITEM.get()) { ctx -> FancyItemER(ctx) } event.registerEntityRenderer(T7EntityTypes.ANGRY_ZOMBIE.get()) { ctx -> AngryZombieER(ctx) } diff --git a/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt new file mode 100644 index 00000000..abe9f520 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt @@ -0,0 +1,38 @@ +package me.alegian.thavma.impl.client.renderer.blockentity + +import com.mojang.blaze3d.vertex.PoseStack +import com.mojang.blaze3d.vertex.VertexConsumer +import me.alegian.thavma.impl.common.block.entity.HoleBE +import me.alegian.thavma.impl.common.util.use +import net.minecraft.client.renderer.MultiBufferSource +import net.minecraft.client.renderer.RenderType +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer +import net.minecraft.core.Direction +import net.minecraft.world.level.block.Block +import org.joml.Vector3f + +class HoleBER : BlockEntityRenderer { + override fun render(be: HoleBE, partialTick: Float, poseStack: PoseStack, bufferSource: MultiBufferSource, combinedLight: Int, combinedOverlay: Int) { + val vc = bufferSource.getBuffer(RenderType.endGateway()) + poseStack.run { + translate(0.5f, 0.5f, 0.5f) + for (direction in Direction.entries) + renderQuad(be, vc, poseStack, direction) + } + } + + private fun renderQuad(be: HoleBE, vertexConsumer: VertexConsumer, poseStack: PoseStack, direction: Direction) { + val level = be.level ?: return + if (Block.shouldRenderFace(be.blockState, level, be.blockPos, direction, be.blockPos.relative(direction))) + return + + poseStack.use { + mulPose(direction.rotation) + translate(0f, 0.4995f, 0f) + vertexConsumer.addVertex(poseStack.last(), Vector3f(-0.5f, 0f, -0.5f)) + vertexConsumer.addVertex(poseStack.last(), Vector3f(0.5f, 0f, -0.5f)) + vertexConsumer.addVertex(poseStack.last(), Vector3f(0.5f, 0f, 0.5f)) + vertexConsumer.addVertex(poseStack.last(), Vector3f(-0.5f, 0f, 0.5f)) + } + } +} diff --git a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt index 8c74f607..7ab4b123 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -2,12 +2,19 @@ package me.alegian.thavma.impl.common.block import me.alegian.thavma.impl.common.block.entity.HoleBE import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.LevelReader import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.phys.HitResult +import net.neoforged.neoforge.common.util.TriState class HoleBlock : Block( Properties.of() @@ -22,4 +29,8 @@ class HoleBlock : Block( override fun newBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = HoleBE(pos, state) override fun getRenderShape(state: BlockState) = RenderShape.INVISIBLE + + override fun canSustainPlant(state: BlockState, level: BlockGetter, soilPosition: BlockPos, facing: Direction, plant: BlockState) = TriState.TRUE + + override fun getCloneItemStack(state: BlockState, target: HitResult, level: LevelReader, pos: BlockPos, player: Player) = ItemStack.EMPTY } diff --git a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt index 44b0793f..9da47332 100644 --- a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt +++ b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt @@ -79,7 +79,8 @@ class T7BlockTagProvider(output: PackOutput, lookupProvider: CompletableFuture Date: Mon, 23 Feb 2026 14:17:47 +0200 Subject: [PATCH 3/6] ticker --- .../thavma/impl/common/block/HoleBlock.kt | 8 ++++++ .../thavma/impl/common/block/entity/HoleBE.kt | 18 ++++++++++++- .../thavma/impl/common/item/HoleFocus.kt | 25 ++++++++++++++++--- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt index 7ab4b123..5862fd18 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -1,17 +1,22 @@ package me.alegian.thavma.impl.common.block import me.alegian.thavma.impl.common.block.entity.HoleBE +import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level import net.minecraft.world.level.LevelReader +import net.minecraft.world.level.block.BaseEntityBlock import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.entity.BlockEntityTicker +import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.HitResult import net.neoforged.neoforge.common.util.TriState @@ -33,4 +38,7 @@ class HoleBlock : Block( override fun canSustainPlant(state: BlockState, level: BlockGetter, soilPosition: BlockPos, facing: Direction, plant: BlockState) = TriState.TRUE override fun getCloneItemStack(state: BlockState, target: HitResult, level: LevelReader, pos: BlockPos, player: Player) = ItemStack.EMPTY + + override fun getTicker(level: Level, state: BlockState, type: BlockEntityType) = + BaseEntityBlock.createTickerHelper(type, T7BlockEntities.HOLE.get()) { _, _, _, be -> be.serverTick() } } diff --git a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt index 36b1a7b3..942d1408 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt @@ -2,7 +2,23 @@ package me.alegian.thavma.impl.common.block.entity import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities import net.minecraft.core.BlockPos +import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState -class HoleBE(pos: BlockPos, state: BlockState) : BlockEntity(T7BlockEntities.HOLE.get(), pos, state) +class HoleBE(pos: BlockPos, state: BlockState) : BlockEntity(T7BlockEntities.HOLE.get(), pos, state) { + private var lifetimeTicks = 120 + var originalState: BlockState? = null + + fun serverTick() { + if (lifetimeTicks <= 0) { + val state = originalState + if (state != null) { + level?.setBlock(blockPos, state, Block.UPDATE_CLIENTS) + } else { + level?.removeBlock(blockPos, false) + } + } + lifetimeTicks-- + } +} diff --git a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt index 262475ed..9b62cbb0 100644 --- a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt +++ b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt @@ -1,7 +1,26 @@ package me.alegian.thavma.impl.common.item +import me.alegian.thavma.impl.common.util.getBE +import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities +import me.alegian.thavma.impl.init.registries.deferred.T7Blocks +import net.minecraft.core.BlockPos +import net.minecraft.world.InteractionResult import net.minecraft.world.item.Item +import net.minecraft.world.item.context.UseOnContext +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block -class HoleFocus : Item( - Properties().stacksTo(1) -) +class HoleFocus : Item(Properties().stacksTo(1)) { + override fun useOn(context: UseOnContext): InteractionResult { + makeHole(context.level, context.clickedPos) + return InteractionResult.SUCCESS + } + + fun makeHole(level: Level, blockPos: BlockPos) { + if (level.getBlockEntity(blockPos) != null) return + + val state = level.getBlockState(blockPos) + level.setBlock(blockPos, T7Blocks.HOLE.get().defaultBlockState(), Block.UPDATE_CLIENTS) + level.getBE(blockPos, T7BlockEntities.HOLE.get())?.originalState = state + } +} From cf2e567e0aa9040b7a5e9b6b907381320f781d4b Mon Sep 17 00:00:00 2001 From: alegian Date: Tue, 24 Feb 2026 01:09:32 +0200 Subject: [PATCH 4/6] almost works --- .../tags/block/snow_layer_can_survive_on.json | 5 +++ .../client/renderer/blockentity/HoleBER.kt | 1 + .../thavma/impl/common/block/HoleBlock.kt | 10 ++++- .../thavma/impl/common/block/entity/HoleBE.kt | 2 + .../thavma/impl/common/item/HammerItem.kt | 3 +- .../thavma/impl/common/item/HoleFocus.kt | 38 ++++++++++++++----- .../init/data/providers/T7BlockTagProvider.kt | 4 ++ 7 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 src/generated/resources/data/minecraft/tags/block/snow_layer_can_survive_on.json diff --git a/src/generated/resources/data/minecraft/tags/block/snow_layer_can_survive_on.json b/src/generated/resources/data/minecraft/tags/block/snow_layer_can_survive_on.json new file mode 100644 index 00000000..cd566a7b --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/snow_layer_can_survive_on.json @@ -0,0 +1,5 @@ +{ + "values": [ + "thavma:hole" + ] +} \ No newline at end of file diff --git a/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt index abe9f520..c27cd929 100644 --- a/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt +++ b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt @@ -23,6 +23,7 @@ class HoleBER : BlockEntityRenderer { private fun renderQuad(be: HoleBE, vertexConsumer: VertexConsumer, poseStack: PoseStack, direction: Direction) { val level = be.level ?: return + if (direction == be.direction) return if (Block.shouldRenderFace(be.blockState, level, be.blockPos, direction, be.blockPos.relative(direction))) return diff --git a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt index 5862fd18..284bf094 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -15,10 +15,12 @@ import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.entity.BlockEntity -import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.PushReaction import net.minecraft.world.phys.HitResult +import net.minecraft.world.phys.shapes.CollisionContext +import net.minecraft.world.phys.shapes.Shapes import net.neoforged.neoforge.common.util.TriState class HoleBlock : Block( @@ -29,12 +31,18 @@ class HoleBlock : Block( .strength(-1.0F, 3600000.0F) .lightLevel { 7 } .isValidSpawn(Blocks::never) + .pushReaction(PushReaction.BLOCK) .noLootTable() ), EntityBlock { override fun newBlockEntity(pos: BlockPos, state: BlockState): BlockEntity = HoleBE(pos, state) override fun getRenderShape(state: BlockState) = RenderShape.INVISIBLE + override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext) = Shapes.empty() + override fun getBlockSupportShape(state: BlockState, level: BlockGetter, pos: BlockPos) = Shapes.block() + override fun getOcclusionShape(state: BlockState, level: BlockGetter, pos: BlockPos) = Shapes.block() + override fun getVisualShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext) = Shapes.block() + override fun canSustainPlant(state: BlockState, level: BlockGetter, soilPosition: BlockPos, facing: Direction, plant: BlockState) = TriState.TRUE override fun getCloneItemStack(state: BlockState, target: HitResult, level: LevelReader, pos: BlockPos, player: Player) = ItemStack.EMPTY diff --git a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt index 942d1408..9da6b98e 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt @@ -2,6 +2,7 @@ package me.alegian.thavma.impl.common.block.entity import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities import net.minecraft.core.BlockPos +import net.minecraft.core.Direction import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState @@ -9,6 +10,7 @@ import net.minecraft.world.level.block.state.BlockState class HoleBE(pos: BlockPos, state: BlockState) : BlockEntity(T7BlockEntities.HOLE.get(), pos, state) { private var lifetimeTicks = 120 var originalState: BlockState? = null + var direction = Direction.NORTH fun serverTick() { if (lifetimeTicks <= 0) { diff --git a/src/main/java/me/alegian/thavma/impl/common/item/HammerItem.kt b/src/main/java/me/alegian/thavma/impl/common/item/HammerItem.kt index 5cb27085..9505b47e 100644 --- a/src/main/java/me/alegian/thavma/impl/common/item/HammerItem.kt +++ b/src/main/java/me/alegian/thavma/impl/common/item/HammerItem.kt @@ -29,8 +29,7 @@ class HammerItem(tier: Tier, props: Properties) : DiggerItem(tier, BlockTags.MIN // find the 2 axes perpendicular to the block hit direction val hitAxis = direction.axis - val allAxes = listOf(Direction.Axis.X, Direction.Axis.Y, Direction.Axis.Z) - val perpendicularAxes = allAxes.filter { it !== hitAxis }.toList() + val perpendicularAxes = Direction.Axis.entries.filter { it !== hitAxis }.toList() // 3x3 area, except original block, only for correct mining tool for (i in -1..1) diff --git a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt index 9b62cbb0..d986d744 100644 --- a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt +++ b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt @@ -3,24 +3,42 @@ package me.alegian.thavma.impl.common.item import me.alegian.thavma.impl.common.util.getBE import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities import me.alegian.thavma.impl.init.registries.deferred.T7Blocks -import net.minecraft.core.BlockPos +import net.minecraft.core.Direction import net.minecraft.world.InteractionResult import net.minecraft.world.item.Item import net.minecraft.world.item.context.UseOnContext -import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block class HoleFocus : Item(Properties().stacksTo(1)) { override fun useOn(context: UseOnContext): InteractionResult { - makeHole(context.level, context.clickedPos) - return InteractionResult.SUCCESS - } + val level = context.level + if (level.isClientSide) return InteractionResult.SUCCESS + + val direction = context.clickedFace.opposite + val perpendicularAxes = Direction.Axis.entries.filter { it !== direction.axis } - fun makeHole(level: Level, blockPos: BlockPos) { - if (level.getBlockEntity(blockPos) != null) return + for (k in 0..8) { + var noneReplaced = true + for (i in -1..1) + for (j in -1..1) { + val blockPos = context.clickedPos + .relative(direction, k) + .relative(perpendicularAxes[0], i) + .relative(perpendicularAxes[1], j) - val state = level.getBlockState(blockPos) - level.setBlock(blockPos, T7Blocks.HOLE.get().defaultBlockState(), Block.UPDATE_CLIENTS) - level.getBE(blockPos, T7BlockEntities.HOLE.get())?.originalState = state + if (level.getBlockEntity(blockPos) != null) continue + val state = level.getBlockState(blockPos) + if (state.isAir) continue + + level.setBlock(blockPos, T7Blocks.HOLE.get().defaultBlockState(), Block.UPDATE_CLIENTS) + level.getBE(blockPos, T7BlockEntities.HOLE.get())?.run { + originalState = state + this.direction = direction + } + noneReplaced = false + } + if (noneReplaced) break + } + return InteractionResult.SUCCESS } } diff --git a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt index 9da47332..b19c556c 100644 --- a/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt +++ b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt @@ -82,5 +82,9 @@ class T7BlockTagProvider(output: PackOutput, lookupProvider: CompletableFuture Date: Sat, 28 Feb 2026 22:46:11 +0200 Subject: [PATCH 5/6] persistence and sounds --- .../client/renderer/blockentity/HoleBER.kt | 3 +- .../thavma/impl/common/block/entity/HoleBE.kt | 28 +++++++++++---- .../impl/common/event/T7CommonGameEvents.kt | 2 ++ .../impl/common/hole/HoleSoundManager.kt | 35 +++++++++++++++++++ .../thavma/impl/common/item/HoleFocus.kt | 19 +++++++--- .../registries/deferred/T7DataComponents.kt | 5 +++ 6 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 src/main/java/me/alegian/thavma/impl/common/hole/HoleSoundManager.kt diff --git a/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt index c27cd929..9d0aa700 100644 --- a/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt +++ b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt @@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.VertexConsumer import me.alegian.thavma.impl.common.block.entity.HoleBE import me.alegian.thavma.impl.common.util.use +import me.alegian.thavma.impl.init.registries.deferred.T7DataComponents import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.RenderType import net.minecraft.client.renderer.blockentity.BlockEntityRenderer @@ -23,7 +24,7 @@ class HoleBER : BlockEntityRenderer { private fun renderQuad(be: HoleBE, vertexConsumer: VertexConsumer, poseStack: PoseStack, direction: Direction) { val level = be.level ?: return - if (direction == be.direction) return + if (direction == be.get(T7DataComponents.HOLE_STATE)?.direction) return if (Block.shouldRenderFace(be.blockState, level, be.blockPos, direction, be.blockPos.relative(direction))) return diff --git a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt index 9da6b98e..7e490e35 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt @@ -1,26 +1,40 @@ package me.alegian.thavma.impl.common.block.entity +import com.mojang.serialization.codecs.RecordCodecBuilder import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities +import me.alegian.thavma.impl.init.registries.deferred.T7DataComponents import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.level.block.Block -import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockState -class HoleBE(pos: BlockPos, state: BlockState) : BlockEntity(T7BlockEntities.HOLE.get(), pos, state) { - private var lifetimeTicks = 120 - var originalState: BlockState? = null - var direction = Direction.NORTH +class HoleBE(pos: BlockPos, state: BlockState) : DataComponentBE(T7BlockEntities.HOLE.get(), pos, state) { + private var lifetimeTicks = LIFETIME fun serverTick() { if (lifetimeTicks <= 0) { - val state = originalState + val state = get(T7DataComponents.HOLE_STATE) if (state != null) { - level?.setBlock(blockPos, state, Block.UPDATE_CLIENTS) + level?.setBlock(blockPos, state.blockState, Block.UPDATE_CLIENTS) } else { level?.removeBlock(blockPos, false) } } lifetimeTicks-- } + + companion object{ + val LIFETIME = 120 + + data class HoleState(val blockState: BlockState, val direction: Direction){ + companion object{ + val CODEC = RecordCodecBuilder.create{ + it.group( + BlockState.CODEC.fieldOf("blockState").forGetter { it.blockState }, + Direction.CODEC.fieldOf("direction").forGetter { it.direction }, + ).apply(it){b, d -> HoleState(b, d)} + } + } + } + } } diff --git a/src/main/java/me/alegian/thavma/impl/common/event/T7CommonGameEvents.kt b/src/main/java/me/alegian/thavma/impl/common/event/T7CommonGameEvents.kt index a9c60081..1e02f75a 100644 --- a/src/main/java/me/alegian/thavma/impl/common/event/T7CommonGameEvents.kt +++ b/src/main/java/me/alegian/thavma/impl/common/event/T7CommonGameEvents.kt @@ -2,6 +2,7 @@ package me.alegian.thavma.impl.common.event import me.alegian.thavma.impl.common.enchantment.ShriekResistance import me.alegian.thavma.impl.common.entity.isWearingStepHeightBoots +import me.alegian.thavma.impl.common.hole.HoleSoundManager import me.alegian.thavma.impl.common.item.EnderpearlFocus import me.alegian.thavma.impl.common.item.WandItem import me.alegian.thavma.impl.common.item.WandItem.Companion.equippedFocus @@ -119,4 +120,5 @@ fun registerCommonGameEvents() { KFF_GAME_BUS.addListener(TreeFelling::levelTick) KFF_GAME_BUS.addListener(Exchanging::levelTick) KFF_GAME_BUS.addListener(EnderpearlFocus::enderpearlTeleport) + KFF_GAME_BUS.addListener(HoleSoundManager::levelTick) } \ No newline at end of file diff --git a/src/main/java/me/alegian/thavma/impl/common/hole/HoleSoundManager.kt b/src/main/java/me/alegian/thavma/impl/common/hole/HoleSoundManager.kt new file mode 100644 index 00000000..d10cb972 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/hole/HoleSoundManager.kt @@ -0,0 +1,35 @@ +package me.alegian.thavma.impl.common.hole + +import me.alegian.thavma.impl.common.block.entity.HoleBE +import net.minecraft.core.BlockPos +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource +import net.minecraft.world.level.Level +import net.neoforged.neoforge.event.tick.LevelTickEvent + +// X ticks after opening hole, play closing sound +object HoleSoundManager{ + private val instances = mutableListOf() + + fun levelTick(event: LevelTickEvent.Post) { + val iterator = instances.iterator() + while (iterator.hasNext()) { + val instance = iterator.next() + if (instance.level !== event.level) return + if (instance.lifetimeTicks == 0) { + iterator.remove() + event.level.playSound(null, instance.blockPos, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS) + } else instance.lifetimeTicks-- + } + } + + fun create(blockPos: BlockPos, level: Level) = + instances.add(HoleSound(HoleBE.LIFETIME, blockPos, level)) + + + private data class HoleSound( + var lifetimeTicks: Int, + val blockPos: BlockPos, + val level: Level + ) +} \ No newline at end of file diff --git a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt index d986d744..afda770a 100644 --- a/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt +++ b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt @@ -1,9 +1,15 @@ package me.alegian.thavma.impl.common.item +import me.alegian.thavma.impl.common.block.entity.HoleBE +import me.alegian.thavma.impl.common.hole.HoleSoundManager import me.alegian.thavma.impl.common.util.getBE import me.alegian.thavma.impl.init.registries.deferred.T7BlockEntities import me.alegian.thavma.impl.init.registries.deferred.T7Blocks +import me.alegian.thavma.impl.init.registries.deferred.T7DataComponents import net.minecraft.core.Direction +import net.minecraft.server.level.ServerLevel +import net.minecraft.sounds.SoundEvents +import net.minecraft.sounds.SoundSource import net.minecraft.world.InteractionResult import net.minecraft.world.item.Item import net.minecraft.world.item.context.UseOnContext @@ -12,7 +18,8 @@ import net.minecraft.world.level.block.Block class HoleFocus : Item(Properties().stacksTo(1)) { override fun useOn(context: UseOnContext): InteractionResult { val level = context.level - if (level.isClientSide) return InteractionResult.SUCCESS + level.playSound(context.player, context.clickedPos, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS) + if (level.isClientSide || level !is ServerLevel) return InteractionResult.SUCCESS val direction = context.clickedFace.opposite val perpendicularAxes = Direction.Axis.entries.filter { it !== direction.axis } @@ -31,14 +38,16 @@ class HoleFocus : Item(Properties().stacksTo(1)) { if (state.isAir) continue level.setBlock(blockPos, T7Blocks.HOLE.get().defaultBlockState(), Block.UPDATE_CLIENTS) - level.getBE(blockPos, T7BlockEntities.HOLE.get())?.run { - originalState = state - this.direction = direction - } + level.getBE(blockPos, T7BlockEntities.HOLE.get())?.set( + T7DataComponents.HOLE_STATE, + HoleBE.Companion.HoleState(state, direction) + ) noneReplaced = false } if (noneReplaced) break } + + HoleSoundManager.create(context.clickedPos, context.level) return InteractionResult.SUCCESS } } diff --git a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7DataComponents.kt b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7DataComponents.kt index e57af6f0..25cc75fe 100644 --- a/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7DataComponents.kt +++ b/src/main/java/me/alegian/thavma/impl/init/registries/deferred/T7DataComponents.kt @@ -2,6 +2,7 @@ package me.alegian.thavma.impl.init.registries.deferred import me.alegian.thavma.impl.Thavma import me.alegian.thavma.impl.common.aspect.AspectMap +import me.alegian.thavma.impl.common.block.entity.HoleBE import me.alegian.thavma.impl.common.infusion.InfusionState import me.alegian.thavma.impl.common.item.WandMode import me.alegian.thavma.impl.common.research.ResearchState @@ -54,4 +55,8 @@ object T7DataComponents { it.persistent(BuiltInRegistries.BLOCK.byNameCodec()) .networkSynchronized(ByteBufCodecs.registry(Registries.BLOCK)) } + + val HOLE_STATE = REGISTRAR.registerComponentType("hole_state") { + it.persistent(HoleBE.Companion.HoleState.CODEC) + } } From 2aff71b12c8e60ceb324b1163003a1d9f3d5a7ec Mon Sep 17 00:00:00 2001 From: alegian Date: Sun, 1 Mar 2026 23:34:07 +0200 Subject: [PATCH 6/6] fluid compat --- .../java/me/alegian/thavma/impl/common/block/HoleBlock.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt index 284bf094..2d7452a8 100644 --- a/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos import net.minecraft.core.Direction import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.context.BlockPlaceContext import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.Level import net.minecraft.world.level.LevelReader @@ -17,7 +18,9 @@ import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.level.material.Fluid import net.minecraft.world.level.material.PushReaction +import net.minecraft.world.level.pathfinder.PathComputationType import net.minecraft.world.phys.HitResult import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.Shapes @@ -45,6 +48,11 @@ class HoleBlock : Block( override fun canSustainPlant(state: BlockState, level: BlockGetter, soilPosition: BlockPos, facing: Direction, plant: BlockState) = TriState.TRUE + override fun canBeReplaced(state: BlockState, fluid: Fluid) = false + override fun canBeReplaced(state: BlockState, useContext: BlockPlaceContext) = false + + override fun isPathfindable(state: BlockState, pathComputationType: PathComputationType) = false + override fun getCloneItemStack(state: BlockState, target: HitResult, level: LevelReader, pos: BlockPos, player: Player) = ItemStack.EMPTY override fun getTicker(level: Level, state: BlockState, type: BlockEntityType) =