From fc58fbd1ce440fb81ea15aaaca496f6f7d757128 Mon Sep 17 00:00:00 2001 From: Igor Date: Thu, 3 Sep 2026 21:09:30 +0200 Subject: [PATCH] Bots log in at the town of their level and leave for the spot in waves (gear and buffs first); party distribution type never null (sweeper NPE) --- .../managers/FakePlayerHeadlessManager.java | 26 ++++++++++++++++--- .../managers/FakePlayerRaidManager.java | 3 ++- .../gameserver/managers/FakePlayerSocial.java | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerHeadlessManager.java b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerHeadlessManager.java index 7418a51..b4e2dff 100644 --- a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerHeadlessManager.java +++ b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerHeadlessManager.java @@ -48,6 +48,7 @@ import org.l2jmobius.gameserver.entity.actor.enums.player.TeleportWhereType; import org.l2jmobius.gameserver.entity.actor.instance.Monster; import org.l2jmobius.gameserver.entity.clan.Clan; import org.l2jmobius.gameserver.entity.groups.Party; +import org.l2jmobius.gameserver.entity.groups.PartyDistributionType; import org.l2jmobius.gameserver.entity.item.enums.ItemProcessType; import org.l2jmobius.gameserver.entity.item.instance.Item; import org.l2jmobius.gameserver.managers.FakePlayerChatManager.Understanding; @@ -170,6 +171,7 @@ public class FakePlayerHeadlessManager return null; } player.setHeadlessBot(true); + player.setPartyDistributionType(org.l2jmobius.gameserver.entity.groups.PartyDistributionType.FINDERS_KEEPERS); // Never null: bots open parties themselves. // Identity from the seeded population: personality, race, home zone. final FakePlayerBotState state = new FakePlayerBotState(); @@ -233,12 +235,30 @@ public class FakePlayerHeadlessManager } } state.spot = spot; + state.combat.nextLeashCheck = System.currentTimeMillis() + 240000; // The leash must not drag the bot out of town early. player.getStatus().setCurrentHp(player.getMaxHp()); player.getStatus().setCurrentMp(player.getMaxMp()); player.getStatus().setCurrentCp(player.getMaxCp()); - player.spawnMe(spot.getX() + Rnd.get(-400, 400), spot.getY() + Rnd.get(-400, 400), spot.getZ()); + // Like a login: appear in the town of the level, gear up and buff there, then leave for the spot. + Location start = spot; + final Object[] town = FakePlayerProgressionManager.getInstance().pickTownSpot(player.getLevel(), state.race); + if (town != null) + { + start = (Location) town[0]; + } + player.spawnMe(start.getX() + Rnd.get(-150, 150), start.getY() + Rnd.get(-150, 150), start.getZ()); player.setRunning(); _bots.add(player); + state.action("logged in"); + final Location destination = spot; + ThreadPool.schedule(() -> + { + if (!player.isDead() && (stateOf(player) != null) && (stateOf(player).siegeSide == 0) && (stateOf(player).raidBossId == 0) && !player.isInStoreMode()) + { + teleport(player, destination.getX() + Rnd.get(-300, 300), destination.getY() + Rnd.get(-300, 300), destination.getZ()); + state.action("to spot"); + } + }, 6000 + Rnd.get(_bots.size() * 150, 20000 + (_bots.size() * 250))); return player; } catch (Exception e) @@ -409,7 +429,7 @@ public class FakePlayerHeadlessManager } else { - requestor.setParty(new Party(requestor, requestor.getPartyDistributionType())); + requestor.setParty(new Party(requestor, (requestor.getPartyDistributionType() != null) ? requestor.getPartyDistributionType() : org.l2jmobius.gameserver.entity.groups.PartyDistributionType.FINDERS_KEEPERS)); target.joinParty(requestor.getParty()); } target.setActiveRequester(null); @@ -1564,7 +1584,7 @@ public class FakePlayerHeadlessManager teleport(bot, target.getLocation()); if (target.getParty() == null) { - final Party party = new Party(target, target.getPartyDistributionType()); + final Party party = new Party(target, (target.getPartyDistributionType() != null) ? target.getPartyDistributionType() : org.l2jmobius.gameserver.entity.groups.PartyDistributionType.FINDERS_KEEPERS); target.setParty(party); bot.joinParty(party); } diff --git a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerRaidManager.java b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerRaidManager.java index a276c0b..715dfb5 100644 --- a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerRaidManager.java +++ b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerRaidManager.java @@ -34,6 +34,7 @@ import org.l2jmobius.gameserver.entity.actor.Npc; import org.l2jmobius.gameserver.entity.actor.Player; import org.l2jmobius.gameserver.entity.actor.instance.RaidBoss; import org.l2jmobius.gameserver.entity.groups.Party; +import org.l2jmobius.gameserver.entity.groups.PartyDistributionType; /** * Raid boss hunts by headless bots: every 30-90 minutes a real party of 5-9 @@ -151,7 +152,7 @@ public class FakePlayerRaidManager } } final Player leader = party.get(0); - final Party group = new Party(leader, leader.getPartyDistributionType()); + final Party group = new Party(leader, PartyDistributionType.FINDERS_KEEPERS); leader.setParty(group); int index = 0; for (Player bot : party) diff --git a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerSocial.java b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerSocial.java index cd5bd4c..97d6e01 100644 --- a/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerSocial.java +++ b/src_mobius/mobius/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/managers/FakePlayerSocial.java @@ -237,7 +237,7 @@ public class FakePlayerSocial } else { - squad = new Party(bot, bot.getPartyDistributionType()); + squad = new Party(bot, PartyDistributionType.FINDERS_KEEPERS); bot.setParty(squad); mate.joinParty(squad); }