From 994a5621f54ad768f20b47cb01bfbcbc9a9b67d9 Mon Sep 17 00:00:00 2001 From: Mariell Hoversholm Date: Fri, 10 Jan 2025 02:18:01 -0800 Subject: [PATCH] Farmland trampling changes This lets us choose if farmland trampling is fully disabled or only players may trample farmland. This lets us choose if entities can stop trampling if they fall a distance equal to their feather falling level, plus the extra block necessary to trample in the first place. Feather Falling 1 requires you to fall over 3+ blocks to trample. FF 2 requires 4+, etc. --- .../0119-Farmland-trampling-changes.patch | 59 ------------------- .../world/level/block/FarmBlock.java.patch | 14 ++++- .../purpurmc/purpur/PurpurWorldConfig.java | 6 ++ 3 files changed, 19 insertions(+), 60 deletions(-) delete mode 100644 patches/server/0119-Farmland-trampling-changes.patch diff --git a/patches/server/0119-Farmland-trampling-changes.patch b/patches/server/0119-Farmland-trampling-changes.patch deleted file mode 100644 index d30dcf0cd..000000000 --- a/patches/server/0119-Farmland-trampling-changes.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mariell Hoversholm -Date: Sat, 9 Jan 2021 16:06:40 +0100 -Subject: [PATCH] Farmland trampling changes - -This lets us choose if farmland trampling is fully disabled or only -players may trample farmland. - -This lets us choose if entities can stop trampling if they fall a -distance equal to their feather falling level, plus the extra block -necessary to trample in the first place. Feather Falling 1 requires -you to fall over 3+ blocks to trample. FF 2 requires 4+, etc. - -diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java -index 032b8252c3ff2fc111442610998e36a5c145ae13..fc5a755c558714442c1e12e88ee05764d6c1d9f4 100644 ---- a/net/minecraft/world/level/block/FarmBlock.java -+++ b/net/minecraft/world/level/block/FarmBlock.java -@@ -127,12 +127,20 @@ public class FarmBlock extends Block { - } - - // Purpur start -+ if (world.purpurConfig.farmlandTramplingDisabled) return; -+ if (world.purpurConfig.farmlandTramplingOnlyPlayers && !(entity instanceof Player)) return; - if (world.purpurConfig.farmlandAlpha) { - Block block = world.getBlockState(pos.below()).getBlock(); - if (block instanceof FenceBlock || block instanceof WallBlock) { - return; - } - } -+ if (world.purpurConfig.farmlandTramplingFeatherFalling) { -+ Iterator armor = ((LivingEntity) entity).getArmorSlots().iterator(); -+ if (armor.hasNext() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.FEATHER_FALLING, armor.next()) >= (int) entity.fallDistance) { -+ return; -+ } -+ } - // Purpur end - if (!CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState())) { - return; -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 07bbe52a858fa3f0cc9c9de709bf2ef013ac33f5..3739561c633627ba3fe80f89bce84a243705f4bc 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -418,10 +418,16 @@ public class PurpurWorldConfig { - public boolean farmlandBypassMobGriefing = false; - public boolean farmlandGetsMoistFromBelow = false; - public boolean farmlandAlpha = false; -+ public boolean farmlandTramplingDisabled = false; -+ public boolean farmlandTramplingOnlyPlayers = false; -+ public boolean farmlandTramplingFeatherFalling = false; - private void farmlandSettings() { - farmlandBypassMobGriefing = getBoolean("blocks.farmland.bypass-mob-griefing", farmlandBypassMobGriefing); - farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); - farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha); -+ farmlandTramplingDisabled = getBoolean("blocks.farmland.disable-trampling", farmlandTramplingDisabled); -+ farmlandTramplingOnlyPlayers = getBoolean("blocks.farmland.only-players-trample", farmlandTramplingOnlyPlayers); -+ farmlandTramplingFeatherFalling = getBoolean("blocks.farmland.feather-fall-distance-affects-trampling", farmlandTramplingFeatherFalling); - } - - public boolean furnaceUseLavaFromUnderneath = false; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch index b7414ae78..e2cbbaf28 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch @@ -1,9 +1,12 @@ --- a/net/minecraft/world/level/block/FarmBlock.java +++ b/net/minecraft/world/level/block/FarmBlock.java -@@ -129,6 +_,15 @@ +@@ -129,6 +_,27 @@ return; } ++ if (level.purpurConfig.farmlandTramplingDisabled) return; // Purpur - Farmland trampling changes ++ if (level.purpurConfig.farmlandTramplingOnlyPlayers && !(entity instanceof Player)) return; // Purpur - Farmland trampling changes ++ + // Purpur start - Ability to re-add farmland mechanics from Alpha + if (level.purpurConfig.farmlandAlpha) { + Block block = level.getBlockState(pos.below()).getBlock(); @@ -12,6 +15,15 @@ + } + } + // Purpur end - Ability to re-add farmland mechanics from Alpha ++ ++ // Purpur start - Farmland trampling changes ++ if (level.purpurConfig.farmlandTramplingFeatherFalling) { ++ java.util.Iterator armor = ((LivingEntity) entity).getArmorSlots().iterator(); ++ if (armor.hasNext() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.FEATHER_FALLING, armor.next()) >= (int) entity.fallDistance) { ++ return; ++ } ++ } ++ // Purpur end - Farmland trampling changes + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState())) { return; 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 ec524aa02..c3fb99747 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -410,10 +410,16 @@ public class PurpurWorldConfig { public boolean farmlandBypassMobGriefing = false; public boolean farmlandGetsMoistFromBelow = false; public boolean farmlandAlpha = false; + public boolean farmlandTramplingDisabled = false; + public boolean farmlandTramplingOnlyPlayers = false; + public boolean farmlandTramplingFeatherFalling = false; private void farmlandSettings() { farmlandBypassMobGriefing = getBoolean("blocks.farmland.bypass-mob-griefing", farmlandBypassMobGriefing); farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha); + farmlandTramplingDisabled = getBoolean("blocks.farmland.disable-trampling", farmlandTramplingDisabled); + farmlandTramplingOnlyPlayers = getBoolean("blocks.farmland.only-players-trample", farmlandTramplingOnlyPlayers); + farmlandTramplingFeatherFalling = getBoolean("blocks.farmland.feather-fall-distance-affects-trampling", farmlandTramplingFeatherFalling); } public boolean furnaceUseLavaFromUnderneath = false;