From 26189d0fdefb71f5d2215a78d39f8336a90684cc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 12 Jan 2025 15:06:09 -0800 Subject: [PATCH] Stonecutter damage --- patches/server/0239-Stonecutter-damage.patch | 165 ------------------ .../damagesource/CombatTracker.java.patch | 6 +- .../damagesource/DamageSource.java.patch | 18 +- .../damagesource/DamageSources.java.patch | 17 +- .../level/block/StonecutterBlock.java.patch | 17 ++ .../pathfinder/WalkNodeEvaluator.java.patch | 9 + .../event/CraftEventFactory.java.patch | 11 ++ .../org/purpurmc/purpur/PurpurConfig.java | 2 + .../purpurmc/purpur/PurpurWorldConfig.java | 5 + 9 files changed, 76 insertions(+), 174 deletions(-) delete mode 100644 patches/server/0239-Stonecutter-damage.patch create mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/StonecutterBlock.java.patch create mode 100644 purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java.patch diff --git a/patches/server/0239-Stonecutter-damage.patch b/patches/server/0239-Stonecutter-damage.patch deleted file mode 100644 index 78ded98a9..000000000 --- a/patches/server/0239-Stonecutter-damage.patch +++ /dev/null @@ -1,165 +0,0 @@ -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/net/minecraft/world/damagesource/CombatTracker.java b/net/minecraft/world/damagesource/CombatTracker.java -index 254aea4138afa1009a3c949a24c1a0fb8edbbd1d..10afc08930d7fe27ffa396ec5a10afb7769a3f0b 100644 ---- a/net/minecraft/world/damagesource/CombatTracker.java -+++ b/net/minecraft/world/damagesource/CombatTracker.java -@@ -101,6 +101,10 @@ public class CombatTracker { - // Purpur start - Dont run with scissors! - if (damageSource.isScissors()) { - return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, this.mob); -+ // Purpur start - Stonecutter damage -+ } else if (damageSource.isStonecutter()) { -+ return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgStonecutter, this.mob); -+ // Purpur end - Stonecutter damage - } - // Purpur end - Dont run with scissors! - return damageSource.getLocalizedDeathMessage(this.mob); -diff --git a/net/minecraft/world/damagesource/DamageSource.java b/net/minecraft/world/damagesource/DamageSource.java -index 43985b4442145728c28bbeb9d18444a7c8f3a41f..ccdf9d40b767115e0e6db2c29af42f5ec4c40f85 100644 ---- a/net/minecraft/world/damagesource/DamageSource.java -+++ b/net/minecraft/world/damagesource/DamageSource.java -@@ -30,6 +30,7 @@ public class DamageSource { - private boolean melting = false; - private boolean poison = false; - private boolean scissors = false; // Purpur - Dont run with scissors! -+ private boolean stonecutter = false; // Purpur - Stonecutter damage - @Nullable - private Entity customEventDamager = null; // This field is a helper for when causing entity damage is not set by vanilla // Paper - fix DamageSource API - -@@ -70,6 +71,16 @@ public class DamageSource { - return this.scissors; - } - // Purpur end - Dont run with scissors! -+ // Purpur start - - Stonecutter damage -+ public DamageSource stonecutter() { -+ this.stonecutter = true; -+ return this; -+ } -+ -+ public boolean isStonecutter() { -+ return this.stonecutter; -+ } -+ // Purpur end - Stonecutter damage - - // Paper start - fix DamageSource API - @Nullable -@@ -130,6 +141,7 @@ public class DamageSource { - damageSource.poison = this.isPoison(); - damageSource.melting = this.isMelting(); - damageSource.scissors = this.isScissors(); // Purpur - Dont run with scissors! -+ damageSource.stonecutter = this.isStonecutter(); // Purpur - Stonecutter damage - return damageSource; - } - // CraftBukkit end -diff --git a/net/minecraft/world/damagesource/DamageSources.java b/net/minecraft/world/damagesource/DamageSources.java -index a4f710ad1aecd8265cde8d71d55eea952cd3c03b..820533b6a13b1f8abbfe378de6b5d66ce2b79835 100644 ---- a/net/minecraft/world/damagesource/DamageSources.java -+++ b/net/minecraft/world/damagesource/DamageSources.java -@@ -47,12 +47,14 @@ public class DamageSources { - private final DamageSource melting; - private final DamageSource poison; - private final DamageSource scissors; // Purpur - Dont run with scissors! -+ private final DamageSource stonecutter; // Purpur - Stonecutter damage - - public DamageSources(RegistryAccess registryManager) { - this.damageTypes = registryManager.lookupOrThrow(Registries.DAMAGE_TYPE); - this.melting = this.source(DamageTypes.ON_FIRE).melting(); - this.poison = this.source(DamageTypes.MAGIC).poison(); - this.scissors = this.source(DamageTypes.MAGIC).scissors(); // Purpur - Dont run with scissors! -+ this.stonecutter = this.source(DamageTypes.MAGIC).stonecutter(); // Purpur - Stonecutter damage - // CraftBukkit end - this.inFire = this.source(DamageTypes.IN_FIRE); - this.campfire = this.source(DamageTypes.CAMPFIRE); -@@ -109,6 +111,11 @@ public class DamageSources { - } - // Purpur end - Dont run with scissors! - -+ // Purpur start - Stonecutter damage -+ public DamageSource stonecutter() { -+ return this.stonecutter; -+ } -+ // Purpur end - Stonecutter damage - public DamageSource inFire() { - return this.inFire; - } -diff --git a/net/minecraft/world/level/block/StonecutterBlock.java b/net/minecraft/world/level/block/StonecutterBlock.java -index f1366aea49206afcd64bf058ee673d6a562315c5..e93d1eba4fcd02e15287a1a66da94e695806a470 100644 ---- a/net/minecraft/world/level/block/StonecutterBlock.java -+++ b/net/minecraft/world/level/block/StonecutterBlock.java -@@ -93,4 +93,14 @@ public class StonecutterBlock extends Block { - protected boolean isPathfindable(BlockState state, PathComputationType type) { - return false; - } -+ -+ // Purpur start - Stonecutter damage -+ @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) { -+ entity.hurtServer((net.minecraft.server.level.ServerLevel) level, entity.damageSources().stonecutter().directBlock(level, pos), level.purpurConfig.stonecutterDamage); -+ } -+ super.stepOn(level, pos, state, entity); -+ } -+ // Purpur end - Stonecutter damage - } -diff --git a/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java b/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -index e295fe4aac742ff8942b23456fdce8d7ff944e90..b65512f65e06865cc4d2964bd4ca2806784be738 100644 ---- a/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -+++ b/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -@@ -491,7 +491,7 @@ public class WalkNodeEvaluator extends NodeEvaluator { - return PathType.TRAPDOOR; - } else if (blockState.is(Blocks.POWDER_SNOW)) { - return PathType.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 - Stonecutter damage - return PathType.DAMAGE_OTHER; - } else if (blockState.is(Blocks.HONEY_BLOCK)) { - return PathType.STICKY_HONEY; -diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index eb2f9bfdaf3ed8a684337a15365e70174d1533b3..d52d41d8c56e017f95914da19b05c3d79f8f1640 100644 ---- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1140,7 +1140,7 @@ public class CraftEventFactory { - return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), source.getDirectBlockState(), entity, DamageCause.LAVA, bukkitDamageSource, modifiers, modifierFunctions, cancelled); - } else if (source.getDirectBlock() != null) { - DamageCause cause; -- if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL)) { -+ if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL) || source.isStonecutter()) { // Purpur - Stonecutter damage - cause = DamageCause.CONTACT; - } else if (source.is(DamageTypes.HOT_FLOOR)) { - cause = DamageCause.HOT_FLOOR; -diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 6cd88ca590658adb8f79296fc74af3536e2e1be3..4ad201f8457dca2305224cc74a1f55b90dd60140 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -212,8 +212,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 f789100866e21cdf7b2891dfcb6913081f597d79..2a53cf6fcab47e49735a31ed9eb1fb668caa2e4c 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1053,6 +1053,11 @@ public class PurpurWorldConfig { - spongeAbsorbsWaterFromMud = getBoolean("blocks.sponge.absorbs-water-from-mud", spongeAbsorbsWaterFromMud); - } - -+ public float stonecutterDamage = 0.0F; -+ private void stonecutterSettings() { -+ stonecutterDamage = (float) getDouble("blocks.stonecutter.damage", stonecutterDamage); -+ } -+ - public boolean turtleEggsBreakFromExpOrbs = false; - public boolean turtleEggsBreakFromItems = false; - public boolean turtleEggsBreakFromMinecarts = false; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/CombatTracker.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/CombatTracker.java.patch index c402b30c0..ab4207e72 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/CombatTracker.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/CombatTracker.java.patch @@ -1,12 +1,16 @@ --- a/net/minecraft/world/damagesource/CombatTracker.java +++ b/net/minecraft/world/damagesource/CombatTracker.java -@@ -98,6 +_,11 @@ +@@ -98,6 +_,15 @@ Component component = ComponentUtils.wrapInSquareBrackets(Component.translatable(string + ".link")).withStyle(INTENTIONAL_GAME_DESIGN_STYLE); return Component.translatable(string + ".message", this.mob.getDisplayName(), component); } else { + // Purpur start - Dont run with scissors! + if (damageSource.isScissors()) { + return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, this.mob); ++ // Purpur start - Stonecutter damage ++ } else if (damageSource.isStonecutter()) { ++ return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgStonecutter, this.mob); ++ // Purpur end - Stonecutter damage + } + // Purpur end - Dont run with scissors! return damageSource.getLocalizedDeathMessage(this.mob); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch index db0748b8d..fcecb34ab 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch @@ -1,14 +1,15 @@ --- a/net/minecraft/world/damagesource/DamageSource.java +++ b/net/minecraft/world/damagesource/DamageSource.java -@@ -28,6 +_,7 @@ +@@ -28,6 +_,8 @@ private boolean sweep = false; private boolean melting = false; private boolean poison = false; + private boolean scissors = false; // Purpur - Dont run with scissors! ++ private boolean stonecutter = false; // Purpur - Stonecutter damage @Nullable private Entity customEventDamager = null; // This field is a helper for when causing entity damage is not set by vanilla // Paper - fix DamageSource API -@@ -58,6 +_,17 @@ +@@ -58,6 +_,27 @@ return this.poison; } @@ -22,15 +23,26 @@ + return this.scissors; + } + // Purpur end - Dont run with scissors! ++ // Purpur start - - Stonecutter damage ++ public DamageSource stonecutter() { ++ this.stonecutter = true; ++ return this; ++ } ++ ++ public boolean isStonecutter() { ++ return this.stonecutter; ++ } ++ // Purpur end - Stonecutter damage + // Paper start - fix DamageSource API @Nullable public Entity getCustomEventDamager() { -@@ -116,6 +_,7 @@ +@@ -116,6 +_,8 @@ damageSource.sweep = this.isSweep(); damageSource.poison = this.isPoison(); damageSource.melting = this.isMelting(); + damageSource.scissors = this.isScissors(); // Purpur - Dont run with scissors! ++ damageSource.stonecutter = this.isStonecutter(); // Purpur - Stonecutter damage return damageSource; } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSources.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSources.java.patch index 2bcfc8f5c..9e3c63dab 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSources.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSources.java.patch @@ -1,29 +1,36 @@ --- a/net/minecraft/world/damagesource/DamageSources.java +++ b/net/minecraft/world/damagesource/DamageSources.java -@@ -45,11 +_,13 @@ +@@ -45,11 +_,15 @@ // CraftBukkit start private final DamageSource melting; private final DamageSource poison; + private final DamageSource scissors; // Purpur - Dont run with scissors! ++ private final DamageSource stonecutter; // Purpur - Stonecutter damage public DamageSources(RegistryAccess registry) { this.damageTypes = registry.lookupOrThrow(Registries.DAMAGE_TYPE); this.melting = this.source(DamageTypes.ON_FIRE).melting(); this.poison = this.source(DamageTypes.MAGIC).poison(); + this.scissors = this.source(DamageTypes.MAGIC).scissors(); // Purpur - Dont run with scissors! ++ this.stonecutter = this.source(DamageTypes.MAGIC).stonecutter(); // Purpur - Stonecutter damage // CraftBukkit end this.inFire = this.source(DamageTypes.IN_FIRE); this.campfire = this.source(DamageTypes.CAMPFIRE); -@@ -99,6 +_,12 @@ - return this.poison; +@@ -100,6 +_,17 @@ } // CraftBukkit end -+ + + // Purpur start - Dont run with scissors! + public DamageSource scissors() { + return this.scissors; + } + // Purpur end - Dont run with scissors! - ++ ++ // Purpur start - Stonecutter damage ++ public DamageSource stonecutter() { ++ return this.stonecutter; ++ } ++ // Purpur end - Stonecutter damage public DamageSource inFire() { return this.inFire; + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/StonecutterBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/StonecutterBlock.java.patch new file mode 100644 index 000000000..df3ab7800 --- /dev/null +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/StonecutterBlock.java.patch @@ -0,0 +1,17 @@ +--- a/net/minecraft/world/level/block/StonecutterBlock.java ++++ b/net/minecraft/world/level/block/StonecutterBlock.java +@@ -93,4 +_,14 @@ + protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType) { + return false; + } ++ ++ // Purpur start - Stonecutter damage ++ @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) { ++ entity.hurtServer((net.minecraft.server.level.ServerLevel) level, entity.damageSources().stonecutter().directBlock(level, pos), level.purpurConfig.stonecutterDamage); ++ } ++ super.stepOn(level, pos, state, entity); ++ } ++ // Purpur end - Stonecutter damage + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch index 50531286d..ef04724ea 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch @@ -9,3 +9,12 @@ && cachedPathType != PathType.TRAPDOOR && cachedPathType != PathType.POWDER_SNOW) { node = this.tryJumpOn(x, y, z, verticalDeltaLimit, nodeFloorLevel, direction, pathType, mutableBlockPos); +@@ -493,7 +_,7 @@ + return PathType.TRAPDOOR; + } else if (blockState.is(Blocks.POWDER_SNOW)) { + return PathType.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 - Stonecutter damage + return PathType.DAMAGE_OTHER; + } else if (blockState.is(Blocks.HONEY_BLOCK)) { + return PathType.STICKY_HONEY; diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java.patch new file mode 100644 index 000000000..ce3a906ab --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java.patch @@ -0,0 +1,11 @@ +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -1131,7 +_,7 @@ + return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), source.getDirectBlockState(), entity, DamageCause.LAVA, bukkitDamageSource, modifiers, modifierFunctions, cancelled); + } else if (source.getDirectBlock() != null) { + DamageCause cause; +- if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL)) { ++ if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL) || source.isStonecutter()) { // Purpur - Stonecutter damage + cause = DamageCause.CONTACT; + } else if (source.is(DamageTypes.HOT_FLOOR)) { + cause = DamageCause.HOT_FLOOR; diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java index 47208cb3a..b8a866969 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/purpur-server/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/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 3cba8fe00..50b3ea12b 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1052,6 +1052,11 @@ public class PurpurWorldConfig { spongeAbsorbsWaterFromMud = getBoolean("blocks.sponge.absorbs-water-from-mud", spongeAbsorbsWaterFromMud); } + public float stonecutterDamage = 0.0F; + private void stonecutterSettings() { + stonecutterDamage = (float) getDouble("blocks.stonecutter.damage", stonecutterDamage); + } + public boolean turtleEggsBreakFromExpOrbs = false; public boolean turtleEggsBreakFromItems = false; public boolean turtleEggsBreakFromMinecarts = false;