Files
Purpur/patches/server/0159-Option-to-make-doors-require-redstone.patch
2022-08-05 15:30:11 -05:00

90 lines
5.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Wed, 24 Mar 2021 04:40:11 -0500
Subject: [PATCH] Option to make doors require redstone
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java b/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java
index 4abfeffa72bc70fd26908252ed596e816b4b9eb2..e5c20f40a63e8db215876c03ba6de9721d6675c0 100644
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/InteractWithDoor.java
@@ -65,7 +65,7 @@ public class InteractWithDoor extends Behavior<LivingEntity> {
if (iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> {
return blockbase_blockdata.getBlock() instanceof DoorBlock;
- })) {
+ }) && !DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition)) { // Purpur
DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock();
if (!blockdoor.isOpen(iblockdata)) {
@@ -87,7 +87,7 @@ public class InteractWithDoor extends Behavior<LivingEntity> {
if (iblockdata1.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> {
return blockbase_blockdata.getBlock() instanceof DoorBlock;
- })) {
+ }) && !DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition1)) { // Purpur
DoorBlock blockdoor1 = (DoorBlock) iblockdata1.getBlock();
if (!blockdoor1.isOpen(iblockdata1)) {
@@ -124,7 +124,7 @@ public class InteractWithDoor extends Behavior<LivingEntity> {
if (!iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> {
return blockbase_blockdata.getBlock() instanceof DoorBlock;
- })) {
+ }) || DoorBlock.requiresRedstone(entity.level, iblockdata, blockposition)) { // Purpur
iterator.remove();
} else {
DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock();
diff --git a/src/main/java/net/minecraft/world/level/block/DoorBlock.java b/src/main/java/net/minecraft/world/level/block/DoorBlock.java
index aa5289f652392515952cc10f70627ed2cdc6c398..d1d3323559f12f60ef0564e2218ca15313ab225f 100644
--- a/src/main/java/net/minecraft/world/level/block/DoorBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/DoorBlock.java
@@ -169,6 +169,7 @@ public class DoorBlock extends Block {
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
if (this.material == Material.METAL) {
return InteractionResult.PASS;
+ } else if (requiresRedstone(world, state, pos)) { return InteractionResult.CONSUME; // Purpur
} else {
state = (BlockState) state.cycle(DoorBlock.OPEN);
world.setBlock(pos, state, 10);
@@ -264,4 +265,18 @@ public class DoorBlock extends Block {
public static boolean isWoodenDoor(BlockState state) {
return state.getBlock() instanceof DoorBlock && (state.getMaterial() == Material.WOOD || state.getMaterial() == Material.NETHER_WOOD);
}
+
+ // Purpur start
+ public static boolean requiresRedstone(Level level, BlockState state, BlockPos pos) {
+ if (level.purpurConfig.doorRequiresRedstone.contains(state.getBlock())) {
+ // force update client
+ BlockPos otherPos = pos.relative(state.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER ? Direction.UP : Direction.DOWN);
+ BlockState otherState = level.getBlockState(otherPos);
+ level.sendBlockUpdated(pos, state, state, 3);
+ level.sendBlockUpdated(otherPos, otherState, otherState, 3);
+ return true;
+ }
+ return false;
+ }
+ // Purpur end
}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
index ee8238ff6e74f72b04b011e89dd1b50c18e91c93..15d8b8b31c757226ae975b3b2c2407bab2a26d71 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -499,6 +499,16 @@ public class PurpurWorldConfig {
dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils);
}
+ public List<Block> doorRequiresRedstone = new ArrayList<>();
+ private void doorSettings() {
+ getList("blocks.door.requires-redstone", new ArrayList<String>()).forEach(key -> {
+ Block block = Registry.BLOCK.get(new ResourceLocation(key.toString()));
+ if (!block.defaultBlockState().isAir()) {
+ doorRequiresRedstone.add(block);
+ }
+ });
+ }
+
public boolean baselessEndCrystalExplode = true;
public double baselessEndCrystalExplosionPower = 6.0D;
public boolean baselessEndCrystalExplosionFire = false;