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)

This commit is contained in:
2026-09-03 21:09:30 +02:00
parent 8af080ee3d
commit fc58fbd1ce
3 changed files with 26 additions and 5 deletions
@@ -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.actor.instance.Monster;
import org.l2jmobius.gameserver.entity.clan.Clan; import org.l2jmobius.gameserver.entity.clan.Clan;
import org.l2jmobius.gameserver.entity.groups.Party; 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.enums.ItemProcessType;
import org.l2jmobius.gameserver.entity.item.instance.Item; import org.l2jmobius.gameserver.entity.item.instance.Item;
import org.l2jmobius.gameserver.managers.FakePlayerChatManager.Understanding; import org.l2jmobius.gameserver.managers.FakePlayerChatManager.Understanding;
@@ -170,6 +171,7 @@ public class FakePlayerHeadlessManager
return null; return null;
} }
player.setHeadlessBot(true); 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. // Identity from the seeded population: personality, race, home zone.
final FakePlayerBotState state = new FakePlayerBotState(); final FakePlayerBotState state = new FakePlayerBotState();
@@ -233,12 +235,30 @@ public class FakePlayerHeadlessManager
} }
} }
state.spot = spot; 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().setCurrentHp(player.getMaxHp());
player.getStatus().setCurrentMp(player.getMaxMp()); player.getStatus().setCurrentMp(player.getMaxMp());
player.getStatus().setCurrentCp(player.getMaxCp()); 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(); player.setRunning();
_bots.add(player); _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; return player;
} }
catch (Exception e) catch (Exception e)
@@ -409,7 +429,7 @@ public class FakePlayerHeadlessManager
} }
else 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.joinParty(requestor.getParty());
} }
target.setActiveRequester(null); target.setActiveRequester(null);
@@ -1564,7 +1584,7 @@ public class FakePlayerHeadlessManager
teleport(bot, target.getLocation()); teleport(bot, target.getLocation());
if (target.getParty() == null) 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); target.setParty(party);
bot.joinParty(party); bot.joinParty(party);
} }
@@ -34,6 +34,7 @@ import org.l2jmobius.gameserver.entity.actor.Npc;
import org.l2jmobius.gameserver.entity.actor.Player; import org.l2jmobius.gameserver.entity.actor.Player;
import org.l2jmobius.gameserver.entity.actor.instance.RaidBoss; import org.l2jmobius.gameserver.entity.actor.instance.RaidBoss;
import org.l2jmobius.gameserver.entity.groups.Party; 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 * 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 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); leader.setParty(group);
int index = 0; int index = 0;
for (Player bot : party) for (Player bot : party)
@@ -237,7 +237,7 @@ public class FakePlayerSocial
} }
else else
{ {
squad = new Party(bot, bot.getPartyDistributionType()); squad = new Party(bot, PartyDistributionType.FINDERS_KEEPERS);
bot.setParty(squad); bot.setParty(squad);
mate.joinParty(squad); mate.joinParty(squad);
} }