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..9816b69 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 = false; } 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); + } + } } 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) { 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..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 @@ -3,14 +3,13 @@ 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.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.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 +18,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 @@ -43,11 +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); - blockRenderDispatcher.getModelRenderer().tesselateBlock(level, blockRenderDispatcher.getBlockModel(stateForRender), stateForRender, pos, poseStack, vertexConsumer, false, randomSource, stateForRender.getSeed(pos), OverlayTexture.NO_OVERLAY); + 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; + + blockRenderDispatcher.getModelRenderer().renderModel(poseStack.last(), vertexConsumer, stateForRender, blockRenderDispatcher.getBlockModel(stateForRender), r, g, b, light, overlay); poseStack.popPose(); }