From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 8 Jun 2022 14:19:35 -0400 Subject: [PATCH] Stonecutter damage diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java index dc8d1a5edd415724b1b5417a1bb3cca13c47d28f..c30e9bd1bccfe008df354678db7816ba450a4b24 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java @@ -40,6 +40,7 @@ public class DamageSources { private final DamageSource freeze; private final DamageSource stalagmite; private final DamageSource scissors; + private final DamageSource stonecutter; // Purpur // CraftBukkit start public final DamageSource melting; public final DamageSource poison; @@ -71,6 +72,7 @@ public class DamageSources { this.freeze = this.source(DamageTypes.FREEZE); this.stalagmite = this.source(DamageTypes.STALAGMITE); this.scissors = this.source(DamageTypes.SCISSORS); + this.stonecutter = this.source(DamageTypes.STONE_CUTTER); } private DamageSource source(ResourceKey key) { @@ -173,6 +175,10 @@ public class DamageSources { return this.scissors; } + public DamageSource stonecutter() { + return this.stonecutter; + } + public DamageSource fallingBlock(Entity attacker) { return this.source(DamageTypes.FALLING_BLOCK, attacker); } diff --git a/src/main/java/net/minecraft/world/damagesource/DamageTypes.java b/src/main/java/net/minecraft/world/damagesource/DamageTypes.java index 7bbfa2f8ac29dd32b100d356b285b5e5bd6615fe..ebe9dd5533710cc9f74801c13c71f8a1c5804c94 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageTypes.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageTypes.java @@ -28,6 +28,7 @@ public interface DamageTypes { ResourceKey FREEZE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("freeze")); ResourceKey STALAGMITE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("stalagmite")); ResourceKey SCISSORS = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("scissors")); + ResourceKey STONE_CUTTER = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("stone_cutter")); ResourceKey FALLING_BLOCK = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("falling_block")); ResourceKey FALLING_ANVIL = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("falling_anvil")); ResourceKey FALLING_STALACTITE = ResourceKey.create(Registries.DAMAGE_TYPE, new ResourceLocation("falling_stalactite")); @@ -73,6 +74,7 @@ public interface DamageTypes { damageTypeRegisterable.register(FREEZE, new DamageType("freeze", 0.0F, DamageEffects.FREEZING)); damageTypeRegisterable.register(STALAGMITE, new DamageType("stalagmite", 0.0F)); damageTypeRegisterable.register(SCISSORS, new DamageType("scissors", DamageScaling.NEVER, 0.0F, DamageEffects.HURT, DeathMessageType.INTENTIONAL_GAME_DESIGN)); + damageTypeRegisterable.register(STONE_CUTTER, new DamageType("stone_cutter", DamageScaling.NEVER, 0.0F, DamageEffects.HURT, DeathMessageType.INTENTIONAL_GAME_DESIGN)); damageTypeRegisterable.register(FALLING_BLOCK, new DamageType("fallingBlock", 0.1F)); damageTypeRegisterable.register(FALLING_ANVIL, new DamageType("anvil", 0.1F)); damageTypeRegisterable.register(FALLING_STALACTITE, new DamageType("fallingStalactite", 0.1F)); diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java index 0a95842c53a9d0286c57bcb42db97e468e30fb7d..0882e67c5cf876e0fc58a4ca4accb4be40418983 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java @@ -92,4 +92,16 @@ public class StonecutterBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } + + // Purpur start + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, net.minecraft.world.entity.Entity entity) { + if (level.purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.LivingEntity) { + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); + entity.hurt(entity.damageSources().stonecutter(), level.purpurConfig.stonecutterDamage); + org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; + } + super.stepOn(level, pos, state, entity); + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java index 17a7fab20b4174273354fdc2fc700b7f2d669a98..a7578e112e80ed2585a7eb4fff9542f6068546be 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java @@ -463,7 +463,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { return BlockPathTypes.BLOCKED; } else { // Paper end - if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH)) { + if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH) || blockState.is(Blocks.STONECUTTER)) { // Purpur return BlockPathTypes.DANGER_OTHER; } @@ -493,7 +493,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { } else if (!blockState.is(BlockTags.TRAPDOORS) && !blockState.is(Blocks.LILY_PAD) && !blockState.is(Blocks.BIG_DRIPLEAF)) { if (blockState.is(Blocks.POWDER_SNOW)) { return BlockPathTypes.POWDER_SNOW; - } else if (!blockState.is(Blocks.CACTUS) && !blockState.is(Blocks.SWEET_BERRY_BUSH)) { + } else if (!blockState.is(Blocks.CACTUS) && !blockState.is(Blocks.SWEET_BERRY_BUSH) && !blockState.is(Blocks.STONECUTTER)) { // Purpur if (blockState.is(Blocks.HONEY_BLOCK)) { return BlockPathTypes.STICKY_HONEY; } else if (blockState.is(Blocks.COCOA)) { diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index debba52be7ba896f5a96a2ffa4e502101627a576..a20866374badffdda0ea10f83fb74347240fee19 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1057,6 +1057,10 @@ public class CraftEventFactory { cause = DamageCause.MAGIC; } else if (sourceType == DamageTypes.IN_FIRE) { cause = DamageCause.FIRE; + // Purpur start + } else if (sourceType == DamageTypes.STONE_CUTTER) { + cause = DamageCause.CONTACT; + // Purpur end } else { throw new IllegalStateException(String.format("Unhandled damage of %s by %s from %s", entity, damager, source.getMsgId())); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java index 636c032127c2026509764745f805ae0693e4a983..3734f6279005872eac6697e6e22c3a2e61eabc22 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -205,8 +205,10 @@ public class PurpurConfig { } public static String deathMsgRunWithScissors = " slipped and fell on their shears"; + public static String deathMsgStonecutter = " has sawed themself in half"; private static void deathMessages() { deathMsgRunWithScissors = getString("settings.messages.death-message.run-with-scissors", deathMsgRunWithScissors); + deathMsgStonecutter = getString("settings.messages.death-message.stonecutter", deathMsgStonecutter); } public static boolean advancementOnlyBroadcastToAffectedPlayer = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index a333c3daae7e6416ec1ff897ca5fc6629c31a9c8..608db11e2569ea93b5192cc443c580ebf837f70d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -992,6 +992,11 @@ public class PurpurWorldConfig { spongeAbsorbsLava = getBoolean("blocks.sponge.absorbs-lava", spongeAbsorbsLava); } + public float stonecutterDamage = 0.0F; + private void stonecutterSettings() { + stonecutterDamage = (float) getDouble("blocks.stonecutter.damage", stonecutterDamage); + } + public boolean turtleEggsBreakFromExpOrbs = true; public boolean turtleEggsBreakFromItems = true; public boolean turtleEggsBreakFromMinecarts = true;