Skip to content

Commit 844e9c7

Browse files
BillyGalbreathgranny
authored andcommitted
Option to make doors require redstone
1 parent b780962 commit 844e9c7

4 files changed

Lines changed: 68 additions & 89 deletions

File tree

patches/server/0144-Option-to-make-doors-require-redstone.patch

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--- a/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java
2+
+++ b/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java
3+
@@ -55,7 +_,7 @@
4+
Node nextNode = path.getNextNode();
5+
BlockPos blockPos = previousNode.asBlockPos();
6+
BlockState blockState = level.getBlockState(blockPos);
7+
- if (blockState.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock)) {
8+
+ if (blockState.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock)&& !DoorBlock.requiresRedstone(entity.level(), blockState, blockPos)) { // Purpur - Option to make doors require redstone
9+
DoorBlock doorBlock = (DoorBlock)blockState.getBlock();
10+
if (!doorBlock.isOpen(blockState)) {
11+
// CraftBukkit start - entities opening doors
12+
@@ -72,7 +_,7 @@
13+
14+
BlockPos blockPos1 = nextNode.asBlockPos();
15+
BlockState blockState1 = level.getBlockState(blockPos1);
16+
- if (blockState1.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock)) {
17+
+ if (blockState1.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock) && !DoorBlock.requiresRedstone(entity.level(), blockState1, blockPos1)) { // Purpur - Option to make doors require redstone
18+
DoorBlock doorBlock1 = (DoorBlock)blockState1.getBlock();
19+
if (!doorBlock1.isOpen(blockState1)) {
20+
// CraftBukkit start - entities opening doors
21+
@@ -118,7 +_,7 @@
22+
iterator.remove();
23+
} else {
24+
BlockState blockState = level.getBlockState(blockPos);
25+
- if (!blockState.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock)) {
26+
+ if (!blockState.is(BlockTags.MOB_INTERACTABLE_DOORS, state -> state.getBlock() instanceof DoorBlock) || DoorBlock.requiresRedstone(entity.level(), blockState, blockPos)) { // Purpur - Option to make doors require redstone
27+
iterator.remove();
28+
} else {
29+
DoorBlock doorBlock = (DoorBlock)blockState.getBlock();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--- a/net/minecraft/world/level/block/DoorBlock.java
2+
+++ b/net/minecraft/world/level/block/DoorBlock.java
3+
@@ -206,6 +_,7 @@
4+
protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
5+
if (!this.type.canOpenByHand()) {
6+
return InteractionResult.PASS;
7+
+ } else if (requiresRedstone(level, state, pos)) { return InteractionResult.CONSUME; // Purpur - Option to make doors require redstone
8+
} else {
9+
state = state.cycle(OPEN);
10+
level.setBlock(pos, state, 10);
11+
@@ -294,4 +_,18 @@
12+
public static boolean isWoodenDoor(BlockState state) {
13+
return state.getBlock() instanceof DoorBlock doorBlock && doorBlock.type().canOpenByHand();
14+
}
15+
+
16+
+ // Purpur start - Option to make doors require redstone
17+
+ public static boolean requiresRedstone(Level level, BlockState state, BlockPos pos) {
18+
+ if (level.purpurConfig.doorRequiresRedstone.contains(state.getBlock())) {
19+
+ // force update client
20+
+ BlockPos otherPos = pos.relative(state.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN);
21+
+ BlockState otherState = level.getBlockState(otherPos);
22+
+ level.sendBlockUpdated(pos, state, state, 3);
23+
+ level.sendBlockUpdated(otherPos, otherState, otherState, 3);
24+
+ return true;
25+
+ }
26+
+ return false;
27+
+ }
28+
+ // Purpur end - Option to make doors require redstone
29+
}

purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,16 @@ private void dispenserSettings() {
458458
dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils);
459459
}
460460

461+
public List<Block> doorRequiresRedstone = new ArrayList<>();
462+
private void doorSettings() {
463+
getList("blocks.door.requires-redstone", new ArrayList<String>()).forEach(key -> {
464+
Block block = BuiltInRegistries.BLOCK.getValue(ResourceLocation.parse(key.toString()));
465+
if (!block.defaultBlockState().isAir()) {
466+
doorRequiresRedstone.add(block);
467+
}
468+
});
469+
}
470+
461471
public boolean baselessEndCrystalExplode = true;
462472
public double baselessEndCrystalExplosionPower = 6.0D;
463473
public boolean baselessEndCrystalExplosionFire = false;

0 commit comments

Comments
 (0)