From f09de1e1ac3423c909fea5f552b91dc4f47c2314 Mon Sep 17 00:00:00 2001 From: Maneco2 <maneco_1@hotmail.com> Date: Thu, 3 Sep 2020 14:26:45 -0300 Subject: [PATCH] Rework Queen Ant AI Queen Ant has chance defend clan inside the zone Match retail. Queen Ant will not attack players outside the zone with normal attacks. Queen Ant movement based in zone match retail. Add respawn in Admin Panel Fixes #301 --- .../datapack/ai/individual/QueenAnt.java | 428 +++++++++++------- .../admincommandhandlers/AdminGrandBoss.java | 28 +- .../data/html/admin/grandboss_queenant.htm | 3 +- 3 files changed, 286 insertions(+), 173 deletions(-) diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java b/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java index 5d57d77ad1..d6371555ba 100644 --- a/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java +++ b/src/main/java/com/l2jserver/datapack/ai/individual/QueenAnt.java @@ -19,34 +19,38 @@ package com.l2jserver.datapack.ai.individual; import static com.l2jserver.gameserver.config.Configuration.grandBoss; -import static com.l2jserver.gameserver.config.Configuration.npc; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import com.l2jserver.datapack.ai.npc.AbstractNpcAI; import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.enums.MountType; import com.l2jserver.gameserver.enums.audio.Music; import com.l2jserver.gameserver.instancemanager.GrandBossManager; +import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.StatsSet; import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; -import com.l2jserver.gameserver.model.actor.L2Playable; import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance; import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.holders.SkillHolder; -import com.l2jserver.gameserver.model.skills.CommonSkill; +import com.l2jserver.gameserver.model.skills.AttributeType; import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.model.zone.L2ZoneType; import com.l2jserver.gameserver.model.zone.type.L2BossZone; import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse; /** - * Queen Ant's AI + * Queen Ant AI * @author Emperorc + * @author Maneco2 */ public final class QueenAnt extends AbstractNpcAI { + // NPCs private static final int QUEEN = 29001; private static final int LARVA = 29002; private static final int NURSE = 29003; @@ -61,57 +65,62 @@ public final class QueenAnt extends AbstractNpcAI { ROYAL }; - private static final Location OUST_LOC_1 = new Location(-19480, 187344, -5600); - private static final Location OUST_LOC_2 = new Location(-17928, 180912, -5520); - private static final Location OUST_LOC_3 = new Location(-23808, 182368, -5600); - + // Queen Ant Location private static final int QUEEN_X = -21610; private static final int QUEEN_Y = 181594; private static final int QUEEN_Z = -5734; - - // QUEEN Status Tracking : - private static final byte ALIVE = 0; // Queen Ant is spawned. - private static final byte DEAD = 1; // Queen Ant has been killed. - + // Larva Location + private static final Location LARVA_LOCATION = new Location(-21600, 179482, -5846, getRandom(360)); + // Zones + private static final int ZONE = 12012; + private static final Location TELE_LOCATION_1 = new Location(-19480, 187344, -5600); + private static final Location TELE_LOCATION_2 = new Location(-17928, 180912, -5520); + private static final Location TELE_LOCATION_3 = new Location(-23808, 182368, -5600); + // Skills + private static final SkillHolder RAID_CURSE = new SkillHolder(4215); // Raid Curse - Silence + private static final SkillHolder RAID_CURSE_2 = new SkillHolder(4515); // Raid Curse - Stone + private static final SkillHolder QUEEN_ANT_BRANDISH = new SkillHolder(4017); // Queen Ant Brandish + private static final SkillHolder DECREASE_SPEED_1 = new SkillHolder(4018); // Decrease Speed + private static final SkillHolder DECREASE_SPEED_2 = new SkillHolder(4019); // Decrease Speed + private static final SkillHolder HEAL_QUEEN_ANT_1 = new SkillHolder(4020); // Heal Queen Ant1 + private static final SkillHolder HEAL_QUEEN_ANT_2 = new SkillHolder(4024); // Heal Queen Ant2 + private static final SkillHolder ANTI_STRIDER = new SkillHolder(4258); // Hinder Strider + // Variables private static L2BossZone _zone; - - private static SkillHolder HEAL1 = new SkillHolder(4020, 1); - private static SkillHolder HEAL2 = new SkillHolder(4024, 1); - + private static final String ATTACK_FLAG = "ATTACK_FLAG"; private L2MonsterInstance _queen = null; private L2MonsterInstance _larva = null; private final List<L2MonsterInstance> _nurses = new CopyOnWriteArrayList<>(); + // Status + private static final int ALIVE = 0; + private static final int DEAD = 1; public QueenAnt() { super(QueenAnt.class.getSimpleName(), "ai/individual"); - addSpawnId(MOBS); addKillId(MOBS); - addAggroRangeEnterId(MOBS); - addFactionCallId(NURSE); + addSpawnId(MOBS); + addExitZoneId(ZONE); + addEnterZoneId(ZONE); + addSkillSeeId(QUEEN); + addMoveFinishedId(QUEEN); + addAttackId(QUEEN, NURSE, GUARD, ROYAL); _zone = GrandBossManager.getInstance().getZone(QUEEN_X, QUEEN_Y, QUEEN_Z); - StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN); - int status = GrandBossManager.getInstance().getBossStatus(QUEEN); - if (status == DEAD) { - // load the unlock date and time for queen ant from DB - long temp = info.getLong("respawn_time") - System.currentTimeMillis(); - // if queen ant is locked until a certain time, mark it so and start the unlock timer - // the unlock time has not yet expired. - if (temp > 0) { - startQuestTimer("queen_unlock", temp, null, null); + final StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN); + if (GrandBossManager.getInstance().getBossStatus(QUEEN) == DEAD) { + final long remain = info.getLong("respawn_time") - System.currentTimeMillis(); + if (remain > 0) { + startQuestTimer("QUEEN_UNLOCK", remain, null, null); } else { - // the time has already expired while the server was offline. Immediately spawn queen ant. - L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0); - GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE); - spawnBoss(queen); + notifyEvent("QUEEN_UNLOCK", null, null); } } else { + int hp = info.getInt("currentHP"); + int mp = info.getInt("currentMP"); int loc_x = info.getInt("loc_x"); int loc_y = info.getInt("loc_y"); int loc_z = info.getInt("loc_z"); int heading = info.getInt("heading"); - int hp = info.getInt("currentHP"); - int mp = info.getInt("currentMP"); if (!_zone.isInsideZone(loc_x, loc_y, loc_z)) { loc_x = QUEEN_X; loc_y = QUEEN_Y; @@ -123,183 +132,246 @@ public final class QueenAnt extends AbstractNpcAI { } } - private void spawnBoss(L2GrandBossInstance npc) { - GrandBossManager.getInstance().addBoss(npc); - if (getRandom(100) < 33) { - _zone.movePlayersTo(OUST_LOC_1); - } else if (getRandom(100) < 50) { - _zone.movePlayersTo(OUST_LOC_2); - } else { - _zone.movePlayersTo(OUST_LOC_3); - } - GrandBossManager.getInstance().addBoss(npc); - startQuestTimer("action", 10000, npc, null, true); - startQuestTimer("heal", 1000, null, null, true); - npc.broadcastPacket(Music.BS01_A_10000.getPacket()); - _queen = npc; - _larva = (L2MonsterInstance) addSpawn(LARVA, -21600, 179482, -5846, getRandom(360), false, 0); - } - @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { - if (event.equalsIgnoreCase("heal")) { - boolean notCasting; - final boolean larvaNeedHeal = (_larva != null) && (_larva.getCurrentHp() < _larva.getMaxHp()); - final boolean queenNeedHeal = (_queen != null) && (_queen.getCurrentHp() < _queen.getMaxHp()); - for (L2MonsterInstance nurse : _nurses) { - if ((nurse == null) || nurse.isDead() || nurse.isCastingNow()) { - continue; + switch (event) { + case "CHECK_ZONE": { + if (npc != null) { + addMoveToDesire(npc, new Location(-21610, 181594, -5734, 0), 0); + if (_zone.isInsideZone(npc)) { + cancelQuestTimers("CHECK_ZONE"); + } + } + break; + } + case "CORE_AI": { + if ((npc != null) && (npc.isCoreAIDisabled()) && (_zone.isInsideZone(npc))) { + ((L2Attackable) npc).clearAggroList(); + npc.disableCoreAI(false); + npc.setIsImmobilized(false); + npc.getVariables().set(ATTACK_FLAG, false); } - - notCasting = nurse.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST; - if (larvaNeedHeal) { - if ((nurse.getTarget() != _larva) || notCasting) { - nurse.setTarget(_larva); - nurse.useMagic(getRandomBoolean() ? HEAL1.getSkill() : HEAL2.getSkill()); + break; + } + case "CORE_MOVEMENT": { + if (npc != null) { + final L2Object obj = npc.getTarget(); + if ((obj != null) && (obj.isPlayer()) && (_zone.isInsideZone(obj))) { + _queen.setIsImmobilized(false); } - continue; + npc.getVariables().set(ATTACK_FLAG, false); } - if (queenNeedHeal) { - if (nurse.getLeader() == _larva) { - continue; + break; + } + case "HEAL": { + if ((npc != null) && (!npc.isCastingNow())) { + if ((_larva != null) && (_queen != null)) { + if (_larva.getCurrentHp() < _larva.getMaxHp()) { + if (npc.calculateDistance(_larva, false, false) < 2500) { + addSkillCastDesire(npc, _larva, getRandomBoolean() ? HEAL_QUEEN_ANT_1 : HEAL_QUEEN_ANT_2, 100L); + } else { + addMoveToDesire(npc, LARVA_LOCATION, 0); + } + } else if (_queen.getCurrentHp() < _queen.getMaxHp()) { + addSkillCastDesire(npc, _queen, HEAL_QUEEN_ANT_1, 1000000L); + } } - - if ((nurse.getTarget() != _queen) || notCasting) { - nurse.setTarget(_queen); - nurse.useMagic(HEAL1.getSkill()); + if ((!npc.isMoving()) && (npc.getAI().getIntention() == CtrlIntention.AI_INTENTION_ATTACK)) { + ((L2Attackable) npc).clearAggroList(); + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE); } - continue; } - // if nurse not casting - remove target - if (notCasting && (nurse.getTarget() != null)) { - nurse.setTarget(null); + break; + } + case "ACTION": { + if ((getRandom(100) < 30) && (npc != null) && (!npc.isInCombat())) { + if (getRandom(100) < 50) { + npc.broadcastSocialAction(3); + } else { + npc.broadcastSocialAction(4); + } } + break; } - } else if (event.equalsIgnoreCase("action") && (npc != null)) { - if (getRandom(3) == 0) { - if (getRandom(2) == 0) { - npc.broadcastSocialAction(3); + case "QUEEN_UNLOCK": { + L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0); + GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE); + spawnBoss(queen); + break; + } + case "RAID_CURSE": { + if ((player != null) && (!_zone.isInsideZone(player))) { + cancelQuestTimers("RAID_CURSE"); + } else if ((player != null) && (!player.isDead()) && (_zone.isInsideZone(player)) && (_queen != null) && (!_queen.isDead())) { + if ((player.getLevel() - _queen.getLevel()) > 8) { + if (player.isMageClass()) { + if (!player.isAffectedBySkill(RAID_CURSE.getSkillId())) { + _queen.broadcastPacket(new MagicSkillUse(_queen, player, RAID_CURSE.getSkillId(), 1, 300, 0)); + RAID_CURSE.getSkill().applyEffects(_queen, player); + } + } else { + if (!player.isAffectedBySkill(RAID_CURSE_2.getSkillId())) { + _queen.broadcastPacket(new MagicSkillUse(_queen, player, RAID_CURSE_2.getSkillId(), 1, 300, 0)); + RAID_CURSE_2.getSkill().applyEffects(_queen, player); + } + } + } + } + break; + } + case "RESPAWN_QUEEN": { + if (GrandBossManager.getInstance().getBossStatus(QUEEN) == DEAD) { + GrandBossManager.getInstance().getStatsSet(QUEEN).set("respawn_time", 0); + cancelQuestTimers("QUEEN_UNLOCK"); + notifyEvent("QUEEN_UNLOCK", null, null); } else { - npc.broadcastSocialAction(4); + player.sendMessage(getClass().getSimpleName() + ": You cant respawn Queen Ant while Queen Ant is alive!"); } + break; } - } else if (event.equalsIgnoreCase("queen_unlock")) { - L2GrandBossInstance queen = (L2GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0); - GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE); - spawnBoss(queen); } return super.onAdvEvent(event, npc, player); } + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill) { + if ((_zone.isInsideZone(npc)) && (npc != null) && (_queen != null) && (!npc.isCastingNow()) && (!npc.isCoreAIDisabled())) { + switch (npc.getId()) { + case QUEEN: { + if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTI_STRIDER.getSkillId())) { + if (npc.checkDoCastConditions(ANTI_STRIDER.getSkill())) { + addSkillCastDesire(npc, attacker, ANTI_STRIDER, 1000000L); + } + } else if ((skill != null) && (skill.getAttributeType() == AttributeType.FIRE) && (getRandom(100) < 70)) { + addSkillCastDesire(npc, attacker, DECREASE_SPEED_1, 1000000L); + } else if ((npc.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 10)) { + addSkillCastDesire(npc, attacker, DECREASE_SPEED_2, 1000000L); + } else if ((npc.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 10)) { + if ((npc.calculateDistance(attacker, false, false) < 500) && (getRandom(100) < 80)) { + addSkillCastDesire(npc, attacker, DECREASE_SPEED_1, 1000000L); + } else { + addSkillCastDesire(npc, attacker, DECREASE_SPEED_2, 1000000L); + } + } else if ((npc.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 5)) { + addSkillCastDesire(npc, attacker, QUEEN_ANT_BRANDISH, 1000000L); + } + break; + } + case NURSE: + case ROYAL: { + if ((_queen.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 5)) { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L); + } else if ((_queen.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 5)) { + if (getRandom(100) < 80) { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_1, 1000000L); + } else { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L); + } + } else if ((_queen.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 2)) { + addSkillCastDesire(_queen, attacker, QUEEN_ANT_BRANDISH, 1000000L); + } + break; + } + case GUARD: { + if (attacker.isPlayer()) { + if ((_queen.calculateDistance(attacker, false, false) > 500) && (getRandom(100) < 3)) { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L); + } else if ((_queen.calculateDistance(attacker, false, false) > 150) && (getRandom(100) < 3)) { + if (getRandom(100) < 80) { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_1, 1000000L); + } else { + addSkillCastDesire(_queen, attacker, DECREASE_SPEED_2, 1000000L); + } + } else if ((_queen.calculateDistance(attacker, false, false) < 250) && (getRandom(100) < 2)) { + addSkillCastDesire(_queen, attacker, QUEEN_ANT_BRANDISH, 1000000L); + } + } + break; + } + } + } + if ((!npc.getVariables().getBoolean(ATTACK_FLAG, false)) && !npc.isCoreAIDisabled()) { + if (npc.calculateDistance(attacker, false, false) > 150) { + _queen.setIsImmobilized(true); + } + npc.getVariables().set(ATTACK_FLAG, true); + startQuestTimer("CORE_MOVEMENT", 5000, npc, null); + } + return super.onAttack(npc, attacker, damage, isSummon, skill); + } + + @Override + public String onSkillSee(L2Npc npc, L2PcInstance player, Skill skill, L2Object[] targets, boolean isSummon) { + if ((skill.getEffectPoint() > 0) && (getRandom(100) < 15)) { + if ((_zone.isInsideZone(npc)) && (npc != null) && (!npc.isCastingNow()) && (!npc.isCoreAIDisabled())) { + addSkillCastDesire(npc, player, DECREASE_SPEED_1, 1000000L); + } + } + return super.onSkillSee(npc, player, skill, targets, isSummon); + } + @Override public String onSpawn(L2Npc npc) { final L2MonsterInstance mob = (L2MonsterInstance) npc; switch (npc.getId()) { - case LARVA: - mob.setIsImmobilized(true); + case QUEEN: { + startQuestTimer("ACTION", 10000, npc, null, true); + break; + } + case LARVA: { mob.setIsMortal(false); mob.setIsRaidMinion(true); + mob.setIsImmobilized(true); break; - case NURSE: + } + case NURSE: { + _nurses.add(mob); mob.disableCoreAI(true); mob.setIsRaidMinion(true); - _nurses.add(mob); + startQuestTimer("HEAL", 2000, mob, null, true); break; + } case ROYAL: - case GUARD: + case GUARD: { mob.setIsRaidMinion(true); break; + } } return super.onSpawn(npc); } @Override - public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon) { - if ((caller == null) || (npc == null)) { - return super.onFactionCall(npc, caller, attacker, isSummon); - } - - if (!npc.isCastingNow() && (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST)) { - if (caller.getCurrentHp() < caller.getMaxHp()) { - npc.setTarget(caller); - ((L2Attackable) npc).useMagic(HEAL1.getSkill()); - } - } - return null; - } - - @Override - public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon) { - if ((npc == null) || (player.isGM() && player.isInvisible())) { - return null; - } - - final boolean isMage; - final L2Playable character; - if (isSummon) { - isMage = false; - character = player.getSummon(); - } else { - isMage = player.isMageClass(); - character = player; - } - - if (character == null) { - return null; - } - - if (npc().raidCurse() && ((character.getLevel() - npc.getLevel()) > 8)) { - Skill curse = null; - if (isMage) { - if (!character.isMuted() && (getRandom(4) == 0)) { - curse = CommonSkill.RAID_CURSE.getSkill(); - } - } else { - if (!character.isParalyzed() && (getRandom(4) == 0)) { - curse = CommonSkill.RAID_CURSE2.getSkill(); - } - } - - if (curse != null) { - npc.broadcastPacket(new MagicSkillUse(npc, character, curse.getId(), curse.getLevel(), 300, 0)); - curse.applyEffects(npc, character); - } - - ((L2Attackable) npc).stopHating(character); // for calling again - return null; - } - - return super.onAggroRangeEnter(npc, player, isSummon); + public String onEnterZone(L2Character character, L2ZoneType zone) { + final L2PcInstance player = character.getActingPlayer(); + notifyEvent("RAID_CURSE", _queen, player); + startQuestTimer("RAID_CURSE", 3000, _queen, player, true); + return super.onEnterZone(character, zone); } @Override public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { - int npcId = npc.getId(); - if (npcId == QUEEN) { + if (npc.getId() == QUEEN) { + cancelQuestTimers("HEAL"); + cancelQuestTimers("ACTION"); npc.broadcastPacket(Music.BS02_D_10000.getPacket()); GrandBossManager.getInstance().setBossStatus(QUEEN, DEAD); - // Calculate Min and Max respawn times randomly. - long respawnTime = grandBoss().getIntervalOfQueenAntSpawn() + getRandom(-grandBoss().getRandomOfQueenAntSpawn(), grandBoss().getRandomOfQueenAntSpawn()); - respawnTime *= 3600000; - startQuestTimer("queen_unlock", respawnTime, null, null); - cancelQuestTimer("action", npc, null); - cancelQuestTimer("heal", null, null); - // also save the respawn time so that the info is maintained past reboots - StatsSet info = GrandBossManager.getInstance().getStatsSet(QUEEN); - info.set("respawn_time", System.currentTimeMillis() + respawnTime); - GrandBossManager.getInstance().setStatsSet(QUEEN, info); + final long respawnTime = (grandBoss().getIntervalOfQueenAntSpawn() + getRandom(-grandBoss().getRandomOfQueenAntSpawn(), grandBoss().getRandomOfQueenAntSpawn())) * 3600000; + GrandBossManager.getInstance().getStatsSet(QUEEN).set("respawn_time", (System.currentTimeMillis() + respawnTime)); + startQuestTimer("QUEEN_UNLOCK", respawnTime, null, null); _nurses.clear(); - _larva.deleteMe(); - _larva = null; _queen = null; + if (_larva != null) { + _larva.deleteMe(); + _larva = null; + } } else if ((_queen != null) && !_queen.isAlikeDead()) { - if (npcId == ROYAL) { + if (npc.getId() == ROYAL) { L2MonsterInstance mob = (L2MonsterInstance) npc; if (mob.getLeader() != null) { mob.getLeader().getMinionList().onMinionDie(mob, (280 + getRandom(40)) * 1000); } - } else if (npcId == NURSE) { + } else if (npc.getId() == NURSE) { L2MonsterInstance mob = (L2MonsterInstance) npc; _nurses.remove(mob); if (mob.getLeader() != null) { @@ -307,6 +379,36 @@ public final class QueenAnt extends AbstractNpcAI { } } } + return super.onKill(npc, killer, isSummon); } + + @Override + public String onExitZone(L2Character character, L2ZoneType zone) { + if ((character.isAttackable()) && (character.isRaid()) && (!_zone.isInsideZone(_queen)) && (_queen != null)) { + _queen.disableCoreAI(true); + _queen.setIsImmobilized(false); + startQuestTimer("CHECK_ZONE", 1000, _queen, null, true); + } + return super.onExitZone(character, zone); + } + + @Override + public void onMoveFinished(L2Npc npc) { + startQuestTimer("CORE_AI", 100, npc, null); + } + + private void spawnBoss(L2GrandBossInstance npc) { + if (getRandom(100) < 33) { + _zone.movePlayersTo(TELE_LOCATION_1); + } else if (getRandom(100) < 50) { + _zone.movePlayersTo(TELE_LOCATION_2); + } else { + _zone.movePlayersTo(TELE_LOCATION_3); + } + GrandBossManager.getInstance().addBoss(npc); + npc.broadcastPacket(Music.BS01_A_10000.getPacket()); + _queen = npc; + _larva = (L2MonsterInstance) addSpawn(LARVA, LARVA_LOCATION, false, 0); + } } diff --git a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java index ea68d6d566..8bcb95adde 100644 --- a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java +++ b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGrandBoss.java @@ -22,6 +22,7 @@ import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.StringTokenizer; +import com.l2jserver.datapack.ai.individual.QueenAnt; import com.l2jserver.datapack.ai.individual.Antharas.Antharas; import com.l2jserver.datapack.ai.individual.Baium.Baium; import com.l2jserver.gameserver.cache.HtmCache; @@ -78,7 +79,7 @@ public class AdminGrandBoss implements IAdminCommandHandler { final int grandBossId = Integer.parseInt(st.nextToken()); if (grandBossId == ANTHARAS) { - antharasAi().notifyEvent("SKIP_WAITING", null, activeChar); + getAntharasAI().notifyEvent("SKIP_WAITING", null, activeChar); manageHtml(activeChar, grandBossId); } else { activeChar.sendMessage("Wrong ID!"); @@ -94,12 +95,17 @@ public class AdminGrandBoss implements IAdminCommandHandler { switch (grandBossId) { case ANTHARAS: { - antharasAi().notifyEvent("RESPAWN_ANTHARAS", null, activeChar); + getAntharasAI().notifyEvent("RESPAWN_ANTHARAS", null, activeChar); manageHtml(activeChar, grandBossId); break; } case BAIUM: { - baiumAi().notifyEvent("RESPAWN_BAIUM", null, activeChar); + getBaiumAI().notifyEvent("RESPAWN_BAIUM", null, activeChar); + manageHtml(activeChar, grandBossId); + break; + } + case QUEENANT: { + getQueenAntAI().notifyEvent("RESPAWN_QUEEN", null, activeChar); manageHtml(activeChar, grandBossId); break; } @@ -118,11 +124,11 @@ public class AdminGrandBoss implements IAdminCommandHandler { switch (grandBossId) { case ANTHARAS: { - antharasAi().notifyEvent("DESPAWN_MINIONS", null, activeChar); + getAntharasAI().notifyEvent("DESPAWN_MINIONS", null, activeChar); break; } case BAIUM: { - baiumAi().notifyEvent("DESPAWN_MINIONS", null, activeChar); + getBaiumAI().notifyEvent("DESPAWN_MINIONS", null, activeChar); break; } default: { @@ -140,12 +146,12 @@ public class AdminGrandBoss implements IAdminCommandHandler { switch (grandBossId) { case ANTHARAS: { - antharasAi().notifyEvent("ABORT_FIGHT", null, activeChar); + getAntharasAI().notifyEvent("ABORT_FIGHT", null, activeChar); manageHtml(activeChar, grandBossId); break; } case BAIUM: { - baiumAi().notifyEvent("ABORT_FIGHT", null, activeChar); + getBaiumAI().notifyEvent("ABORT_FIGHT", null, activeChar); manageHtml(activeChar, grandBossId); break; } @@ -255,14 +261,18 @@ public class AdminGrandBoss implements IAdminCommandHandler { } } - private Quest antharasAi() { + private Quest getAntharasAI() { return QuestManager.getInstance().getQuest(Antharas.class.getSimpleName()); } - private Quest baiumAi() { + private Quest getBaiumAI() { return QuestManager.getInstance().getQuest(Baium.class.getSimpleName()); } + private Quest getQueenAntAI() { + return QuestManager.getInstance().getQuest(QueenAnt.class.getSimpleName()); + } + @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; diff --git a/src/main/resources/data/html/admin/grandboss_queenant.htm b/src/main/resources/data/html/admin/grandboss_queenant.htm index d12f2ee08c..ecc4b96f1d 100644 --- a/src/main/resources/data/html/admin/grandboss_queenant.htm +++ b/src/main/resources/data/html/admin/grandboss_queenant.htm @@ -9,7 +9,7 @@ </table> <br> <br> -<font color="LEVEL">Queen ant<font><br> +<font color="LEVEL">Queen Ant<font><br> <table width="270" border="0" bgcolor="444444"> <tr> <td>Status:</td> @@ -22,6 +22,7 @@ </table> <br> <br> +<button value="Respawn Queen Ant" action="bypass -h admin_grandboss_respawn 29001" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1> <button value="Teleport to Queen Ant" action="bypass -h admin_move_to -21568 181764 -5722" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1> <button value="Teleport to Queen Ant Larva" action="bypass -h admin_move_to -21598 179595 -5834" width=200 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td><br1> </center> -- GitLab