diff --git a/lophine-server/minecraft-patches/features/0023-Leaves-Fakeplayer.patch b/lophine-server/minecraft-patches/features/0023-Leaves-Fakeplayer.patch index ca334ec..0984376 100644 --- a/lophine-server/minecraft-patches/features/0023-Leaves-Fakeplayer.patch +++ b/lophine-server/minecraft-patches/features/0023-Leaves-Fakeplayer.patch @@ -20,7 +20,7 @@ index a82d84283632342bd30bc3449983431ba43583e0..f59526f6bfa1b4af5b474f0b438513c9 Set> set = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak if (set != null && !set.isEmpty()) { diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 66ec0424a46dcd49cf44467357d80b1a2d84d3b2..04ae8de63af0a8abe578f14c8ef85fd4beca0969 100644 +index 66ec0424a46dcd49cf44467357d80b1a2d84d3b2..58694e28b3ff85ef038fe2ada2672e6d3b074fa4 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java @@ -96,7 +96,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -28,7 +28,7 @@ index 66ec0424a46dcd49cf44467357d80b1a2d84d3b2..04ae8de63af0a8abe578f14c8ef85fd4 private volatile PacketListener disconnectListener; @Nullable - private volatile PacketListener packetListener; -+ protected volatile PacketListener packetListener; // Leaves - private -> protected ++ public volatile PacketListener packetListener; // Leaves - private -> protected // Lophine protected -> public @Nullable private DisconnectionDetails disconnectionDetails; private boolean encrypted; @@ -257,7 +257,7 @@ index 70740381c6501c1a518c52b24381edd16792507f..8ad6d5a2522cfbe316fec2c3b918e2e1 } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 89d72f242d0fc224701bdcdf245d948415e7c820..5efe7d94a364cec1bd18c4d8d62c19075d52f3e8 100644 +index 7fb095c544294796768ce19c4409416e2848e296..3393fb585747aaf3fa270c4bfe06ed4e9174d519 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -207,6 +207,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java b/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java index 107830d..9024f1a 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/bot/BotList.java @@ -121,7 +121,7 @@ public class BotList { } ServerBot bot = new ServerBot(this.server, this.server.getLevel(Level.OVERWORLD), new GameProfile(uuid, realName)); - bot.connection = new ServerBotPacketListenerImpl(this.server, bot); + bot.connection = new ServerBotPacketListenerImpl(this.server, bot, new ServerBotPacketListenerImpl.BotConnection()); Optional optional; try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(bot.problemPath(), LOGGER)) { optional = playerIO.load(bot, scopedCollector); @@ -154,7 +154,7 @@ public class BotList { bot.isRealPlayer = true; bot.loginTime = System.currentTimeMillis(); - bot.connection = new ServerBotPacketListenerImpl(this.server, bot); + bot.connection = new ServerBotPacketListenerImpl(this.server, bot, new ServerBotPacketListenerImpl.BotConnection()); bot.setServerLevel(world); BotSpawnLocationEvent event = new BotSpawnLocationEvent(bot.getBukkitEntity(), location); @@ -175,22 +175,24 @@ public class BotList { bot.supressTrackerForLogin = true; - if (TickThread.isTickThreadFor(world, net.minecraft.util.Mth.floor(location.getX()) >> 4, net.minecraft.util.Mth.floor(location.getZ()) >> 4)) { - summonBot(bot, world); - } else { - RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( - world, net.minecraft.util.Mth.floor(location.getX()) >> 4, net.minecraft.util.Mth.floor(location.getZ()) >> 4, - () -> summonBot(bot, world), - ca.spottedleaf.concurrentutil.util.Priority.HIGHER); - } optional.ifPresent(nbt -> { bot.loadAndSpawnEnderPearls(nbt); bot.loadAndSpawnParentVehicle(nbt); }); + + if (TickThread.isTickThreadFor(world, location.blockX() >> 4, location.blockZ() >> 4)) { + summonBot(bot, world); + } else { + RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( + world, location.getBlockX() >> 4, location.blockZ() >> 4, + () -> summonBot(bot, world)); + } + return bot; } private ServerBot summonBot(ServerBot bot, ServerLevel world) { + world.getCurrentWorldData().connections.add(bot.connection.connection); world.addNewPlayer(bot); BotJoinEvent event1 = new BotJoinEvent(bot.getBukkitEntity(), PaperAdventure.asAdventure(Component.translatable("multiplayer.player.joined", bot.getDisplayName())).style(Style.style(NamedTextColor.YELLOW))); @@ -277,7 +279,9 @@ public class BotList { } } + bot.level().getCurrentWorldData().connections.remove(bot.connection.connection); bot.level().removePlayerImmediately(bot, Entity.RemovalReason.UNLOADED_WITH_PLAYER); + this.bots.remove(bot); this.botsByName.remove(bot.getScoreboardName().toLowerCase(Locale.ROOT)); @@ -299,6 +303,8 @@ public class BotList { if (removeMessage != null && !removeMessage.equals(net.kyori.adventure.text.Component.empty())) { this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(removeMessage), false); } + + bot.retireScheduler(); return true; } diff --git a/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java b/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java index 053a704..bcb8ba8 100644 --- a/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java +++ b/lophine-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java @@ -29,9 +29,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class ServerBotPacketListenerImpl extends ServerGamePacketListenerImpl { + public final Connection fakeConnection; - public ServerBotPacketListenerImpl(MinecraftServer server, ServerBot bot) { - super(server, BotConnection.INSTANCE, bot, CommonListenerCookie.createInitial(bot.gameProfile, false)); + public ServerBotPacketListenerImpl(MinecraftServer server, ServerBot bot, BotConnection botConnection) { + super(server, botConnection, bot, CommonListenerCookie.createInitial(bot.gameProfile, false)); + this.fakeConnection = botConnection; + this.fakeConnection.packetListener = this; } @Override @@ -53,8 +56,6 @@ public class ServerBotPacketListenerImpl extends ServerGamePacketListenerImpl { public static class BotConnection extends Connection { - private static final BotConnection INSTANCE = new BotConnection(); - public BotConnection() { super(PacketFlow.SERVERBOUND); }