diff --git a/gradle.properties b/gradle.properties index aed9097..da61ff0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ mcVersion=1.21.8 release=2 # 0 for skip release, 1 for pre-release, 2 for release -luminolRef=747ad851920a569d00857edea61c861c018ea684 +luminolRef=ae4e53c446fef1f4fdbcd166a27d73e7eb93ea72 org.gradle.configuration-cache=true org.gradle.caching=true 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 caa96dd..27967f1 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 @@ -24,6 +24,7 @@ import com.mojang.authlib.properties.Property; import com.mojang.logging.LogUtils; import fun.bm.lophine.config.modules.function.FakeplayerConfig; import io.papermc.paper.adventure.PaperAdventure; +import io.papermc.paper.threadedregions.RegionizedServer; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.Style; import net.minecraft.nbt.CompoundTag; @@ -173,31 +174,14 @@ public class BotList { bot.supressTrackerForLogin = true; - io.papermc.paper.threadedregions.RegionizedServer.getInstance().taskQueue.queueTickTaskQueue( - world, net.minecraft.util.Mth.floor(location.getX()) >> 4, net.minecraft.util.Mth.floor(location.getZ()) >> 4, - () -> { - world.addNewPlayer(bot); - - BotJoinEvent event1 = new BotJoinEvent(bot.getBukkitEntity(), PaperAdventure.asAdventure(Component.translatable("multiplayer.player.joined", bot.getDisplayName())).style(Style.style(NamedTextColor.YELLOW))); - this.server.server.getPluginManager().callEvent(event1); - - net.kyori.adventure.text.Component joinMessage = event1.joinMessage(); - if (joinMessage != null && !joinMessage.equals(net.kyori.adventure.text.Component.empty())) { - this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(joinMessage), false); - } - - bot.renderInfo(); - bot.supressTrackerForLogin = false; - - bot.level().getChunkSource().chunkMap.addEntity(bot); - bot.renderData(); - bot.initInventoryMenu(); - botsNameByWorldUuid - .computeIfAbsent(bot.level().uuid.toString(), (k) -> new HashSet<>()) - .add(bot.getBukkitEntity().getRealName()); - 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()); - }, - ca.spottedleaf.concurrentutil.util.Priority.HIGHER); + 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); @@ -205,6 +189,30 @@ public class BotList { return bot; } + private ServerBot summonBot(ServerBot bot, ServerLevel world) { + world.addNewPlayer(bot); + + BotJoinEvent event1 = new BotJoinEvent(bot.getBukkitEntity(), PaperAdventure.asAdventure(Component.translatable("multiplayer.player.joined", bot.getDisplayName())).style(Style.style(NamedTextColor.YELLOW))); + this.server.server.getPluginManager().callEvent(event1); + + net.kyori.adventure.text.Component joinMessage = event1.joinMessage(); + if (joinMessage != null && !joinMessage.equals(net.kyori.adventure.text.Component.empty())) { + this.server.getPlayerList().broadcastSystemMessage(PaperAdventure.asVanilla(joinMessage), false); + } + + bot.renderInfo(); + bot.supressTrackerForLogin = false; + + bot.level().getChunkSource().chunkMap.addEntity(bot); + bot.renderData(); + bot.initInventoryMenu(); + botsNameByWorldUuid + .computeIfAbsent(bot.level().uuid.toString(), (k) -> new HashSet<>()) + .add(bot.getBukkitEntity().getRealName()); + 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; + } + public boolean removeBot(@NotNull ServerBot bot, @NotNull BotRemoveEvent.RemoveReason reason, @Nullable CommandSender remover, boolean saved) { return this.removeBot(bot, reason, remover, saved, this.dataStorage); } @@ -301,19 +309,27 @@ public class BotList { } else { finished = false; check.getAndIncrement(); - bot.getBukkitEntity().taskScheduler.schedule((Entity unused) -> { - BotList.this.removeBot(bot, BotRemoveEvent.RemoveReason.INTERNAL, null, FakeplayerConfig.canResident); - received.getAndIncrement(); - if (received.get() >= check.get()) { - this.forceShutdown = true; - MinecraftServer.getServer().stopServer(); - } - }, null, 1L); + removeBot(bot, check, received, new AtomicInteger()); } } return finished; } + private void removeBot(ServerBot bot, AtomicInteger check, AtomicInteger received, AtomicInteger counter) { + bot.getBukkitEntity().taskScheduler.schedule((Entity unused) -> { + if (counter.get() >= 20) { + BotList.LOGGER.info("Try to remove bot {} located in [{}]{},{},{} too many times!", bot.getName().getString(), bot.level().serverLevelData.getLevelName(), bot.getX(), bot.getY(), bot.getZ()); + } + counter.getAndIncrement(); + this.removeBot(bot, BotRemoveEvent.RemoveReason.INTERNAL, null, FakeplayerConfig.canResident); + received.getAndIncrement(); + if (received.get() >= check.get()) { + this.forceShutdown = true; + MinecraftServer.getServer().stopServer(); + } + }, (Entity unused) -> removeBot(bot, check, received, counter), 1L); + } + public void loadBotInfo() { if (!FakeplayerConfig.enable || !FakeplayerConfig.canResident) { return;