From 59856751ab69dbe9edd04f08699dd2db87909e95 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:31:56 +0800 Subject: [PATCH] Configurable trading with the void --- ...5-Configurable-trading-with-the-void.patch | 31 +++++++++++++++++++ .../0005-Fix-trading-with-the-void.patch | 23 -------------- .../features/0007-Leaves-Fakeplayer.patch | 6 ++-- .../features/0075-Replay-Mod-API.patch | 4 +-- .../org/leavesmc/leaves/LeavesConfig.java | 31 +++++++++++++++++-- 5 files changed, 65 insertions(+), 30 deletions(-) create mode 100644 leaves-server/minecraft-patches/features/0005-Configurable-trading-with-the-void.patch delete mode 100644 leaves-server/minecraft-patches/features/0005-Fix-trading-with-the-void.patch diff --git a/leaves-server/minecraft-patches/features/0005-Configurable-trading-with-the-void.patch b/leaves-server/minecraft-patches/features/0005-Configurable-trading-with-the-void.patch new file mode 100644 index 00000000..61ab739e --- /dev/null +++ b/leaves-server/minecraft-patches/features/0005-Configurable-trading-with-the-void.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 26 Jan 2022 17:20:54 +0800 +Subject: [PATCH] Configurable trading with the void + + +diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java +index bfbfbaa9660d21071c420b60b10be0a02a1bc87e..4797e001122097f55f33729b3b20f79d75b20fb2 100644 +--- a/net/minecraft/server/level/ServerLevel.java ++++ b/net/minecraft/server/level/ServerLevel.java +@@ -2674,7 +2674,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + // Spigot start + if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message + // Paper start - Fix merchant inventory not closing on entity removal +- if (entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { ++ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade && entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { // Leaves - Configurable trading with the void + merchant.getTrader().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); + } + // Paper end - Fix merchant inventory not closing on entity removal +diff --git a/net/minecraft/world/inventory/MerchantMenu.java b/net/minecraft/world/inventory/MerchantMenu.java +index d59f67ffe34201c63e3d9706a4434f33b6732edb..1bf2a015fa35981328c098f2fec363c84b85b2a7 100644 +--- a/net/minecraft/world/inventory/MerchantMenu.java ++++ b/net/minecraft/world/inventory/MerchantMenu.java +@@ -74,6 +74,7 @@ public class MerchantMenu extends AbstractContainerMenu { + + @Override + public boolean stillValid(Player player) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade) return this.trader.getTradingPlayer() == player; // Leaves - Configurable trading with the void + if (!checkReachable) return true; // Paper - checkReachable + return this.trader.stillValid(player); + } diff --git a/leaves-server/minecraft-patches/features/0005-Fix-trading-with-the-void.patch b/leaves-server/minecraft-patches/features/0005-Fix-trading-with-the-void.patch deleted file mode 100644 index 6b2f4c6b..00000000 --- a/leaves-server/minecraft-patches/features/0005-Fix-trading-with-the-void.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Wed, 26 Jan 2022 17:20:54 +0800 -Subject: [PATCH] Fix trading with the void - - -diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3c8a1fe9831d6cf9e622e3ac2aede4e5c657c18f..e29dd7c4759319fffea46bca17b65df412eca6f5 100644 ---- a/net/minecraft/server/level/ServerLevel.java -+++ b/net/minecraft/server/level/ServerLevel.java -@@ -2673,11 +2673,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - // Spigot end - // Spigot start - if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message -- // Paper start - Fix merchant inventory not closing on entity removal -- if (entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { -- merchant.getTrader().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); -- } -- // Paper end - Fix merchant inventory not closing on entity removal -+ // Leaves - fix trading with the void - for (org.bukkit.entity.HumanEntity h : Lists.newArrayList(((org.bukkit.inventory.InventoryHolder) entity.getBukkitEntity()).getInventory().getViewers())) { - h.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper - Inventory close reason - } diff --git a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch index 0c63a1bd..b5ac246b 100644 --- a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch +++ b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch @@ -131,7 +131,7 @@ index 0d8aefe8c886eaa4c33cbab53b0ad1c016f0531f..4785f9d6c53e18419a3df4a1be9c8a4f } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index b1ede1dce7d6c5ea6e93259618ed63e53fc46756..d71e9c713f52a41563b20faa648aa81046af02e4 100644 +index 4797e001122097f55f33729b3b20f79d75b20fb2..9c32960a14916f3b032c6ae323d6efc9bdd9682c 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -211,6 +211,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -175,7 +175,7 @@ index b1ede1dce7d6c5ea6e93259618ed63e53fc46756..d71e9c713f52a41563b20faa648aa810 ServerLevel.this.updateSleepingPlayerList(); } -@@ -2682,6 +2695,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2686,6 +2699,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe ServerLevel.this.getChunkSource().removeEntity(entity); if (entity instanceof ServerPlayer serverPlayer) { ServerLevel.this.players.remove(serverPlayer); @@ -213,7 +213,7 @@ index 443bfb06951f0ffe6af8724b53e150cd0907e68d..01687ea3acf449c49cbc615887a7dbdd // CraftBukkit start org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld()); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index d24c61c34427aa526c16ffc8aa43ec9ec1232589..012574f56d9d7e6340c8b7bf7bee43e36d99df65 100644 +index 2648a3ad296f59ee554783cdd4c7e889d0447f5b..3d2b565ddb488aff3e80430e4eff5c233549edb0 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -336,6 +336,19 @@ public abstract class PlayerList { diff --git a/leaves-server/minecraft-patches/features/0075-Replay-Mod-API.patch b/leaves-server/minecraft-patches/features/0075-Replay-Mod-API.patch index f03ea5b5..13301dfe 100644 --- a/leaves-server/minecraft-patches/features/0075-Replay-Mod-API.patch +++ b/leaves-server/minecraft-patches/features/0075-Replay-Mod-API.patch @@ -120,7 +120,7 @@ index 814bb2981ab32b216b7953e9b14fe09e96cc7c89..45f884bf598b38ec45baf423b84f5293 .filter(player -> !playerList.isOp(player.getGameProfile())) .map(player -> player.getGameProfile().getName()), diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index a2199f7aac4f44a70087dd90fe9330fcb8970772..9b1a65036392a965dc0ce93247dfc0cf53630034 100644 +index 5fd09fe2c544d197035f4500a0672f73b1da2501..27729923db521bc5b875badb1ee3fe75d5c16fdd 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -2646,7 +2646,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -132,7 +132,7 @@ index a2199f7aac4f44a70087dd90fe9330fcb8970772..9b1a65036392a965dc0ce93247dfc0cf ServerLevel.this.realPlayers.add(serverPlayer); } // Leaves end - skip -@@ -2717,7 +2717,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2721,7 +2721,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (entity instanceof ServerPlayer serverPlayer) { ServerLevel.this.players.remove(serverPlayer); // Leaves start - skip diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java index f62e7ac9..5c5593e3 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/LeavesConfig.java @@ -30,7 +30,6 @@ import org.leavesmc.leaves.protocol.CarpetServerProtocol.CarpetRules; import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeature; import org.leavesmc.leaves.protocol.bladeren.BladerenProtocol.LeavesFeatureSet; import org.leavesmc.leaves.region.RegionFileFormat; -import org.leavesmc.leaves.util.ElytraAeronauticsHelper; import org.leavesmc.leaves.util.ForcePeacefulModeSwitchType; import org.leavesmc.leaves.util.MathUtils; @@ -336,6 +335,18 @@ public final class LeavesConfig { VANILLA_20, VANILLA_21, MIXED } } + + @GlobalConfig(value = "void-trade", validator = VoidTradeValidator.class) + public boolean voidTrade = false; + + private static class VoidTradeValidator extends BooleanConfigValidator { + @Override + public void verify(Boolean old, Boolean value) throws IllegalArgumentException { + if (!value && old != null && LeavesConfig.modify.forceVoidTrade) { + throw new IllegalArgumentException("force-void-trade is enable, void-trade always need true"); + } + } + } } public ElytraAeronauticsConfig elytraAeronautics = new ElytraAeronauticsConfig(); @@ -411,9 +422,25 @@ public final class LeavesConfig { } } - @GlobalConfig("force-void-trade") + @GlobalConfig(value = "force-void-trade", validator = ForceVoidTradeValidator.class) public boolean forceVoidTrade = false; + private static class ForceVoidTradeValidator extends BooleanConfigValidator { + @Override + public void verify(Boolean old, Boolean value) throws IllegalArgumentException { + if (value) { + LeavesConfig.modify.oldMC.voidTrade = true; + } + } + + @Override + public void runAfterLoader(Boolean value, boolean reload) { + if (value) { + LeavesConfig.modify.oldMC.voidTrade = true; + } + } + } + @GlobalConfig(value = "mc-technical-survival-mode", validator = McTechnicalModeValidator.class, lock = true) public boolean mcTechnicalMode = true;