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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public static void initialize() {
ModItems.initialize(Balm.getItems());
ModNetworking.initialize(Balm.getNetworking());
ModSounds.initialize(Balm.getSounds());
SpookyDoorsConfig.initialize();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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<String> rules = new ArrayList<>();
@Comment("Make the doors randomly open slightly. Doesn't affect gameplay.")
@ExpectedType(boolean.class)
public boolean random_spook = false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,11 +18,9 @@
public class SpookyDoorBlockEntityRenderer implements BlockEntityRenderer<SpookyDoorBlockEntity> {

private final BlockRenderDispatcher blockRenderDispatcher;
private final RandomSource randomSource;

public SpookyDoorBlockEntityRenderer(BlockEntityRendererProvider.Context context) {
blockRenderDispatcher = context.getBlockRenderDispatcher();
randomSource = RandomSource.create();
}

@Override
Expand All @@ -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();
}

Expand Down