Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/generated/resources/assets/thavma/blockstates/hole.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "thavma:block/hole"
}
}
}
1 change: 1 addition & 0 deletions src/generated/resources/assets/thavma/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
3 changes: 3 additions & 0 deletions src/generated/resources/assets/thavma/models/block/hole.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"parent": "minecraft:block/air"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"values": [
"thavma:research_table",
"thavma:infusion_pillar"
"thavma:infusion_pillar",
"thavma:hole"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"values": [
"thavma:hole"
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) }
Expand Down
Original file line number Diff line number Diff line change
@@ -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<HoleBE> {
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))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 <T : BlockEntity?> getTicker(level: Level, state: BlockState, type: BlockEntityType<T>): BlockEntityTicker<T>? {
return BaseEntityBlock.createTickerHelper(type, AURA_NODE.get(), AuraNodeBE::tick)
Expand Down
60 changes: 60 additions & 0 deletions src/main/java/me/alegian/thavma/impl/common/block/HoleBlock.kt
Original file line number Diff line number Diff line change
@@ -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 <T : BlockEntity> getTicker(level: Level, state: BlockState, type: BlockEntityType<T>) =
BaseEntityBlock.createTickerHelper(type, T7BlockEntities.HOLE.get()) { _, _, _, be -> be.serverTick() }
}
40 changes: 40 additions & 0 deletions src/main/java/me/alegian/thavma/impl/common/block/entity/HoleBE.kt
Original file line number Diff line number Diff line change
@@ -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<HoleState>{
it.group(
BlockState.CODEC.fieldOf("blockState").forGetter { it.blockState },
Direction.CODEC.fieldOf("direction").forGetter { it.direction },
).apply(it){b, d -> HoleState(b, d)}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Original file line number Diff line number Diff line change
@@ -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<HoleSound>()

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
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/me/alegian/thavma/impl/common/item/HoleFocus.kt
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"))
Expand All @@ -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)
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,12 @@ class T7BlockTagProvider(output: PackOutput, lookupProvider: CompletableFuture<H

tag(Tags.Blocks.RELOCATION_NOT_SUPPORTED).add(
T7Blocks.RESEARCH_TABLE.get(),
T7Blocks.PILLAR.get()
T7Blocks.PILLAR.get(),
T7Blocks.HOLE.get(),
)

tag(BlockTags.SNOW_LAYER_CAN_SURVIVE_ON).add(
T7Blocks.HOLE.get()
)
}
}
Loading
Loading