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/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/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/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..9d0aa700 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/client/renderer/blockentity/HoleBER.kt @@ -0,0 +1,40 @@ +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 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 +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 (direction == be.get(T7DataComponents.HOLE_STATE)?.direction) 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/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..2d7452a8 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt @@ -0,0 +1,60 @@ +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.item.context.BlockPlaceContext +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.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 +import net.neoforged.neoforge.common.util.TriState + +class HoleBlock : Block( + Properties.of() + .noCollission() + .noOcclusion() + .noTerrainParticles() + .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 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) = + 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 new file mode 100644 index 00000000..7e490e35 --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt @@ -0,0 +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.state.BlockState + +class HoleBE(pos: BlockPos, state: BlockState) : DataComponentBE(T7BlockEntities.HOLE.get(), pos, state) { + private var lifetimeTicks = LIFETIME + + fun serverTick() { + if (lifetimeTicks <= 0) { + val state = get(T7DataComponents.HOLE_STATE) + if (state != null) { + 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/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 new file mode 100644 index 00000000..afda770a --- /dev/null +++ b/src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt @@ -0,0 +1,53 @@ +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 +import net.minecraft.world.level.block.Block + +class HoleFocus : Item(Properties().stacksTo(1)) { + override fun useOn(context: UseOnContext): InteractionResult { + val level = context.level + 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 } + + 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) + + 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())?.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/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/T7BlockTagProvider.kt b/src/main/java/me/alegian/thavma/impl/init/data/providers/T7BlockTagProvider.kt index 44b0793f..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 @@ -79,7 +79,12 @@ class T7BlockTagProvider(output: PackOutput, lookupProvider: CompletableFuture = 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/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) + } } 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)