From d46dc2722a5530494f7beb54c78e706f64b7f21a Mon Sep 17 00:00:00 2001 From: SonoPG Date: Mon, 13 Apr 2026 19:42:41 +0200 Subject: [PATCH 1/6] Fix npcs opening doors --- .../mods/spookydoors/block/SpookyDoorBlock.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/block/SpookyDoorBlock.java b/common/src/main/java/net/blay09/mods/spookydoors/block/SpookyDoorBlock.java index 2c04328..db4bbe0 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/block/SpookyDoorBlock.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/block/SpookyDoorBlock.java @@ -17,6 +17,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockSetType; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.BooleanOp; import net.minecraft.world.phys.shapes.CollisionContext; @@ -158,4 +159,14 @@ public void onPlace(BlockState state, Level level, BlockPos pos, BlockState prev } } } + + @Override + public void setOpen(@Nullable Entity entity, Level level, BlockState state, BlockPos pos, boolean value) { + if (state.is(this) && state.getValue(OPEN) != value) { + if (level.getBlockEntity(pos) instanceof SpookyDoorBlockEntity spookyDoor) { + spookyDoor.setOpennessBy(value ? 1f : 0f, entity); + } + level.gameEvent(entity, value ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos); + } + } } From d4d894fd7a3d656b8da0cd4e7201386d281ce780 Mon Sep 17 00:00:00 2001 From: SonoPG Date: Mon, 13 Apr 2026 19:42:58 +0200 Subject: [PATCH 2/6] =?UTF-8?q?Add=20spooky=20mechanic=20=F0=9F=91=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blay09/mods/spookydoors/SpookyDoors.java | 1 + .../spookydoors/SpookyDoorsConfigData.java | 13 +++-------- .../block/entity/SpookyDoorBlockEntity.java | 22 +++++++++++++++++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoors.java b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoors.java index f896c1d..e1a6d34 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoors.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoors.java @@ -17,6 +17,7 @@ public static void initialize() { ModItems.initialize(Balm.getItems()); ModNetworking.initialize(Balm.getNetworking()); ModSounds.initialize(Balm.getSounds()); + SpookyDoorsConfig.initialize(); } } diff --git a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java index 5c25729..3a1866b 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java @@ -5,16 +5,9 @@ import net.blay09.mods.balm.api.config.Config; import net.blay09.mods.balm.api.config.ExpectedType; -import java.util.ArrayList; -import java.util.List; - @Config(SpookyDoors.MOD_ID) public class SpookyDoorsConfigData implements BalmConfigData { - @Comment("IDs of inbuilt rulesets to enable. For example, \"waystones:generated_waystones\" makes all generated waystones unbreakable.") - @ExpectedType(String.class) - public List rulesets = new ArrayList<>(); - - @Comment("List of custom rules with comma-separated parameters in parentheses. Conditions can be defined as comma-separated list in square brackets. Will be applied in order.") - @ExpectedType(String.class) - public List rules = new ArrayList<>(); + @Comment("Make the doors randomly open slightly. Doesn't affect gameplay.") + @ExpectedType(Boolean.class) + public Boolean random_spook = Boolean.FALSE; } diff --git a/common/src/main/java/net/blay09/mods/spookydoors/block/entity/SpookyDoorBlockEntity.java b/common/src/main/java/net/blay09/mods/spookydoors/block/entity/SpookyDoorBlockEntity.java index 7715b98..22414f8 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/block/entity/SpookyDoorBlockEntity.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/block/entity/SpookyDoorBlockEntity.java @@ -3,11 +3,10 @@ import net.blay09.mods.balm.api.block.entity.CustomRenderBoundingBox; import net.blay09.mods.balm.common.BalmBlockEntity; import net.blay09.mods.spookydoors.ModBlockEntities; -import net.blay09.mods.spookydoors.ModBlocks; import net.blay09.mods.spookydoors.ModSounds; +import net.blay09.mods.spookydoors.SpookyDoorsConfig; import net.blay09.mods.spookydoors.block.SpookyDoorBlock; import net.minecraft.core.BlockPos; -import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; @@ -22,6 +21,7 @@ import net.minecraft.world.level.block.state.properties.BlockSetType; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; import org.joml.Math; @@ -30,6 +30,7 @@ public class SpookyDoorBlockEntity extends BalmBlockEntity implements CustomRend private static final int SYNC_INTERVAL = 1; private int ticksSinceLastSync = 0; private int soundCooldownTicks = 0; + private int spookCooldownTicks = 400; private boolean isDirty; private float openness; @@ -135,6 +136,23 @@ public void sync() { } public void serverTick() { + if (SpookyDoorsConfig.getActive().random_spook && this.getOpenness() == 0f && this.level != null) { + if (spookCooldownTicks > 0) { + spookCooldownTicks--; + } else { + spookCooldownTicks = 400; + if (this.level.random.nextInt(10) == 0) { + boolean beingWatched = this.level.players().stream().anyMatch(player -> { + Vec3 doorPlayerVec = worldPosition.getCenter().subtract(player.position()); + return doorPlayerVec.lengthSqr() < 1024 && player.getLookAngle().dot(doorPlayerVec.normalize()) > 0f; + }); + if (!beingWatched) { + this.setOpennessBy(0.3f, null); + } + } + } + } + ticksSinceLastSync++; if (ticksSinceLastSync >= SYNC_INTERVAL) { if (isDirty) { From f662732eae6a61bf13987b5b8a7d408c26afcb6b Mon Sep 17 00:00:00 2001 From: SonoPG Date: Mon, 13 Apr 2026 19:49:26 +0200 Subject: [PATCH 3/6] Fix for some versions of Balm --- .../net/blay09/mods/spookydoors/SpookyDoorsConfigData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java index 3a1866b..9816b69 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/SpookyDoorsConfigData.java @@ -8,6 +8,6 @@ @Config(SpookyDoors.MOD_ID) public class SpookyDoorsConfigData implements BalmConfigData { @Comment("Make the doors randomly open slightly. Doesn't affect gameplay.") - @ExpectedType(Boolean.class) - public Boolean random_spook = Boolean.FALSE; + @ExpectedType(boolean.class) + public boolean random_spook = false; } From 7271f0d79f037eb2986a4313b99686bde8e31d7e Mon Sep 17 00:00:00 2001 From: SonoPG Date: Tue, 14 Apr 2026 11:30:24 +0200 Subject: [PATCH 4/6] Fix black hinges --- .../client/render/SpookyDoorBlockEntityRenderer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java index 5fb595d..14d249a 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java @@ -3,6 +3,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.blay09.mods.spookydoors.block.SpookyDoorBlock; import net.blay09.mods.spookydoors.block.entity.SpookyDoorBlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; @@ -10,7 +12,6 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.Direction; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.properties.DoorHingeSide; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import org.joml.AxisAngle4d; @@ -19,11 +20,9 @@ public class SpookyDoorBlockEntityRenderer implements BlockEntityRenderer { private final BlockRenderDispatcher blockRenderDispatcher; - private final RandomSource randomSource; public SpookyDoorBlockEntityRenderer(BlockEntityRendererProvider.Context context) { blockRenderDispatcher = context.getBlockRenderDispatcher(); - randomSource = RandomSource.create(); } @Override @@ -47,7 +46,11 @@ public void render(SpookyDoorBlockEntity blockEntity, float delta, PoseStack pos poseStack.pushPose(); applyDoorPose(poseStack, baseDoor.getOpenness(), state.getValue(SpookyDoorBlock.FACING), state.getValue(SpookyDoorBlock.HINGE)); final var stateForRender = state.setValue(SpookyDoorBlock.OPEN, false); - blockRenderDispatcher.getModelRenderer().tesselateBlock(level, blockRenderDispatcher.getBlockModel(stateForRender), stateForRender, pos, poseStack, vertexConsumer, false, randomSource, stateForRender.getSeed(pos), OverlayTexture.NO_OVERLAY); + int color = Minecraft.getInstance().getBlockColors().getColor(stateForRender, level, pos, 0); + float r = (float)(color >> 16 & 0xFF) / 255.0F; + float g = (float)(color >> 8 & 0xFF) / 255.0F; + float b = (float)(color & 0xFF) / 255.0F; + blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, LevelRenderer.getLightColor(level, stateForRender, pos), OverlayTexture.NO_OVERLAY); poseStack.popPose(); } From 2e4530c237707fda704c5e31b44d5588c7320995 Mon Sep 17 00:00:00 2001 From: SonoPG Date: Tue, 14 Apr 2026 11:48:06 +0200 Subject: [PATCH 5/6] Tweak lighting values --- .../client/render/SpookyDoorBlockEntityRenderer.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java index 14d249a..d174657 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java @@ -46,11 +46,21 @@ public void render(SpookyDoorBlockEntity blockEntity, float delta, PoseStack pos poseStack.pushPose(); applyDoorPose(poseStack, baseDoor.getOpenness(), state.getValue(SpookyDoorBlock.FACING), state.getValue(SpookyDoorBlock.HINGE)); final var stateForRender = state.setValue(SpookyDoorBlock.OPEN, false); + int color = Minecraft.getInstance().getBlockColors().getColor(stateForRender, level, pos, 0); float r = (float)(color >> 16 & 0xFF) / 255.0F; float g = (float)(color >> 8 & 0xFF) / 255.0F; float b = (float)(color & 0xFF) / 255.0F; - blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, LevelRenderer.getLightColor(level, stateForRender, pos), OverlayTexture.NO_OVERLAY); + + int blockLight = (light >> 4) & 0xF; + int skyLight = (light >> 20) & 0xF; + // slightly decrease lighting + int shade = Math.round(1F / level.getShade(stateForRender.getValue(SpookyDoorBlock.FACING), true) + 0.1F) + 1; + blockLight = Math.max(0, blockLight - shade); + skyLight = Math.max(0, skyLight - shade); + int fixedLight = (blockLight << 4) | (skyLight << 20); + + blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, fixedLight, overlay); poseStack.popPose(); } From aebb985411088d976e4ae11439d53c78e0ec13d9 Mon Sep 17 00:00:00 2001 From: SonoPG Date: Tue, 14 Apr 2026 12:10:01 +0200 Subject: [PATCH 6/6] Use correct vertexConsumer --- .../render/SpookyDoorBlockEntityRenderer.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java index d174657..e89ad8e 100644 --- a/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java +++ b/common/src/main/java/net/blay09/mods/spookydoors/client/render/SpookyDoorBlockEntityRenderer.java @@ -4,13 +4,11 @@ import net.blay09.mods.spookydoors.block.SpookyDoorBlock; import net.blay09.mods.spookydoors.block.entity.SpookyDoorBlockEntity; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.Direction; import net.minecraft.world.level.block.state.properties.DoorHingeSide; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; @@ -42,25 +40,17 @@ public void render(SpookyDoorBlockEntity blockEntity, float delta, PoseStack pos } } - final var vertexConsumer = multiBufferSource.getBuffer(RenderType.cutout()); poseStack.pushPose(); applyDoorPose(poseStack, baseDoor.getOpenness(), state.getValue(SpookyDoorBlock.FACING), state.getValue(SpookyDoorBlock.HINGE)); final var stateForRender = state.setValue(SpookyDoorBlock.OPEN, false); + final var vertexConsumer = multiBufferSource.getBuffer(ItemBlockRenderTypes.getRenderType(state, false)); int color = Minecraft.getInstance().getBlockColors().getColor(stateForRender, level, pos, 0); float r = (float)(color >> 16 & 0xFF) / 255.0F; float g = (float)(color >> 8 & 0xFF) / 255.0F; float b = (float)(color & 0xFF) / 255.0F; - int blockLight = (light >> 4) & 0xF; - int skyLight = (light >> 20) & 0xF; - // slightly decrease lighting - int shade = Math.round(1F / level.getShade(stateForRender.getValue(SpookyDoorBlock.FACING), true) + 0.1F) + 1; - blockLight = Math.max(0, blockLight - shade); - skyLight = Math.max(0, skyLight - shade); - int fixedLight = (blockLight << 4) | (skyLight << 20); - - blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, fixedLight, overlay); + blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, light, overlay); poseStack.popPose(); }