From 69e257d888578bbd57eb83354b69f3bf0d6f9200 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Fri, 4 Jul 2025 00:51:06 +0800 Subject: [PATCH] Fix some bot and void trade --- ...5-Configurable-trading-with-the-void.patch | 13 ++++++++++ .../java/org/leavesmc/leaves/bot/BotList.java | 24 +++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) 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 index 9c386a18..65b248f2 100644 --- 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 @@ -17,6 +17,19 @@ index dda8d38ef61672cc714d9e5a475f9b0412ed5ff9..364d5e28646ea341034921622354c7b1 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/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java +index 91f505c9d84aba773d237664c2aaaf9750cadadf..184d116320f0cd3e9fba47a86e94e0a8424c913f 100644 +--- a/net/minecraft/server/players/PlayerList.java ++++ b/net/minecraft/server/players/PlayerList.java +@@ -551,7 +551,7 @@ public abstract class PlayerList { + player.stopRiding(); + rootVehicle.getPassengersAndSelf().forEach(entity -> { + // Paper start - Fix villager boat exploit +- if (entity instanceof net.minecraft.world.entity.npc.AbstractVillager villager) { ++ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade && entity instanceof net.minecraft.world.entity.npc.AbstractVillager villager) { // Leaves - Configurable trading with the void + final net.minecraft.world.entity.player.Player human = villager.getTradingPlayer(); + if (human != null) { + villager.setTradingPlayer(null); 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 diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java index 9ee4dfb8..98fe3805 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/BotList.java @@ -16,12 +16,16 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrownEnderpearl; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.ValueInput; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.event.entity.EntityRemoveEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.leavesmc.leaves.LeavesConfig; @@ -166,6 +170,7 @@ public class BotList { bot.supressTrackerForLogin = false; bot.level().getChunkSource().chunkMap.addEntity(bot); + bot.initInventoryMenu(); BotList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", bot.getName().getString(), "Local", bot.getId(), bot.level().serverLevelData.getLevelName(), bot.getX(), bot.getY(), bot.getZ()); return bot; } @@ -179,7 +184,7 @@ public class BotList { this.server.server.getPluginManager().callEvent(event); if (event.isCancelled() && event.getReason() != BotRemoveEvent.RemoveReason.INTERNAL) { - return event.isCancelled(); + return true; } if (bot.removeTaskId != -1) { @@ -187,6 +192,8 @@ public class BotList { bot.removeTaskId = -1; } + bot.disconnect(); + if (event.shouldSave()) { playerIO.save(bot); } else { @@ -198,8 +205,8 @@ public class BotList { if (entity.hasExactlyOnePlayerPassenger()) { bot.stopRiding(); entity.getPassengersAndSelf().forEach((entity1) -> { - if (entity1 instanceof net.minecraft.world.entity.npc.AbstractVillager villager) { - final net.minecraft.world.entity.player.Player human = villager.getTradingPlayer(); + if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade && entity1 instanceof AbstractVillager villager) { + final Player human = villager.getTradingPlayer(); if (human != null) { villager.setTradingPlayer(null); } @@ -210,6 +217,14 @@ public class BotList { } bot.unRide(); + for (ThrownEnderpearl thrownEnderpearl : bot.getEnderPearls()) { + if (!thrownEnderpearl.level().paperConfig().misc.legacyEnderPearlBehavior) { + thrownEnderpearl.setRemoved(Entity.RemovalReason.UNLOADED_WITH_PLAYER, EntityRemoveEvent.Cause.PLAYER_QUIT); + } else { + thrownEnderpearl.setOwner(null); + } + } + bot.level().removePlayerImmediately(bot, Entity.RemovalReason.UNLOADED_WITH_PLAYER); this.bots.remove(bot); this.botsByName.remove(bot.getScoreboardName().toLowerCase(Locale.ROOT)); @@ -221,9 +236,10 @@ public class BotList { } bot.removeTab(); + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(bot.getId()); for (ServerPlayer player : bot.level().players()) { if (!(player instanceof ServerBot)) { - player.connection.send(new ClientboundRemoveEntitiesPacket(bot.getId())); + player.connection.send(packet); } }