From 83e0835f6a8f0f98ca80453414a5d217a8c1b09e Mon Sep 17 00:00:00 2001 From: Lomka <zurchika1@gmail.com> Date: Sat, 26 Jun 2021 23:55:37 +0000 Subject: [PATCH] Seed of Destruction Defense stage Merged in seed-of-destruction-defense. Added SoI stage 2 html, changed naming of htmls. Updated html formatting in Gracia scripts. Set protector crystals to be non-talking. Updated skill - 5974 to HF Confirmed version. --- .../ai/npc/Teleports/Survivor/32632-4.htm | 5 + .../ai/npc/Teleports/Survivor/Survivor.java | 30 + .../datapack/gracia/GraciaLoader.java | 21 +- .../datapack/gracia/ai/DraconianTroops.java | 84 + .../datapack/gracia/ai/EnergySeeds.java | 622 +++--- .../gracia/ai/SeedOfDestruction/Defence.java | 632 ++++++ .../gracia/ai/npc/Allenos/32526-01.html | 5 + .../gracia/ai/npc/Allenos/32526-02.html | 6 + .../gracia/ai/npc/Allenos/32526-03.html | 6 + .../gracia/ai/npc/Allenos/32526-04.html | 5 + .../datapack/gracia/ai/npc/Allenos/32526.html | 6 + .../gracia/ai/npc/Allenos/Allenos.java | 77 + .../gracia/ai/npc/GeneralDilios/32549-2.html} | 12 +- .../gracia/ai/npc/GeneralDilios/32549-3.html | 7 + .../gracia/ai/npc/GeneralDilios/32549-4.html | 5 + .../gracia/ai/npc/GeneralDilios/32549-5.html} | 14 +- .../gracia/ai/npc/GeneralDilios/32549-6.html | 5 + .../gracia/ai/npc/GeneralDilios/32549-7.html | 6 + .../gracia/ai/npc/GeneralDilios/32549-8.html | 7 + .../gracia/ai/npc/GeneralDilios/32549-9.html | 5 + .../ai/npc/GeneralDilios/GeneralDilios.java | 52 +- .../ai/npc/TemporaryTeleporter/32602-01.html | 6 + .../ai/npc/TemporaryTeleporter/32602-02.html | 6 + .../ai/npc/TemporaryTeleporter/32602.html | 4 + .../TemporaryTeleporter.java | 86 + .../MountedTroops/32527-entrance.html | 3 + .../MountedTroops/ChamblainsMountedTroop.java | 350 ++++ .../GreatWarriorsMountedTroop.java | 357 ++++ .../MountedTroops/SoldiersMountedTroop.java | 352 ++++ .../MountedTroops/WarriorsMountedTroop.java | 359 ++++ .../AdminGraciaSeeds.java | 2 +- .../32527-00.html | 5 + .../32527-00a.html | 3 + .../32527-01.htm | 7 + .../32527-02.html | 6 + .../32527-03.html | 10 + .../32527-04.htm | 6 + .../32527-05.htm | 6 + .../32527-06.htm | 12 + .../32527-07.html | 5 + .../32527-08.html | 6 + .../32527-09.html | 6 + .../32527-10.html | 6 + .../32527-11.html | 5 + .../32527-12.html | 3 + .../32527-lowlevel.html | 6 + .../32527-noleader.html | 3 + .../32527-noparty.html | 4 + .../32527-noquest.html | 3 + .../32527-noreward.html | 3 + .../32527-reward.html | 3 + .../Q00693_DefeatingDragonkinRemnants.java | 171 ++ src/main/resources/data/Routes.xml | 85 + .../resources/data/html/admin/graciaseeds.htm | 12 +- .../resources/data/html/default/32549-1.htm | 4 +- .../resources/data/html/default/32632-1.htm | 5 - .../resources/data/html/default/32632.htm | 2 +- .../data/instances/ChamblainsMountedTroop.xml | 21 + .../instances/GreatWarriorsMountedTroop.xml | 21 + .../data/instances/SoldiersMountedTroop.xml | 21 + .../data/instances/WarriorsMountedTroop.xml | 21 + .../data/spawnZones/gracia_energy_seeds.xml | 1776 +++++++++++++++++ .../resources/data/stats/npcs/18700-18799.xml | 20 +- .../resources/data/stats/npcs/29100-29199.xml | 5 + .../data/stats/skills/05900-05999.xml | 4 +- src/main/resources/data/xsd/spawnZones.xsd | 2 + 66 files changed, 4996 insertions(+), 419 deletions(-) create mode 100644 src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/32632-4.htm create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/DraconianTroops.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/SeedOfDestruction/Defence.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-01.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-02.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-03.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-04.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/Allenos.java rename src/main/{resources/data/html/default/32549-2.htm => java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-2.html} (93%) create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-3.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-4.html rename src/main/{resources/data/html/default/32549-3.htm => java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-5.html} (97%) create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-6.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-7.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-8.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-9.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-01.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-02.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/TemporaryTeleporter.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/32527-entrance.html create mode 100644 src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/ChamblainsMountedTroop.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/GreatWarriorsMountedTroop.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/SoldiersMountedTroop.java create mode 100644 src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/WarriorsMountedTroop.java create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00a.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-01.htm create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-02.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-03.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-04.htm create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-05.htm create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-06.htm create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-07.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-08.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-09.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-10.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-11.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-12.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-lowlevel.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noleader.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noparty.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noquest.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noreward.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-reward.html create mode 100644 src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/Q00693_DefeatingDragonkinRemnants.java delete mode 100644 src/main/resources/data/html/default/32632-1.htm create mode 100644 src/main/resources/data/instances/ChamblainsMountedTroop.xml create mode 100644 src/main/resources/data/instances/GreatWarriorsMountedTroop.xml create mode 100644 src/main/resources/data/instances/SoldiersMountedTroop.xml create mode 100644 src/main/resources/data/instances/WarriorsMountedTroop.xml create mode 100644 src/main/resources/data/spawnZones/gracia_energy_seeds.xml diff --git a/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/32632-4.htm b/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/32632-4.htm new file mode 100644 index 0000000000..4f4827e57d --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/32632-4.htm @@ -0,0 +1,5 @@ +<html><body>Gracia Survivor:<br> +The current situation in Gracia?<br> +For the Seed of Destruction... %sod%<br> +As for the Seed of Infinity... %soi% +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/Survivor.java b/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/Survivor.java index e1a6f672ff..c19e235d3a 100644 --- a/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/Survivor.java +++ b/src/main/java/com/l2jserver/datapack/ai/npc/Teleports/Survivor/Survivor.java @@ -19,6 +19,7 @@ package com.l2jserver.datapack.ai.npc.Teleports.Survivor; import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -45,6 +46,35 @@ public final class Survivor extends AbstractNpcAI { @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + if (event.equalsIgnoreCase("STATUS")) { + String htmltext = getHtm(player.getHtmlPrefix(), "32632-4.htm"); + String destructionStatus = ""; + String infinityStatus = ""; + // TODO: Implement Seed of Infinity & stages + // switch(GraciaSeedsManager.getInstance().getSoIState()){ + // case 1: + // infinityStatus = "It's under the enemy's occupation, and the military forces of adventurers and clan members are unleashing an onslaught upon the Hall of Suffering and the Hall of Erosion."; + // case 2: + // infinityStatus = "It's under enemy occupation, but the situation is currently favorable, and an infiltration route to the Heart has been secured. All that is left is the final battle with Ekimus and the clean-up of his followers hiding in the Hall of Suffering!"; + // case 3: + // infinityStatus = "Our forces have occupied it and are currently investigating the depths."; + // case 4: + // infinityStatus = "It's under occupation by our forces, but the enemy has resurrected and is attacking toward the Hall of Suffering and the Hall of Erosion."; + // case 5: + // infinityStatus = "It's under occupation by our forces, but the enemy has already overtaken the Hall of Erosion and is driving out our forces from the Hall of Suffering toward the Heart. It seems that Ekimus will revive shortly."; + // } + switch (GraciaSeedsManager.getInstance().getSoDState()) { + case 1: + destructionStatus = "It's currently occupied by the enemy and our troops are attacking."; + case 2: + destructionStatus = "It's under occupation by our forces, and I heard that Kucereus' clan is organizing the remnants."; + default: + destructionStatus = "Although we currently have control of it, the enemy is pushing back with a powerful attack."; + } + htmltext = htmltext.replaceAll("%sod%", destructionStatus); + htmltext = htmltext.replaceAll("%soi%", infinityStatus); + return htmltext; + } if ("32632-2.htm".equals(event)) { if (player.getLevel() < MIN_LEVEL) { event = "32632-3.htm"; diff --git a/src/main/java/com/l2jserver/datapack/gracia/GraciaLoader.java b/src/main/java/com/l2jserver/datapack/gracia/GraciaLoader.java index 801b1f2cc6..25a2acaf32 100644 --- a/src/main/java/com/l2jserver/datapack/gracia/GraciaLoader.java +++ b/src/main/java/com/l2jserver/datapack/gracia/GraciaLoader.java @@ -21,20 +21,28 @@ package com.l2jserver.datapack.gracia; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.l2jserver.datapack.gracia.ai.DraconianTroops; import com.l2jserver.datapack.gracia.ai.EnergySeeds; import com.l2jserver.datapack.gracia.ai.Lindvior; import com.l2jserver.datapack.gracia.ai.Maguen; import com.l2jserver.datapack.gracia.ai.StarStones; import com.l2jserver.datapack.gracia.ai.SeedOfAnnihilation.SeedOfAnnihilation; +import com.l2jserver.datapack.gracia.ai.SeedOfDestruction.Defence; +import com.l2jserver.datapack.gracia.ai.npc.Allenos.Allenos; import com.l2jserver.datapack.gracia.ai.npc.FortuneTelling.FortuneTelling; import com.l2jserver.datapack.gracia.ai.npc.GeneralDilios.GeneralDilios; import com.l2jserver.datapack.gracia.ai.npc.Lekon.Lekon; import com.l2jserver.datapack.gracia.ai.npc.Nemo.Nemo; import com.l2jserver.datapack.gracia.ai.npc.Nottingale.Nottingale; import com.l2jserver.datapack.gracia.ai.npc.Seyo.Seyo; +import com.l2jserver.datapack.gracia.ai.npc.TemporaryTeleporter.TemporaryTeleporter; import com.l2jserver.datapack.gracia.ai.npc.ZealotOfShilen.ZealotOfShilen; import com.l2jserver.datapack.gracia.instances.SecretArea.SecretArea; import com.l2jserver.datapack.gracia.instances.SeedOfDestruction.Stage1; +import com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops.ChamblainsMountedTroop; +import com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops.GreatWarriorsMountedTroop; +import com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops.SoldiersMountedTroop; +import com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops.WarriorsMountedTroop; import com.l2jserver.datapack.gracia.instances.SeedOfInfinity.HallOfSuffering.HallOfSuffering; import com.l2jserver.datapack.gracia.vehicles.AirShipGludioGracia.AirShipGludioGracia; import com.l2jserver.datapack.gracia.vehicles.KeucereusNorthController.KeucereusNorthController; @@ -52,30 +60,39 @@ public final class GraciaLoader { private static final Class<?>[] SCRIPTS = { // AIs + DraconianTroops.class, EnergySeeds.class, Lindvior.class, Maguen.class, StarStones.class, // NPCs + Allenos.class, FortuneTelling.class, GeneralDilios.class, Lekon.class, Nemo.class, Nottingale.class, Seyo.class, + TemporaryTeleporter.class, ZealotOfShilen.class, // Seed of Annihilation SeedOfAnnihilation.class, // Instances + Defence.class, SecretArea.class, - Stage1.class, // Seed of Destruction + Stage1.class, + ChamblainsMountedTroop.class, + GreatWarriorsMountedTroop.class, + SoldiersMountedTroop.class, + WarriorsMountedTroop.class, + // Seed of Destruction HallOfSuffering.class, // Seed of Infinity // Vehicles AirShipGludioGracia.class, KeucereusNorthController.class, KeucereusSouthController.class, - SoIController.class, SoDController.class, + SoIController.class, }; public static void main(String[] args) { diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/DraconianTroops.java b/src/main/java/com/l2jserver/datapack/gracia/ai/DraconianTroops.java new file mode 100644 index 0000000000..07aba7f3d7 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/DraconianTroops.java @@ -0,0 +1,84 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package com.l2jserver.datapack.gracia.ai; + +import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * Draconian Troops on death random mob spawn AI + * @author Lomka + */ +public class DraconianTroops extends AbstractNpcAI { + // Mobs in SoD have a chance to spawn DRACONIAN_SHADOW_WIFE upon death + private static final int DRACONIAN_SHADOW_WIFE = 22545; + private final static int[] MOB_LIST = { + 18783, + 18784, + 18785, + 18786, + 18787, + 18788, + 18789, + 18790, + 18791, + 22536, + 22537, + 22538, + 22539, + 22540, + 22541, + 22542, + 22543, + 22544, + 22546, + 22547, + 22548, + 22569, + 22570, + 22571, + 22572, + 22573, + 22574, + 22575, + 22576, + 22577, + 22578, + 22579, + 22580, + 22581, + }; + + public DraconianTroops() { + super(DraconianTroops.class.getSimpleName(), "gracia/AI"); + addKillId(MOB_LIST); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + if (getRandom(10000) < 300) { + L2Attackable spawn = (L2Attackable) addSpawn(DRACONIAN_SHADOW_WIFE, npc.getLocation(), false, 0, false, killer.getInstanceId()); + addAttackDesire(spawn, killer, 10000); + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/EnergySeeds.java b/src/main/java/com/l2jserver/datapack/gracia/ai/EnergySeeds.java index 11ba5747c3..7183c62b84 100644 --- a/src/main/java/com/l2jserver/datapack/gracia/ai/EnergySeeds.java +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/EnergySeeds.java @@ -19,14 +19,22 @@ package com.l2jserver.datapack.gracia.ai; import static com.l2jserver.gameserver.config.Configuration.rates; +import static com.l2jserver.gameserver.config.Configuration.server; +import java.io.File; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.logging.Level; + +import javax.xml.parsers.DocumentBuilderFactory; import com.l2jserver.datapack.ai.npc.AbstractNpcAI; import com.l2jserver.datapack.quests.Q00692_HowtoOpposeEvil.Q00692_HowtoOpposeEvil; +import com.l2jserver.gameserver.GeoData; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.ai.CtrlIntention; import com.l2jserver.gameserver.data.xml.impl.DoorData; @@ -35,6 +43,7 @@ import com.l2jserver.gameserver.enums.audio.Sound; import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; import com.l2jserver.gameserver.instancemanager.ZoneManager; import com.l2jserver.gameserver.model.L2Object; +import com.l2jserver.gameserver.model.L2Territory; import com.l2jserver.gameserver.model.Location; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.L2Npc; @@ -48,17 +57,21 @@ import com.l2jserver.gameserver.model.zone.L2ZoneType; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ActionFailed; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; + /** * Energy Seeds AI. - * @author Gigiikun + * @author Gigiikun, Lomka */ public class EnergySeeds extends AbstractNpcAI { private static final int HOWTOOPPOSEEVIL_CHANCE = 60; private static final int RATE = 1; - private static final int RESPAWN = 480000; - private static final int RANDOM_RESPAWN_OFFSET = 180000; - private static final Map<Integer, ESSpawn> SPAWNS = new HashMap<>(); + private static final List<L2Npc> SOD_TELEPORTER_SPAWNS = new ArrayList<>(); + private static final Map<Integer, ESSpawn> SEED_SPAWNS = new HashMap<>(); protected static final Map<L2Npc, Integer> _spawnedNpcs = new ConcurrentHashMap<>(); + private final Map<Integer, L2Territory> _spawnZoneList = new HashMap<>(); private static final int TEMPORARY_TELEPORTER = 32602; // @formatter:off @@ -99,16 +112,15 @@ public class EnergySeeds extends AbstractNpcAI { super(EnergySeeds.class.getSimpleName(), "gracia/AI"); registerMobs(SEED_IDS); addFirstTalkId(SEED_IDS); - addFirstTalkId(TEMPORARY_TELEPORTER); addEnterZoneId(SOD_ZONE); - addSpawnsToList(); + loadSpawns(); startAI(); } protected boolean isSeedActive(GraciaSeeds seed) { switch (seed) { case INFINITY: - return false; + return false; // TODO: Do checks here, when Seed of Infinity is implemented. case DESTRUCTION: return GraciaSeedsManager.getInstance().getSoDState() == 2; case ANNIHILATION_BISTAKON: @@ -119,6 +131,144 @@ public class EnergySeeds extends AbstractNpcAI { return true; } + private void loadSpawns() { + try { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setIgnoringComments(true); + + File file = new File(server().getDatapackRoot(), "/data/spawnZones/gracia_energy_seeds.xml"); + if (!file.exists()) { + _log.severe("[Energy Seeds] Missing energy_seeds.xml. The spawns wont work without it!"); + return; + } + int npcCounter = 1; + Document doc = factory.newDocumentBuilder().parse(file); + Node first = doc.getFirstChild(); + if ((first != null) && "list".equalsIgnoreCase(first.getNodeName())) { + for (Node n = first.getFirstChild(); n != null; n = n.getNextSibling()) { + if ("npc".equalsIgnoreCase(n.getNodeName())) { + for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) { + if ("spawn".equalsIgnoreCase(d.getNodeName())) { + NamedNodeMap attrs = d.getAttributes(); + Node att = attrs.getNamedItem("npcId"); + if (att == null) { + _log.severe("[Energy Seeds] Missing npcId in npc List, skipping"); + continue; + } + int npcId = Integer.parseInt(attrs.getNamedItem("npcId").getNodeValue()); + + att = attrs.getNamedItem("flag"); + if (att == null) { + _log.severe("[Energy Seeds] Missing flag in npc List npcId: " + npcId + ", skipping"); + continue; + } + int flag = Integer.parseInt(attrs.getNamedItem("flag").getNodeValue()); + + att = attrs.getNamedItem("respawnDelay"); + if (att == null) { + _log.severe("[Energy Seeds] Missing respawnDelay in npc List npcId: " + npcId + ", skipping"); + continue; + } + int respawnDelay = Integer.parseInt(attrs.getNamedItem("respawnDelay").getNodeValue()); + + att = attrs.getNamedItem("respawnRandom"); + int respawnRandom = att != null ? Integer.parseInt(attrs.getNamedItem("respawnRandom").getNodeValue()) : 0; + + for (Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling()) { + if ("zone".equalsIgnoreCase(cd.getNodeName())) { + attrs = cd.getAttributes(); + Node zoneIdAtt = attrs.getNamedItem("id"); + Node countAtt = attrs.getNamedItem("count"); + if (zoneIdAtt != null && countAtt != null) { + int zoneId = Integer.parseInt(zoneIdAtt.getNodeValue()); + int count = Integer.parseInt(countAtt.getNodeValue()); + if (count > 0) { + GraciaSeeds seedType = null; + switch (flag) { + case 1: + seedType = GraciaSeeds.DESTRUCTION; + break; + case 2: + seedType = GraciaSeeds.INFINITY; + break; + case 3: + seedType = GraciaSeeds.ANNIHILATION_BISTAKON; + break; + case 4: + seedType = GraciaSeeds.ANNIHILATION_REPTILIKON; + break; + case 5: + seedType = GraciaSeeds.ANNIHILATION_COKRAKON; + break; + } + for (int i = 0; i < count; i++) { + ESSpawn spw = new ESSpawn(npcCounter, seedType, zoneId, npcId, respawnDelay, respawnRandom); + SEED_SPAWNS.put(npcCounter, spw); + npcCounter++; + } + } + } + } + } + } + } + } else if ("spawnZones".equalsIgnoreCase(n.getNodeName())) { + for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) { + if ("zone".equalsIgnoreCase(d.getNodeName())) { + NamedNodeMap attrs = d.getAttributes(); + Node att = attrs.getNamedItem("id"); + if (att == null) { + _log.severe("[Energy Seeds] Missing id in spawnZones List, skipping"); + continue; + } + int id = Integer.parseInt(att.getNodeValue()); + att = attrs.getNamedItem("minZ"); + if (att == null) { + _log.severe("[Energy Seeds] Missing minZ in spawnZones List id: " + id + ", skipping"); + continue; + } + int minz = Integer.parseInt(att.getNodeValue()); + att = attrs.getNamedItem("maxZ"); + if (att == null) { + _log.severe("[Energy Seeds] Missing maxZ in spawnZones List id: " + id + ", skipping"); + continue; + } + int maxz = Integer.parseInt(att.getNodeValue()); + L2Territory ter = new L2Territory(id); + + for (Node cd = d.getFirstChild(); cd != null; cd = cd.getNextSibling()) { + if ("point".equalsIgnoreCase(cd.getNodeName())) { + attrs = cd.getAttributes(); + int x, y; + att = attrs.getNamedItem("x"); + if (att != null) { + x = Integer.parseInt(att.getNodeValue()); + } else { + continue; + } + att = attrs.getNamedItem("y"); + if (att != null) { + y = Integer.parseInt(att.getNodeValue()); + } else { + continue; + } + + ter.add(x, y, minz, maxz, 0); + } + } + + _spawnZoneList.put(id, ter); + } + } + } + } + } + } catch (Exception e) { + _log.log(Level.WARNING, "[Energy Seeds] Could not parse data.xml file: " + e.getMessage(), e); + } + } + @Override public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, List<L2Object> targets, boolean isSummon) { if (!targets.contains(npc) || (skill.getId() != 5780)) { @@ -127,9 +277,9 @@ public class EnergySeeds extends AbstractNpcAI { npc.deleteMe(); - if (_spawnedNpcs.containsKey(npc) && SPAWNS.containsKey(_spawnedNpcs.get(npc))) { - ESSpawn spawn = SPAWNS.get(_spawnedNpcs.get(npc)); - spawn.scheduleRespawn(RESPAWN + getRandom(RANDOM_RESPAWN_OFFSET)); + if (_spawnedNpcs.containsKey(npc) && SEED_SPAWNS.containsKey(_spawnedNpcs.get(npc))) { + ESSpawn spawn = SEED_SPAWNS.get(_spawnedNpcs.get(npc)); + spawn.scheduleRespawn(false); _spawnedNpcs.remove(npc); if (isSeedActive(spawn._seedId)) { int itemId = 0; @@ -159,9 +309,11 @@ public class EnergySeeds extends AbstractNpcAI { if (getRandom(100) < 33) { caster.sendPacket(SystemMessageId.THE_COLLECTION_HAS_SUCCEEDED); caster.addItem("EnergySeed", itemId, getRandom(RATE + 1, 2 * RATE), null, true); - } else { + } else if (((skill.getLevel() == 1) && (getRandom(100) < 15)) || ((skill.getLevel() == 2) && (getRandom(100) < 50)) || ((skill.getLevel() == 3) && (getRandom(100) < 75))) { caster.sendPacket(SystemMessageId.THE_COLLECTION_HAS_SUCCEEDED); caster.addItem("EnergySeed", itemId, getRandom(1, RATE), null, true); + } else { + caster.sendPacket(SystemMessageId.THE_COLLECTION_HAS_FAILED); } seedCollectEvent(caster, npc, spawn._seedId); } @@ -179,6 +331,7 @@ public class EnergySeeds extends AbstractNpcAI { doorInstance.openMe(); } } + stopAI(GraciaSeeds.DESTRUCTION); startAI(GraciaSeeds.DESTRUCTION); } else if (event.equalsIgnoreCase("StopSoDAi")) { for (int doorId : SEED_OF_DESTRUCTION_DOORS) { @@ -193,6 +346,14 @@ public class EnergySeeds extends AbstractNpcAI { } } stopAI(GraciaSeeds.DESTRUCTION); + } else if (event.equalsIgnoreCase("SoDDefenceStarted")) { + for (int doorId : SEED_OF_DESTRUCTION_DOORS) { + L2DoorInstance doorInstance = DoorData.getInstance().getDoor(doorId); + if (doorInstance != null) { + doorInstance.openMe(); + } + } + stopAI(GraciaSeeds.DESTRUCTION); } else if (event.equalsIgnoreCase("DeSpawnTask")) { if (npc.isInCombat()) { startQuestTimer("DeSpawnTask", 30000, npc, null); @@ -205,17 +366,14 @@ public class EnergySeeds extends AbstractNpcAI { @Override public String onFirstTalk(L2Npc npc, L2PcInstance player) { - if (npc.getId() == TEMPORARY_TELEPORTER) { - player.teleToLocation(SOD_EXIT_POINT); - } player.sendPacket(ActionFailed.STATIC_PACKET); return null; } @Override public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon) { - if (_spawnedNpcs.containsKey(npc) && SPAWNS.containsKey(_spawnedNpcs.get(npc))) { - SPAWNS.get(_spawnedNpcs.get(npc)).scheduleRespawn(RESPAWN + getRandom(RANDOM_RESPAWN_OFFSET)); + if (_spawnedNpcs.containsKey(npc) && SEED_SPAWNS.containsKey(_spawnedNpcs.get(npc))) { + SEED_SPAWNS.get(_spawnedNpcs.get(npc)).scheduleRespawn(false); _spawnedNpcs.remove(npc); } return super.onKill(npc, player, isSummon); @@ -240,29 +398,50 @@ public class EnergySeeds extends AbstractNpcAI { } public void startAI() { + // open doors if the seed is open + handleSoDDoors(); + // spawn teleporteds in Seed of Destruction + spawnSoDTeleporters(); // spawn all NPCs - for (ESSpawn spawn : SPAWNS.values()) { + for (ESSpawn spawn : SEED_SPAWNS.values()) { if (isSeedActive(spawn._seedId)) { - spawn.scheduleRespawn(0); + spawn.scheduleRespawn(true); } } } public void startAI(GraciaSeeds type) { + if (type == GraciaSeeds.DESTRUCTION) { + // open doors if the seed is open + handleSoDDoors(); + // spawn teleporteds in Seed of Destruction + spawnSoDTeleporters(); + } // spawn all NPCs - for (ESSpawn spawn : SPAWNS.values()) { + for (ESSpawn spawn : SEED_SPAWNS.values()) { if (spawn._seedId == type) { - spawn.scheduleRespawn(0); + spawn.scheduleRespawn(true); } } } public void stopAI(GraciaSeeds type) { + if (type == GraciaSeeds.DESTRUCTION && SOD_TELEPORTER_SPAWNS.size() > 0) { + for (L2Npc teleporter : SOD_TELEPORTER_SPAWNS) { + teleporter.deleteMe(); + } + SOD_TELEPORTER_SPAWNS.clear(); + } for (L2Npc seed : _spawnedNpcs.keySet()) { - if (type == SPAWNS.get(_spawnedNpcs.get(seed))._seedId) { + if (type == SEED_SPAWNS.get(_spawnedNpcs.get(seed))._seedId) { seed.deleteMe(); } } + for (ESSpawn spawn : SEED_SPAWNS.values()) { + if (spawn._seedId == type) { + spawn.cancelRespawnSchedule(); + } + } } public void seedCollectEvent(L2PcInstance player, L2Npc seedEnergy, GraciaSeeds seedType) { @@ -342,365 +521,78 @@ public class EnergySeeds extends AbstractNpcAI { } } - private void addSpawnsToList() { - // Seed of Destruction - // Temporary Teleporters - //@formatter:off - SPAWNS.put(1, new ESSpawn(1, GraciaSeeds.DESTRUCTION, new Location(-245790,220320,-12104), new int[]{TEMPORARY_TELEPORTER})); - SPAWNS.put(2, new ESSpawn(2, GraciaSeeds.DESTRUCTION, new Location(-249770,207300,-11952), new int[]{TEMPORARY_TELEPORTER})); - //Energy Seeds - SPAWNS.put(3, new ESSpawn(3, GraciaSeeds.DESTRUCTION, new Location(-248360,219272,-12448), new int[]{18678,18679,18680})); - SPAWNS.put(4, new ESSpawn(4, GraciaSeeds.DESTRUCTION, new Location(-249448,219256,-12448), new int[]{18678,18679,18680})); - SPAWNS.put(5, new ESSpawn(5, GraciaSeeds.DESTRUCTION, new Location(-249432,220872,-12448), new int[]{18678,18679,18680})); - SPAWNS.put(6, new ESSpawn(6, GraciaSeeds.DESTRUCTION, new Location(-248360,220888,-12448), new int[]{18678,18679,18680})); - - SPAWNS.put(7, new ESSpawn(7, GraciaSeeds.DESTRUCTION, new Location(-250088,219256,-12448), new int[]{18681,18682})); - SPAWNS.put(8, new ESSpawn(8, GraciaSeeds.DESTRUCTION, new Location(-250600,219272,-12448), new int[]{18681,18682})); - SPAWNS.put(9, new ESSpawn(9, GraciaSeeds.DESTRUCTION, new Location(-250584,220904,-12448), new int[]{18681,18682})); - SPAWNS.put(10, new ESSpawn(10, GraciaSeeds.DESTRUCTION, new Location(-250072,220888,-12448), new int[]{18681,18682})); - - SPAWNS.put(11, new ESSpawn(11, GraciaSeeds.DESTRUCTION, new Location(-253096,217704,-12296), new int[]{18683,18678})); - SPAWNS.put(12, new ESSpawn(12, GraciaSeeds.DESTRUCTION, new Location(-253112,217048,-12288), new int[]{18683,18678})); - SPAWNS.put(13, new ESSpawn(13, GraciaSeeds.DESTRUCTION, new Location(-251448,217032,-12288), new int[]{18683,18678})); - SPAWNS.put(14, new ESSpawn(14, GraciaSeeds.DESTRUCTION, new Location(-251416,217672,-12296), new int[]{18683,18678})); - - SPAWNS.put(15, new ESSpawn(15, GraciaSeeds.DESTRUCTION, new Location(-251416,217672,-12296), new int[]{18679,18680})); - SPAWNS.put(16, new ESSpawn(16, GraciaSeeds.DESTRUCTION, new Location(-251416,217016,-12280), new int[]{18679,18680})); - SPAWNS.put(17, new ESSpawn(17, GraciaSeeds.DESTRUCTION, new Location(-249752,217016,-12280), new int[]{18679,18680})); - SPAWNS.put(18, new ESSpawn(18, GraciaSeeds.DESTRUCTION, new Location(-249736,217688,-12296), new int[]{18679,18680})); - - SPAWNS.put(19, new ESSpawn(19, GraciaSeeds.DESTRUCTION, new Location(-252472,215208,-12120), new int[]{18681,18682})); - SPAWNS.put(20, new ESSpawn(20, GraciaSeeds.DESTRUCTION, new Location(-252552,216760,-12248), new int[]{18681,18682})); - SPAWNS.put(21, new ESSpawn(21, GraciaSeeds.DESTRUCTION, new Location(-253160,216744,-12248), new int[]{18681,18682})); - SPAWNS.put(22, new ESSpawn(22, GraciaSeeds.DESTRUCTION, new Location(-253128,215160,-12096), new int[]{18681,18682})); - - SPAWNS.put(23, new ESSpawn(23, GraciaSeeds.DESTRUCTION, new Location(-250392,215208,-12120), new int[]{18683,18678})); - SPAWNS.put(24, new ESSpawn(24, GraciaSeeds.DESTRUCTION, new Location(-250264,216744,-12248), new int[]{18683,18678})); - SPAWNS.put(25, new ESSpawn(25, GraciaSeeds.DESTRUCTION, new Location(-249720,216744,-12248), new int[]{18683,18678})); - SPAWNS.put(26, new ESSpawn(26, GraciaSeeds.DESTRUCTION, new Location(-249752,215128,-12096), new int[]{18683,18678})); - - SPAWNS.put(27, new ESSpawn(27, GraciaSeeds.DESTRUCTION, new Location(-250280,216760,-12248), new int[]{18679,18680,18681})); - SPAWNS.put(28, new ESSpawn(28, GraciaSeeds.DESTRUCTION, new Location(-250344,216152,-12248), new int[]{18679,18680,18681})); - SPAWNS.put(29, new ESSpawn(29, GraciaSeeds.DESTRUCTION, new Location(-252504,216152,-12248), new int[]{18679,18680,18681})); - SPAWNS.put(30, new ESSpawn(30, GraciaSeeds.DESTRUCTION, new Location(-252520,216792,-12248), new int[]{18679,18680,18681})); - - SPAWNS.put(31, new ESSpawn(31, GraciaSeeds.DESTRUCTION, new Location(-242520,217272,-12384), new int[]{18681,18682,18683})); - SPAWNS.put(32, new ESSpawn(32, GraciaSeeds.DESTRUCTION, new Location(-241432,217288,-12384), new int[]{18681,18682,18683})); - SPAWNS.put(33, new ESSpawn(33, GraciaSeeds.DESTRUCTION, new Location(-241432,218936,-12384), new int[]{18681,18682,18683})); - SPAWNS.put(34, new ESSpawn(34, GraciaSeeds.DESTRUCTION, new Location(-242536,218936,-12384), new int[]{18681,18682,18683})); - - SPAWNS.put(35, new ESSpawn(35, GraciaSeeds.DESTRUCTION, new Location(-240808,217272,-12384), new int[]{18678,18679})); - SPAWNS.put(36, new ESSpawn(36, GraciaSeeds.DESTRUCTION, new Location(-240280,217272,-12384), new int[]{18678,18679})); - SPAWNS.put(37, new ESSpawn(37, GraciaSeeds.DESTRUCTION, new Location(-240280,218952,-12384), new int[]{18678,18679})); - SPAWNS.put(38, new ESSpawn(38, GraciaSeeds.DESTRUCTION, new Location(-240792,218936,-12384), new int[]{18678,18679})); - - SPAWNS.put(39, new ESSpawn(39, GraciaSeeds.DESTRUCTION, new Location(-239576,217240,-12640), new int[]{18680,18681,18682})); - SPAWNS.put(40, new ESSpawn(40, GraciaSeeds.DESTRUCTION, new Location(-239560,216168,-12640), new int[]{18680,18681,18682})); - SPAWNS.put(41, new ESSpawn(41, GraciaSeeds.DESTRUCTION, new Location(-237896,216152,-12640), new int[]{18680,18681,18682})); - SPAWNS.put(42, new ESSpawn(42, GraciaSeeds.DESTRUCTION, new Location(-237912,217256,-12640), new int[]{18680,18681,18682})); - - SPAWNS.put(43, new ESSpawn(43, GraciaSeeds.DESTRUCTION, new Location(-237896,215528,-12640), new int[]{18683,18678})); - SPAWNS.put(44, new ESSpawn(44, GraciaSeeds.DESTRUCTION, new Location(-239560,215528,-12640), new int[]{18683,18678})); - SPAWNS.put(45, new ESSpawn(45, GraciaSeeds.DESTRUCTION, new Location(-239560,214984,-12640), new int[]{18683,18678})); - SPAWNS.put(46, new ESSpawn(46, GraciaSeeds.DESTRUCTION, new Location(-237896,215000,-12640), new int[]{18683,18678})); - - SPAWNS.put(47, new ESSpawn(47, GraciaSeeds.DESTRUCTION, new Location(-237896,213640,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(48, new ESSpawn(48, GraciaSeeds.DESTRUCTION, new Location(-239560,213640,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(49, new ESSpawn(49, GraciaSeeds.DESTRUCTION, new Location(-239544,212552,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(50, new ESSpawn(50, GraciaSeeds.DESTRUCTION, new Location(-237912,212552,-12768), new int[]{18678,18679,18680})); - - SPAWNS.put(51, new ESSpawn(51, GraciaSeeds.DESTRUCTION, new Location(-237912,211912,-12768), new int[]{18681,18682})); - SPAWNS.put(52, new ESSpawn(52, GraciaSeeds.DESTRUCTION, new Location(-237912,211400,-12768), new int[]{18681,18682})); - SPAWNS.put(53, new ESSpawn(53, GraciaSeeds.DESTRUCTION, new Location(-239560,211400,-12768), new int[]{18681,18682})); - SPAWNS.put(54, new ESSpawn(54, GraciaSeeds.DESTRUCTION, new Location(-239560,211912,-12768), new int[]{18681,18682})); - - SPAWNS.put(55, new ESSpawn(55, GraciaSeeds.DESTRUCTION, new Location(-241960,214536,-12512), new int[]{18683,18678,18679})); - SPAWNS.put(56, new ESSpawn(56, GraciaSeeds.DESTRUCTION, new Location(-241976,213448,-12512), new int[]{18683,18678,18679})); - SPAWNS.put(57, new ESSpawn(57, GraciaSeeds.DESTRUCTION, new Location(-243624,213448,-12512), new int[]{18683,18678,18679})); - SPAWNS.put(58, new ESSpawn(58, GraciaSeeds.DESTRUCTION, new Location(-243624,214520,-12512), new int[]{18683,18678,18679})); - - SPAWNS.put(59, new ESSpawn(59, GraciaSeeds.DESTRUCTION, new Location(-241976,212808,-12504), new int[]{18680,18681})); - SPAWNS.put(60, new ESSpawn(60, GraciaSeeds.DESTRUCTION, new Location(-241960,212280,-12504), new int[]{18680,18681})); - SPAWNS.put(61, new ESSpawn(61, GraciaSeeds.DESTRUCTION, new Location(-243624,212264,-12504), new int[]{18680,18681})); - SPAWNS.put(62, new ESSpawn(62, GraciaSeeds.DESTRUCTION, new Location(-243624,212792,-12504), new int[]{18680,18681})); - - SPAWNS.put(63, new ESSpawn(63, GraciaSeeds.DESTRUCTION, new Location(-243640,210920,-12640), new int[]{18682,18683,18678})); - SPAWNS.put(64, new ESSpawn(64, GraciaSeeds.DESTRUCTION, new Location(-243624,209832,-12640), new int[]{18682,18683,18678})); - SPAWNS.put(65, new ESSpawn(65, GraciaSeeds.DESTRUCTION, new Location(-241976,209832,-12640), new int[]{18682,18683,18678})); - SPAWNS.put(66, new ESSpawn(66, GraciaSeeds.DESTRUCTION, new Location(-241976,210920,-12640), new int[]{18682,18683,18678})); - - SPAWNS.put(67, new ESSpawn(67, GraciaSeeds.DESTRUCTION, new Location(-241976,209192,-12640), new int[]{18679,18680})); - SPAWNS.put(68, new ESSpawn(68, GraciaSeeds.DESTRUCTION, new Location(-241976,208664,-12640), new int[]{18679,18680})); - SPAWNS.put(69, new ESSpawn(69, GraciaSeeds.DESTRUCTION, new Location(-243624,208664,-12640), new int[]{18679,18680})); - SPAWNS.put(70, new ESSpawn(70, GraciaSeeds.DESTRUCTION, new Location(-243624,209192,-12640), new int[]{18679,18680})); - - SPAWNS.put(71, new ESSpawn(71, GraciaSeeds.DESTRUCTION, new Location(-241256,208664,-12896), new int[]{18681,18682,18683})); - SPAWNS.put(72, new ESSpawn(72, GraciaSeeds.DESTRUCTION, new Location(-240168,208648,-12896), new int[]{18681,18682,18683})); - SPAWNS.put(73, new ESSpawn(73, GraciaSeeds.DESTRUCTION, new Location(-240168,207000,-12896), new int[]{18681,18682,18683})); - SPAWNS.put(74, new ESSpawn(74, GraciaSeeds.DESTRUCTION, new Location(-241256,207000,-12896), new int[]{18681,18682,18683})); - - SPAWNS.put(75, new ESSpawn(75, GraciaSeeds.DESTRUCTION, new Location(-239528,208648,-12896), new int[]{18678,18679})); - SPAWNS.put(76, new ESSpawn(76, GraciaSeeds.DESTRUCTION, new Location(-238984,208664,-12896), new int[]{18678,18679})); - SPAWNS.put(77, new ESSpawn(77, GraciaSeeds.DESTRUCTION, new Location(-239000,207000,-12896), new int[]{18678,18679})); - SPAWNS.put(78, new ESSpawn(78, GraciaSeeds.DESTRUCTION, new Location(-239512,207000,-12896), new int[]{18678,18679})); - - SPAWNS.put(79, new ESSpawn(79, GraciaSeeds.DESTRUCTION, new Location(-245064,213144,-12384), new int[]{18680,18681,18682})); - SPAWNS.put(80, new ESSpawn(80, GraciaSeeds.DESTRUCTION, new Location(-245064,212072,-12384), new int[]{18680,18681,18682})); - SPAWNS.put(81, new ESSpawn(81, GraciaSeeds.DESTRUCTION, new Location(-246696,212072,-12384), new int[]{18680,18681,18682})); - SPAWNS.put(82, new ESSpawn(82, GraciaSeeds.DESTRUCTION, new Location(-246696,213160,-12384), new int[]{18680,18681,18682})); - - SPAWNS.put(83, new ESSpawn(83, GraciaSeeds.DESTRUCTION, new Location(-245064,211416,-12384), new int[]{18683,18678})); - SPAWNS.put(84, new ESSpawn(84, GraciaSeeds.DESTRUCTION, new Location(-245048,210904,-12384), new int[]{18683,18678})); - SPAWNS.put(85, new ESSpawn(85, GraciaSeeds.DESTRUCTION, new Location(-246712,210888,-12384), new int[]{18683,18678})); - SPAWNS.put(86, new ESSpawn(86, GraciaSeeds.DESTRUCTION, new Location(-246712,211416,-12384), new int[]{18683,18678})); - - SPAWNS.put(87, new ESSpawn(87, GraciaSeeds.DESTRUCTION, new Location(-245048,209544,-12512), new int[]{18679,18680,18681})); - SPAWNS.put(88, new ESSpawn(88, GraciaSeeds.DESTRUCTION, new Location(-245064,208456,-12512), new int[]{18679,18680,18681})); - SPAWNS.put(89, new ESSpawn(89, GraciaSeeds.DESTRUCTION, new Location(-246696,208456,-12512), new int[]{18679,18680,18681})); - SPAWNS.put(90, new ESSpawn(90, GraciaSeeds.DESTRUCTION, new Location(-246712,209544,-12512), new int[]{18679,18680,18681})); - - SPAWNS.put(91, new ESSpawn(91, GraciaSeeds.DESTRUCTION, new Location(-245048,207816,-12512), new int[]{18682,18683})); - SPAWNS.put(92, new ESSpawn(92, GraciaSeeds.DESTRUCTION, new Location(-245048,207288,-12512), new int[]{18682,18683})); - SPAWNS.put(93, new ESSpawn(93, GraciaSeeds.DESTRUCTION, new Location(-246696,207304,-12512), new int[]{18682,18683})); - SPAWNS.put(94, new ESSpawn(94, GraciaSeeds.DESTRUCTION, new Location(-246712,207816,-12512), new int[]{18682,18683})); - - SPAWNS.put(95, new ESSpawn(95, GraciaSeeds.DESTRUCTION, new Location(-244328,207272,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(96, new ESSpawn(96, GraciaSeeds.DESTRUCTION, new Location(-243256,207256,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(97, new ESSpawn(97, GraciaSeeds.DESTRUCTION, new Location(-243256,205624,-12768), new int[]{18678,18679,18680})); - SPAWNS.put(98, new ESSpawn(98, GraciaSeeds.DESTRUCTION, new Location(-244328,205608,-12768), new int[]{18678,18679,18680})); - - SPAWNS.put(99, new ESSpawn(99, GraciaSeeds.DESTRUCTION, new Location(-242616,207272,-12768), new int[]{18681,18682})); - SPAWNS.put(100, new ESSpawn(100, GraciaSeeds.DESTRUCTION, new Location(-242104,207272,-12768), new int[]{18681,18682})); - SPAWNS.put(101, new ESSpawn(101, GraciaSeeds.DESTRUCTION, new Location(-242088,205624,-12768), new int[]{18681,18682})); - SPAWNS.put(102, new ESSpawn(102, GraciaSeeds.DESTRUCTION, new Location(-242600,205608,-12768), new int[]{18681,18682})); - - // Seed of Annihilation - SPAWNS.put(103, new ESSpawn(103, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184519,183007,-10456), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(104, new ESSpawn(104, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184873,181445,-10488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(105, new ESSpawn(105, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184009,180962,-10488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(106, new ESSpawn(106, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-185321,181641,-10448), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(107, new ESSpawn(107, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184035,182775,-10512), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(108, new ESSpawn(108, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-185433,181935,-10424), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(109, new ESSpawn(109, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183309,183007,-10560), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(110, new ESSpawn(110, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184929,181886,-10488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(111, new ESSpawn(111, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184009,180392,-10424), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(112, new ESSpawn(112, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183793,183239,-10488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(113, new ESSpawn(113, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184245,180848,-10464), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(114, new ESSpawn(114, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-182704,183761,-10528), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(115, new ESSpawn(115, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184705,181886,-10504), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(116, new ESSpawn(116, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184304,181076,-10488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(117, new ESSpawn(117, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183596,180430,-10424), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(118, new ESSpawn(118, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184422,181038,-10480), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(119, new ESSpawn(119, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184929,181543,-10496), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(120, new ESSpawn(120, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184398,182891,-10472), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(121, new ESSpawn(121, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-177606,182848,-10584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(122, new ESSpawn(122, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178104,183224,-10560), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(123, new ESSpawn(123, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-177274,182284,-10600), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(124, new ESSpawn(124, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-177772,183224,-10560), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(125, new ESSpawn(125, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-181532,180364,-10504), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(126, new ESSpawn(126, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-181802,180276,-10496), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(127, new ESSpawn(127, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178429,180444,-10512), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(128, new ESSpawn(128, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-177606,182190,-10600), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(129, new ESSpawn(129, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-177357,181908,-10576), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(130, new ESSpawn(130, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178747,179534,-10408), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(131, new ESSpawn(131, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178429,179534,-10392), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(132, new ESSpawn(132, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178853,180094,-10472), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(133, new ESSpawn(133, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-181937,179660,-10416), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(134, new ESSpawn(134, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-180992,179572,-10416), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(135, new ESSpawn(135, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-185552,179252,-10368), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(136, new ESSpawn(136, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184572,178913,-10400), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(137, new ESSpawn(137, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184768,178348,-10312), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(138, new ESSpawn(138, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-184572,178574,-10352), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(139, new ESSpawn(139, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-185062,178913,-10384), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(140, new ESSpawn(140, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-181397,179484,-10416), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(141, new ESSpawn(141, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-181667,179044,-10408), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(142, new ESSpawn(142, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-185258,177896,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(143, new ESSpawn(143, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183506,176570,-10280), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(144, new ESSpawn(144, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183719,176804,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(145, new ESSpawn(145, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183648,177116,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(146, new ESSpawn(146, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183932,176492,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(147, new ESSpawn(147, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183861,176570,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(148, new ESSpawn(148, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-183790,175946,-10240), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(149, new ESSpawn(149, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178641,179604,-10416), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(150, new ESSpawn(150, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-178959,179814,-10432), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(151, new ESSpawn(151, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-176367,178456,-10376), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(152, new ESSpawn(152, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-175845,177172,-10264), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(153, new ESSpawn(153, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-175323,177600,-10248), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(154, new ESSpawn(154, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-174975,177172,-10216), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(155, new ESSpawn(155, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-176019,178242,-10352), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(156, new ESSpawn(156, GraciaSeeds.ANNIHILATION_BISTAKON, new Location(-174801,178456,-10264), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - - SPAWNS.put(157, new ESSpawn(157, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185648,183384,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(158, new ESSpawn(158, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-186740,180908,-15528), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(159, new ESSpawn(159, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185297,184658,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(160, new ESSpawn(160, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185697,181601,-15488), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(161, new ESSpawn(161, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-186684,182744,-15536), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(162, new ESSpawn(162, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184908,183384,-15616), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(163, new ESSpawn(163, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184994,185572,-15784), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(164, new ESSpawn(164, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185796,182616,-15608), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(165, new ESSpawn(165, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184970,184385,-15648), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(166, new ESSpawn(166, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185995,180809,-15512), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(167, new ESSpawn(167, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185352,182872,-15632), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(168, new ESSpawn(168, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185624,184294,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(169, new ESSpawn(169, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184486,185774,-15816), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(170, new ESSpawn(170, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-186496,184112,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(171, new ESSpawn(171, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184232,185976,-15816), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(172, new ESSpawn(172, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184994,185673,-15792), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(173, new ESSpawn(173, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185733,184203,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(174, new ESSpawn(174, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185079,184294,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(175, new ESSpawn(175, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184803,180710,-15528), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(176, new ESSpawn(176, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-186293,180413,-15528), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(177, new ESSpawn(177, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185352,182936,-15632), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(178, new ESSpawn(178, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184356,180611,-15496), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(179, new ESSpawn(179, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185375,186784,-15816), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(180, new ESSpawn(180, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184867,186784,-15816), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(181, new ESSpawn(181, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180553,180454,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(182, new ESSpawn(182, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180422,180454,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(183, new ESSpawn(183, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-181863,181138,-15120), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(184, new ESSpawn(184, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-181732,180454,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(185, new ESSpawn(185, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180684,180397,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(186, new ESSpawn(186, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-182256,180682,-15112), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(187, new ESSpawn(187, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185492,179492,-15392), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(188, new ESSpawn(188, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185894,178538,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(189, new ESSpawn(189, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-186028,178856,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(190, new ESSpawn(190, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185224,179068,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(191, new ESSpawn(191, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185492,178538,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(192, new ESSpawn(192, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185894,178538,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(193, new ESSpawn(193, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180619,178855,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(194, new ESSpawn(194, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180255,177892,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(195, new ESSpawn(195, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-185804,176472,-15336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(196, new ESSpawn(196, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184580,176370,-15320), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(197, new ESSpawn(197, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184308,176166,-15320), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(198, new ESSpawn(198, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-183764,177186,-15304), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(199, new ESSpawn(199, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180801,177571,-15144), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(200, new ESSpawn(200, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184716,176064,-15320), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(201, new ESSpawn(201, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-184444,175452,-15296), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(202, new ESSpawn(202, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180164,177464,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(203, new ESSpawn(203, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-180164,178213,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(204, new ESSpawn(204, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-179982,178320,-15152), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(205, new ESSpawn(205, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-176925,177757,-15824), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(206, new ESSpawn(206, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-176164,179282,-15720), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(207, new ESSpawn(207, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175692,177613,-15800), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(208, new ESSpawn(208, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175418,178117,-15824), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(209, new ESSpawn(209, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-176103,177829,-15824), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(210, new ESSpawn(210, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175966,177325,-15792), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(211, new ESSpawn(211, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174778,179732,-15664), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(212, new ESSpawn(212, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175692,178261,-15824), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(213, new ESSpawn(213, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-176038,179192,-15736), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(214, new ESSpawn(214, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175660,179462,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(215, new ESSpawn(215, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175912,179732,-15664), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(216, new ESSpawn(216, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175156,180182,-15680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(217, new ESSpawn(217, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174240,182059,-15664), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(218, new ESSpawn(218, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-175590,181478,-15640), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(219, new ESSpawn(219, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174510,181561,-15616), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(220, new ESSpawn(220, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174240,182391,-15688), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(221, new ESSpawn(221, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174105,182806,-15672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(222, new ESSpawn(222, GraciaSeeds.ANNIHILATION_REPTILIKON, new Location(-174645,182806,-15712), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - - SPAWNS.put(223, new ESSpawn(223, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-214962,182403,-10992), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(224, new ESSpawn(224, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-215019,182493,-11000), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(225, new ESSpawn(225, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-211374,180793,-11672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(226, new ESSpawn(226, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-211198,180661,-11680), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(227, new ESSpawn(227, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-213097,178936,-12720), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(228, new ESSpawn(228, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-213517,178936,-12712), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(229, new ESSpawn(229, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-214105,179191,-12720), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(230, new ESSpawn(230, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-213769,179446,-12720), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(231, new ESSpawn(231, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-214021,179344,-12720), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(232, new ESSpawn(232, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-210582,180595,-11672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(233, new ESSpawn(233, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-210934,180661,-11696), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(234, new ESSpawn(234, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207058,178460,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(235, new ESSpawn(235, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207454,179151,-11368), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(236, new ESSpawn(236, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207422,181365,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(237, new ESSpawn(237, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207358,180627,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(238, new ESSpawn(238, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207230,180996,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(239, new ESSpawn(239, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-208515,184160,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(240, new ESSpawn(240, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207613,184000,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(241, new ESSpawn(241, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-208597,183760,-11352), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(242, new ESSpawn(242, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206710,176142,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(243, new ESSpawn(243, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206361,178136,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(244, new ESSpawn(244, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206178,178630,-12672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(245, new ESSpawn(245, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-205738,178715,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(246, new ESSpawn(246, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206442,178205,-12648), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(247, new ESSpawn(247, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206585,178874,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(248, new ESSpawn(248, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206073,179366,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(249, new ESSpawn(249, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206009,178628,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(250, new ESSpawn(250, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206155,181301,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(251, new ESSpawn(251, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206595,181641,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(252, new ESSpawn(252, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206507,181641,-12656), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(253, new ESSpawn(253, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206507,181471,-12640), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(254, new ESSpawn(254, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206974,175972,-12672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(255, new ESSpawn(255, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206304,175130,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(256, new ESSpawn(256, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206886,175802,-12672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(257, new ESSpawn(257, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207238,175972,-12672), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(258, new ESSpawn(258, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206386,174857,-11328), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(259, new ESSpawn(259, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-206386,175039,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(260, new ESSpawn(260, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-205976,174584,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(261, new ESSpawn(261, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-207367,184320,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(262, new ESSpawn(262, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219002,180419,-12608), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(263, new ESSpawn(263, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218853,182790,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(264, new ESSpawn(264, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218853,183343,-12600), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(265, new ESSpawn(265, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218358,186247,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(266, new ESSpawn(266, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218358,186083,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(267, new ESSpawn(267, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-217574,185796,-11352), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(268, new ESSpawn(268, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219178,181051,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(269, new ESSpawn(269, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-220171,180313,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(270, new ESSpawn(270, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219293,183738,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(271, new ESSpawn(271, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219381,182553,-12584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(272, new ESSpawn(272, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219600,183024,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(273, new ESSpawn(273, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219940,182680,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(274, new ESSpawn(274, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219260,183884,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(275, new ESSpawn(275, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219855,183540,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(276, new ESSpawn(276, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218946,186575,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(277, new ESSpawn(277, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219882,180103,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(278, new ESSpawn(278, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219266,179787,-12584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(279, new ESSpawn(279, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219201,178337,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(280, new ESSpawn(280, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219716,179875,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(281, new ESSpawn(281, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219716,180021,-11328), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(282, new ESSpawn(282, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219989,179437,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(283, new ESSpawn(283, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219078,178298,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(284, new ESSpawn(284, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218684,178954,-11328), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(285, new ESSpawn(285, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219089,178456,-11328), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(286, new ESSpawn(286, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-220266,177623,-12608), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(287, new ESSpawn(287, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219201,178025,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(288, new ESSpawn(288, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219142,177044,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(289, new ESSpawn(289, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219690,177895,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(290, new ESSpawn(290, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219754,177623,-12584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(291, new ESSpawn(291, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218791,177830,-12584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(292, new ESSpawn(292, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218904,176219,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(293, new ESSpawn(293, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218768,176384,-12584), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(294, new ESSpawn(294, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218774,177626,-11320), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(295, new ESSpawn(295, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218774,177792,-11328), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(296, new ESSpawn(296, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219880,175901,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(297, new ESSpawn(297, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219210,176054,-12592), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(298, new ESSpawn(298, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219850,175991,-12608), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(299, new ESSpawn(299, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-219079,175021,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(300, new ESSpawn(300, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218812,174229,-11344), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - SPAWNS.put(301, new ESSpawn(301, GraciaSeeds.ANNIHILATION_COKRAKON, new Location(-218723,174669,-11336), new int[]{ 18678, 18679, 18680, 18681, 18682, 18683 })); - //@formatter:on + private void handleSoDDoors() { + if (isSeedActive(GraciaSeeds.DESTRUCTION)) { + for (int doorId : SEED_OF_DESTRUCTION_DOORS) { + L2DoorInstance doorInstance = DoorData.getInstance().getDoor(doorId); + if (doorInstance != null) { + doorInstance.openMe(); + } + } + } + } + + private void spawnSoDTeleporters() { + // Seed of Destruction - Temporary Teleporters + SOD_TELEPORTER_SPAWNS.add(addSpawn(TEMPORARY_TELEPORTER, new Location(-245790, 220320, -12104), false, 0)); + SOD_TELEPORTER_SPAWNS.add(addSpawn(TEMPORARY_TELEPORTER, new Location(-249770, 207300, -11952), false, 0)); } private class ESSpawn { protected final int _spawnId; protected final GraciaSeeds _seedId; - protected final int[] _npcIds; - protected final Location _loc; + protected final int _npcId; + protected final int _zoneId; + protected final int _respawn; + protected final int _respawnRandom; + protected ScheduledFuture<?> _respawnScheduleTask = null; - public ESSpawn(int spawnId, GraciaSeeds seedId, Location loc, int[] npcIds) { + public ESSpawn(int spawnId, GraciaSeeds seedId, int zoneId, int npcId, int respawn, int respawnRandom) { _spawnId = spawnId; _seedId = seedId; - _loc = loc; - _npcIds = npcIds; + _zoneId = zoneId; + _npcId = npcId; + _respawn = respawn; + _respawnRandom = respawnRandom; } - public void scheduleRespawn(long waitTime) { - ThreadPoolManager.getInstance().scheduleGeneral(() -> { + public void scheduleRespawn(boolean instantSpawn) { + int waitTime = instantSpawn ? 0 : (_respawn + Math.max(-_respawn, getRandom(-_respawnRandom, _respawnRandom))) * 60 * 1000; + _respawnScheduleTask = ThreadPoolManager.getInstance().scheduleGeneral(() -> { // if the AI is inactive, do not spawn the NPC if (isSeedActive(_seedId)) { - // get a random NPC that should spawn at this location + // get a random NPC and random location within zone Integer spawnId = _spawnId; // the map uses "Integer", not "int" - _spawnedNpcs.put(addSpawn(_npcIds[getRandom(_npcIds.length)], _loc, false, 0), spawnId); + Location randomLocation = null; + boolean didFindSpawn = false; + while (!didFindSpawn) { + Location tempRandomLocation = _spawnZoneList.get(_zoneId).getRandomPoint(); + tempRandomLocation.setZ(GeoData.getInstance().getSpawnHeight(tempRandomLocation)); + int locX = tempRandomLocation.getX(); + int locY = tempRandomLocation.getY(); + int locZ = tempRandomLocation.getZ(); + if (GeoData.getInstance().canMove(locX, locY, locZ, locX - 245, locY - 245, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX + 245, locY + 245, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX - 245, locY + 245, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX + 245, locY - 245, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX - 350, locY, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX, locY - 350, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX + 350, locY, locZ, 0)// + || GeoData.getInstance().canMove(locX, locY, locZ, locX, locY + 350, locZ, 0)// + ) { + didFindSpawn = true; + randomLocation = tempRandomLocation; + } + } + _spawnedNpcs.put(addSpawn(_npcId, randomLocation, false, 0), spawnId); } }, waitTime); } + + public void cancelRespawnSchedule() { + if (_respawnScheduleTask != null && !_respawnScheduleTask.isDone() && !_respawnScheduleTask.isCancelled()) { + _respawnScheduleTask.cancel(true); + } + } } } \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/SeedOfDestruction/Defence.java b/src/main/java/com/l2jserver/datapack/gracia/ai/SeedOfDestruction/Defence.java new file mode 100644 index 0000000000..2dc1697c8e --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/SeedOfDestruction/Defence.java @@ -0,0 +1,632 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.ai.SeedOfDestruction; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.ThreadPoolManager; +import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.datatables.SpawnTable; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; +import com.l2jserver.gameserver.instancemanager.QuestManager; +import com.l2jserver.gameserver.instancemanager.WalkingManager; +import com.l2jserver.gameserver.instancemanager.ZoneManager; +import com.l2jserver.gameserver.model.L2Spawn; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.events.EventType; +import com.l2jserver.gameserver.model.holders.SkillHolder; +import com.l2jserver.gameserver.model.skills.Skill; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.clientpackets.Say2; +import com.l2jserver.gameserver.network.serverpackets.NpcSay; +import com.l2jserver.gameserver.util.Util; + +/** + * Gracia - Seed of Destruction Defence Stage + * @author Lomka + */ +public class Defence extends AbstractNpcAI { + // Defence Invasion Cycles + // 1 - Regular + // 2 - Surprise + // 3 - Surprise Final + + // Script values (Tiat, Mobs) + // 0 - moving to throne, 1 - finished moving to throne + private List<L2Npc> spawnList = new ArrayList<>(); + private Map<String, L2Npc> spawnerPortalListFortress = new HashMap<>(); + private Map<String, L2Npc> spawnerPortalListThrone = new HashMap<>(); + private Set<L2MonsterInstance> portalMobSpawnList = ConcurrentHashMap.newKeySet(); + private L2MonsterInstance tiatRet = null; + private L2Npc leftDevice = null; + private L2Npc rightDevice = null; + private int cycle = -1; + + public static String ENERGY_SEEDS = "EnergySeeds"; + + private static final int MAX_NPC = 100; + private static final int MAX_NPC_FINAL = 300; + private static final int REGULAR_BATTLE_TIME = 2800 * 1000; // ~ 47 minutes + private static final int FINAL_BATTLE_TIME = 86400 * 1000; // 24 hours + private static final int SPAWNER_PORTAL = 18702; + private static final int PROTECTOR_CRYSTAL = 18775; + private static final int TELEPORT_DEVICE = 32602; + private static final int TIAT_RETURN = 29175; + private static final int TIAT_FIGHTER = 29162; + private static final int ALLENOS = 32526; + private static final int TIAT_WEAPON = 13842; + + private static final Skill TIAT_TRANSFORM_SKILL = new SkillHolder(5974, 4).getSkill(); + private static final Skill TIAT_THUNDER_STORM_SKILL = new SkillHolder(5844, 4).getSkill(); + + private static final String INV_ROUTE_LEFT = "invasion_left"; + private static final String INV_ROUTE_CENTER = "invasion_center"; + private static final String INV_ROUTE_RIGHT = "invasion_right"; + private static final String INV_ROUTE_LEFT_SURPRISE = "invasion_left_surprise"; + private static final String INV_ROUTE_CENTER_SURPRISE = "invasion_center_surprise"; + private static final String INV_ROUTE_RIGHT_SURPRISE = "invasion_right_surprise"; + + private static final int[] POSSIBLE_MOB_FROM_PORTAL_LIST = { + 22569, + 22570, + 22571, + 22572, + 22573, + 22574, + 22575, + 22576, + 22577, + 22578, + 22579, + 22581, + }; + // Spawner portals + private static final Map<String, Location> SPAWNER_PORTAL_SPAWNS_FORTRESS = new HashMap<>(); + { + SPAWNER_PORTAL_SPAWNS_FORTRESS.put(INV_ROUTE_LEFT, new Location(-252944, 218224, -12320, 0)); + SPAWNER_PORTAL_SPAWNS_FORTRESS.put(INV_ROUTE_CENTER, new Location(-251439, 218093, -12363, 0)); + SPAWNER_PORTAL_SPAWNS_FORTRESS.put(INV_ROUTE_RIGHT, new Location(-249936, 218224, -12320, 0)); + } + private static final Map<String, Location> SPAWNER_PORTAL_SPAWNS_THRONE = new HashMap<>(); + { + SPAWNER_PORTAL_SPAWNS_THRONE.put(INV_ROUTE_LEFT_SURPRISE, new Location(-251736, 210131, -11995, 0)); + SPAWNER_PORTAL_SPAWNS_THRONE.put(INV_ROUTE_CENTER_SURPRISE, new Location(-250402, 210131, -11952, 0)); + SPAWNER_PORTAL_SPAWNS_THRONE.put(INV_ROUTE_RIGHT_SURPRISE, new Location(-249012, 210131, -11995, 0)); + } + private static final Location PROTECTOR_CRYSTAL_SPAWN_LEFT = new Location(-252022, 206875, -11995, 0); + private static final Location PROTECTOR_CRYSTAL_SPAWN_RIGHT = new Location(-248782, 206875, -11995, 0); + // Used in every cycle + private static final Location TELEPORT_DEVICE_SPAWN_THRONE = new Location(-249977, 207047, -11968, 0); + // --------------------- + // Used only in cycle 1 + private static final Location TELEPORT_DEVICE_SPAWN_FORTRESS = new Location(-251489, 216737, -12248, 0); + // ---------------------- + private static final Location TIAT_RETURN_SPAWN = new Location(-251439, 218093, -12363, 0); + private static final Location TIAT_RETURN_FINAL_POINT = new Location(-250401, 207591, -11952, 16384); + private static final Location SOD_EXIT_POINT = new Location(-248717, 250260, 4337); + private static final int SOD_ZONE = 60009; + + public Defence() { + super(Defence.class.getSimpleName(), "gracia/AI"); + addKillId(TIAT_RETURN, SPAWNER_PORTAL); + addAttackId(TIAT_RETURN); + addRouteFinishedId(TIAT_RETURN); + addRouteFinishedId(POSSIBLE_MOB_FROM_PORTAL_LIST); + addAggroRangeEnterId(TIAT_RETURN, TIAT_FIGHTER); + addAggroRangeEnterId(POSSIBLE_MOB_FROM_PORTAL_LIST); + startQuestTimer("start", 5000, null, null); + } + + protected void setCycle(int cycleId) { + if (cycleId > 0 && cycleId <= 3) { + cycle = cycleId; + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + if (event != "start" && event != "check_for_fail" && event != "defence_successful" // + && ((leftDevice != null && rightDevice != null && leftDevice.isDead() && rightDevice.isDead()) // + || (tiatRet != null && cycle == 1 && tiatRet.isDead()))) { + return ""; + } + switch (event) { + case "start": { + final int currentSoDState = GraciaSeedsManager.getInstance().getSoDState(); + if (currentSoDState == 3) { + initCycle(2); + } else if (currentSoDState == 4) { + initCycle(3); + } else if (currentSoDState == 5) { + initCycle(1); + } + break; + } + case "stop": { + setCycle(-1); + cancelQuestTimer("defence_successful", null, null); + cleanUpTimers(); + cleanUpSpawns(); + break; + } + case "tiat_transform": { + tiatRet.setIsImmobilized(false); + tiatRet.disableCoreAI(false); + final Skill tiatTransformSkill = TIAT_TRANSFORM_SKILL; + tiatRet.doCast(tiatTransformSkill); + break; + } + case "tiat_cast_thunder_storm": { + if (tiatRet.getCurrentMp() > TIAT_THUNDER_STORM_SKILL.getMpConsume2() // Enough MP + && tiatRet.getCurrentHp() > TIAT_THUNDER_STORM_SKILL.getHpConsume() // Enough HP + && npc.getSkillRemainingReuseTime(TIAT_THUNDER_STORM_SKILL.getReuseHashCode()) <= 0) // Skill not on cd + { + final int msgRnd = getRandom(3); + for (L2PcInstance ch : ZoneManager.getInstance().getZoneById(SOD_ZONE).getPlayersInside()) { + if (ch != null) { + if (msgRnd == 0) { + showOnScreenMsg(ch, NpcStringId.POOR_CREATURES_FEEL_THE_POWER_OF_DARKNESS, 2, 5000); + } else if (msgRnd == 1) { + showOnScreenMsg(ch, NpcStringId.WHOAAAAAA, 2, 5000); + } else { + showOnScreenMsg(ch, NpcStringId.YOULL_REGRET_CHALLENGING_ME, 2, 5000); + } + } + } + tiatRet.doCast(TIAT_THUNDER_STORM_SKILL); + } + break; + } + case "walk_tiat_to_throne": { + WalkingManager.getInstance().startMoving(tiatRet, INV_ROUTE_CENTER); + startQuestTimer("check_walk_tiat_to_throne", 3000, tiatRet, null); + break; + } + case "check_walk_tiat_to_throne": { + if (tiatRet.getScriptValue() == 0) { + final CtrlIntention tiatIntention = tiatRet.getAI().getIntention(); + if (tiatIntention == CtrlIntention.AI_INTENTION_ACTIVE || tiatIntention == CtrlIntention.AI_INTENTION_IDLE) { + WalkingManager.getInstance().resumeMoving(tiatRet); + } + startQuestTimer("check_walk_tiat_to_throne", 3000, tiatRet, null); + } + break; + } + case "tiat_move_to_throne_point_desire": { + final CtrlIntention tiatIntention = tiatRet.getAI().getIntention(); + if (tiatIntention == CtrlIntention.AI_INTENTION_ACTIVE || tiatIntention == CtrlIntention.AI_INTENTION_IDLE) { + addMoveToDesire(tiatRet, TIAT_RETURN_FINAL_POINT, 0); + } + startQuestTimer("tiat_move_to_throne_point_desire", 10000, tiatRet, null); + break; + } + case "continue_route": { + Iterator<L2MonsterInstance> it = portalMobSpawnList.iterator(); + while (it.hasNext()) { + L2MonsterInstance mob = it.next(); + if (mob != null && mob.getScriptValue() == 0) { + final CtrlIntention mobIntention = mob.getAI().getIntention(); + boolean shouldContinue = false; + if (mobIntention == CtrlIntention.AI_INTENTION_ACTIVE || mobIntention == CtrlIntention.AI_INTENTION_IDLE) { + shouldContinue = true; + } else if (mob.getMostHated() != null && !Util.checkIfInRange(mob.getAggroRange(), mob.getMostHated(), mob, false)) { + shouldContinue = true; + } + if (shouldContinue) { + mob.clearAggroList(); + WalkingManager.getInstance().resumeMoving(mob); + } + } + } + startQuestTimer("continue_route", 4000, null, null); + break; + } + case "do_spawn_cycle": { + spawnInvasion(cycle); + startQuestTimer("do_spawn_cycle", 10000, null, null); + break; + } + case "start_moving_mob": { + String mobRoute = npc.getVariables().getString("route_name"); + if (mobRoute != null) { + WalkingManager.getInstance().startMoving(npc, mobRoute); + } + break; + } + case "crystal_aggro_left": { + if (leftDevice.isDead()) { + break; + } + doCrystalAggro(leftDevice, rightDevice); + startQuestTimer("crystal_aggro_left", 2500 + (leftDevice.getScriptValue() != 1 ? -500 : 500), leftDevice, null); + if (leftDevice.getScriptValue() != 1) { + leftDevice.setScriptValue(1); + } else { + leftDevice.setScriptValue(0); + } + break; + } + case "crystal_aggro_right": { + if (rightDevice.isDead()) { + break; + } + doCrystalAggro(rightDevice, leftDevice); + startQuestTimer("crystal_aggro_right", 2500 + (rightDevice.getScriptValue() != 1 ? 500 : -500), null, null); + if (rightDevice.getScriptValue() != 1) { + rightDevice.setScriptValue(1); + } else { + rightDevice.setScriptValue(0); + } + break; + } + case "check_for_fail": { + if (leftDevice.isDead() && rightDevice.isDead()) { + defenceFailed(); + } else { + startQuestTimer("check_for_fail", 2000, null, null); + } + break; + } + case "defence_successful": { + defenceSuccessful(); + break; + } + } + return ""; + + } + + @Override + public void onRouteFinished(L2Npc npc) { + if (npc == tiatRet) { + WalkingManager.getInstance().cancelMoving(npc); + addMoveFinishedId(TIAT_RETURN); + tiatRet.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, TIAT_RETURN_FINAL_POINT); + cancelQuestTimer("check_walk_tiat_to_throne", npc, null); + startQuestTimer("tiat_move_to_throne_point_desire", 10000, tiatRet, null); + tiatRet.setScriptValue(1); + } else { + WalkingManager.getInstance().stopMoving(npc, true, true); + } + } + + @Override + public void onMoveFinished(L2Npc npc) { + if (npc == tiatRet) { + tiatRet.removeListenerIf(EventType.ON_NPC_MOVE_FINISHED, listener -> listener.getOwner() == this); + } + } + + @Override + public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon) { + npc.setRunning(); + addAttackDesire(npc, player); + return super.onAggroRangeEnter(npc, player, isSummon); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + if (npc == tiatRet) { + cancelQuestTimer("defence_successful", null, null); + startQuestTimer("defence_successful", 2000, null, null); + } else if (npc.getId() == SPAWNER_PORTAL) { + int killedPortals = 0; + if (cycle == 1) { + if (!spawnerPortalListFortress.isEmpty()) { + for (Map.Entry<String, L2Npc> entry : spawnerPortalListFortress.entrySet()) { + if (entry.getValue().isDead()) { + killedPortals += 1; + } + } + } + } else { + if (!spawnerPortalListThrone.isEmpty()) { + for (Map.Entry<String, L2Npc> entry : spawnerPortalListThrone.entrySet()) { + if (entry.getValue().isDead()) { + killedPortals += 1; + } + } + } + } + if (killedPortals > 2) { + cancelQuestTimer("defence_successful", null, null); + startQuestTimer("defence_successful", 2000, null, null); + } + } + return super.onKill(npc, killer, isSummon); + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon) { + if (npc == tiatRet) { + if (getQuestTimer("tiat_cast_thunder_storm", npc, null) == null) { + startQuestTimer("tiat_cast_thunder_storm", (getRandom(60) + 60) * 1000, npc, null); + } + } + return super.onAttack(npc, attacker, damage, isSummon); + } + + public void initCycle(int cycleToStart) { + //////////////////////////////////////////////////////////////////////////////// + // Get cycle duration. + // Has low chance of skipping 3rd state and jumping straight to 4th state. + // cycle 1 (stage 5) = 60 min defence duration. + // cycle 2 (stage 3) = random 10, 20 or 30 min defence duration. + // cycle 3 (stage 4) = 30 min defence duration. + //////////////////////////////////////////////////////////////////////////////// + setCycle(cycleToStart); + int timeToDefend = 60 * 60 * 1000; + if (cycle == 2) { + int randNum = getRandom(100); + if (randNum < 20) { + timeToDefend = 10 * 60 * 1000; + } else if (randNum < 70) { + timeToDefend = 20 * 60 * 1000; + } else { + randNum = getRandom(100); + if (randNum < 80) { + timeToDefend = 30 * 60 * 1000; + } else { + GraciaSeedsManager.getInstance().setSoDState(4, false, false); + return; + } + } + } else if (cycle == 3) { + timeToDefend = 30 * 60 * 1000; + } + //////////////////////////////////////////////// + // Cancel existing timers & clear spawns from other stages + cleanUpTimers(); + cleanUpSpawns(); + //////////////////////////////////////////////// + QuestManager.getInstance().getQuest(ENERGY_SEEDS).notifyEvent("SoDDefenceStarted", null, null); + if (cycle == 1) { + // Spawn Tiat and shout + tiatRet = (L2MonsterInstance) addSpawn(TIAT_RETURN, TIAT_RETURN_SPAWN, false, 0, false); + tiatRet.setRHandId(TIAT_WEAPON); + for (int i = 0; i < 4; i++) { + addMinion(tiatRet, TIAT_FIGHTER); + } + shoutMessageInSoD(tiatRet, NpcStringId.OH_FOLLOWERS_OF_THE_DRAGON_OF_DARKNESS_FIGHT_BY_MY_SIDE); + tiatRet.setScriptValue(0); + tiatRet.disableCoreAI(true); + tiatRet.setIsImmobilized(true); + spawnList.add(tiatRet); + // Spawn portals in forttess + SPAWNER_PORTAL_SPAWNS_FORTRESS.entrySet().forEach(entry -> { + final L2Attackable spawn = (L2Attackable) addSpawn(SPAWNER_PORTAL, entry.getValue(), false, 0, true); + spawn.disableCoreAI(true); + spawn.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + spawn.setIsImmobilized(true); + spawnerPortalListFortress.put(entry.getKey(), spawn); + }); + // Spawn teleporter in fortress + final L2Npc tpFort = addSpawn(TELEPORT_DEVICE, TELEPORT_DEVICE_SPAWN_FORTRESS, false, 0, false); + spawnList.add(tpFort); + } else { + // Spawn portals in throne + SPAWNER_PORTAL_SPAWNS_THRONE.entrySet().forEach(entry -> { + final L2Attackable spawn = (L2Attackable) addSpawn(SPAWNER_PORTAL, entry.getValue(), false, 0, true); + spawn.disableCoreAI(true); + spawn.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + spawn.setIsImmobilized(true); + spawnerPortalListThrone.put(entry.getKey(), spawn); + }); + } + // Spawn teleporter in throne (all stages) + final L2Npc tpThrone = addSpawn(TELEPORT_DEVICE, TELEPORT_DEVICE_SPAWN_THRONE, false, 0, false); + spawnList.add(tpThrone); + // Left device spawn + leftDevice = addSpawn(PROTECTOR_CRYSTAL, PROTECTOR_CRYSTAL_SPAWN_LEFT, false, 0, false); + leftDevice.disableCoreAI(true); + leftDevice.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + leftDevice.setIsImmobilized(true); + leftDevice.setTalking(false); + leftDevice.setScriptValue(0); + shoutMessageInSoD(leftDevice, NpcStringId.THE_DRAGON_RACE_ARE_INVADING_PREPARE_FOR_BATTLE); + spawnList.add(leftDevice); + // Right device spawn + rightDevice = addSpawn(PROTECTOR_CRYSTAL, PROTECTOR_CRYSTAL_SPAWN_RIGHT, false, 0, false); + rightDevice.disableCoreAI(true); + rightDevice.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); + rightDevice.setIsImmobilized(true); + rightDevice.setTalking(false); + rightDevice.setScriptValue(0); + shoutMessageInSoD(rightDevice, NpcStringId.THE_DRAGON_RACE_ARE_INVADING_PREPARE_FOR_BATTLE); + spawnList.add(rightDevice); + // Statrt Quest Timers + if (cycle == 1) { + startQuestTimer("tiat_transform", 1000, tiatRet, null); + startQuestTimer("walk_tiat_to_throne", 6000, tiatRet, null); + } + startQuestTimer("do_spawn_cycle", 10000, null, null); + startQuestTimer("continue_route", 15000, null, null); + startQuestTimer("crystal_aggro_left", 15000, null, null); + startQuestTimer("crystal_aggro_right", 15000, null, null); + startQuestTimer("check_for_fail", 2000, null, null); + // After certain time (timeToDefend), if crystals are still alive, defence is successful. + startQuestTimer("defence_successful", timeToDefend, null, null); + } + + public void spawnInvasion(int cycle) { + Map<String, Location> currentPortalSpawns = cycle == 1 ? SPAWNER_PORTAL_SPAWNS_FORTRESS : SPAWNER_PORTAL_SPAWNS_THRONE; + Map<String, L2Npc> currentPortals = cycle == 1 ? spawnerPortalListFortress : spawnerPortalListThrone; + if (((cycle == 1 || cycle == 2) && portalMobSpawnList.size() > MAX_NPC) || (cycle == 3 && portalMobSpawnList.size() > MAX_NPC_FINAL)) { + return; + } + currentPortalSpawns.entrySet().forEach(entry -> { + final String walkingRoute = entry.getKey(); + final Location spawnLocaction = entry.getValue(); + // Check if the portal is dead or not (mobs should not spawn when the portal is dead). + if (currentPortals.get(walkingRoute).isDead()) { + return; + } + // Spawn random monster from 12 available monsters. + int randNpcId = POSSIBLE_MOB_FROM_PORTAL_LIST[getRandom(12)]; + final L2MonsterInstance spawn = (L2MonsterInstance) addSpawn(randNpcId, spawnLocaction, false, 0, false); + spawn.setCanReturnToSpawnPoint(false); + spawn.setScriptValue(0); + spawn.getVariables().set("route_name", walkingRoute); + portalMobSpawnList.add(spawn); + // Make mob walk on a specific route 2 seconds after spawning. + startQuestTimer("start_moving_mob", 2000, spawn, null); + }); + + } + + private void doCrystalAggro(L2Npc currentDevice, L2Npc oppositeDevice) { + final Location currentDeviceSpawnLocation = new Location(currentDevice.getX(), currentDevice.getY() + 125, currentDevice.getZ()); + Iterator<L2MonsterInstance> it = portalMobSpawnList.iterator(); + while (it.hasNext()) { + L2MonsterInstance mob = it.next(); + if (Util.checkIfInRange(oppositeDevice.isDead() ? 4000 : 2000, mob, currentDevice, true)) { + if (mob.getScriptValue() == 0) { + mob.setScriptValue(1); + if (cycle == 1) { + WalkingManager.getInstance().stopMoving(mob, true, true); + } else { + mob.stopMove(null); + } + } + if (mob.isInsideRadius(currentDeviceSpawnLocation, 800, false, false)) { + { + mob.setRunning(); + mob.setTarget(currentDevice); + mob.addDamageHate(currentDevice, 0, 5000); + mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, currentDevice); + } + } else { + if (mob.getAI().getIntention() != CtrlIntention.AI_INTENTION_ATTACK) { + mob.setIsRunning(true); + mob.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, currentDeviceSpawnLocation); + } + } + } else if (!oppositeDevice.isDead() && !Util.checkIfInRange(2000, mob, oppositeDevice, true)) { + if (mob.getScriptValue() == 1) { + mob.setScriptValue(0); + } + } + } + } + + private void defenceFailed() { + cancelQuestTimer("defence_successful", null, null); + cleanUpSpawns(); + for (L2PcInstance ch : ZoneManager.getInstance().getZoneById(SOD_ZONE).getPlayersInside()) { + if (ch != null) { + ch.teleToLocation(SOD_EXIT_POINT); + } + } + GraciaSeedsManager.getInstance().setSoDState(1, true, true); + } + + private void defenceSuccessful() { + cancelQuestTimer("defence_successful", null, null); + cleanUpTimers(); + cleanUpSpawns(); + GraciaSeedsManager.getInstance().setSoDState(2, true, false); + if ((System.currentTimeMillis() - GraciaSeedsManager.getInstance().getSoDLastStateChangeDate().getTimeInMillis()) < REGULAR_BATTLE_TIME) { + ThreadPoolManager.getInstance().scheduleGeneral(() -> { + initCycle(1); + GraciaSeedsManager.getInstance().setSoDState(5, false, false); + }, 60000); + } else if ((System.currentTimeMillis() - GraciaSeedsManager.getInstance().getSoDLastStateChangeDate().getTimeInMillis()) < FINAL_BATTLE_TIME) { + for (L2Spawn npcs : SpawnTable.getInstance().getSpawns(ALLENOS)) { + broadcastNpcSay(npcs.getLastSpawn(), Say2.NPC_SHOUT, NpcStringId.TIATS_FOLLOWERS_ARE_COMING_TO_RETAKE_THE_SEED_OF_DESTRUCTION_GET_READY_TO_STOP_THE_ENEMIES); + } + ThreadPoolManager.getInstance().scheduleGeneral(() -> { + initCycle(2); + GraciaSeedsManager.getInstance().setSoDState(3, false, false); + }, 3600000); + } else { + ThreadPoolManager.getInstance().scheduleGeneral(() -> { + initCycle(3); + GraciaSeedsManager.getInstance().setSoDState(4, false, false); + }, 1000); + } + } + + public void cleanUpTimers() { + cancelQuestTimers("start_moving_left_fortress"); + cancelQuestTimers("start_moving_right_fortress"); + cancelQuestTimers("start_moving_center_fortress"); + cancelQuestTimers("start_moving_left_throne"); + cancelQuestTimers("start_moving_right_throne"); + cancelQuestTimers("start_moving_center_throne"); + cancelQuestTimers("do_spawn_cycle"); + cancelQuestTimers("check_for_fail"); + cancelQuestTimers("crystal_aggro_right"); + cancelQuestTimers("crystal_aggro_left"); + cancelQuestTimers("tiat_move_to_throne_point_desire"); + cancelQuestTimers("check_walk_tiat_to_throne"); + cancelQuestTimers("tiat_cast_thunder_storm"); + } + + private void cleanUpSpawns() { + Iterator<L2MonsterInstance> it = portalMobSpawnList.iterator(); + while (it.hasNext()) { + L2MonsterInstance spawns = it.next(); + WalkingManager.getInstance().cancelMoving(spawns); + spawns.deleteMe(); + } + for (L2Npc spawns : spawnList) { + if (spawns != null) { + WalkingManager.getInstance().cancelMoving(spawns); + spawns.deleteMe(); + } + } + if (!spawnerPortalListFortress.isEmpty()) { + for (Map.Entry<String, L2Npc> entry : spawnerPortalListFortress.entrySet()) { + entry.getValue().deleteMe(); + } + spawnerPortalListFortress.clear(); + } + if (!spawnerPortalListThrone.isEmpty()) { + for (Map.Entry<String, L2Npc> entry : spawnerPortalListThrone.entrySet()) { + entry.getValue().deleteMe(); + } + spawnerPortalListThrone.clear(); + } + portalMobSpawnList.clear(); + spawnList.clear(); + if (tiatRet != null) { + tiatRet.deleteMe(); + } + } + + // Shouts to everyone who's inside the SoD zone. + private void shoutMessageInSoD(L2Npc npc, NpcStringId stringId) { + for (L2PcInstance ch : ZoneManager.getInstance().getZoneById(SOD_ZONE).getPlayersInside()) { + if (ch != null) { + ch.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_SHOUT, npc.getTemplate().getDisplayId(), stringId)); + } + } + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-01.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-01.html new file mode 100644 index 0000000000..43beb38895 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-01.html @@ -0,0 +1,5 @@ +<html><body>Sergeant Allenos:<br> +The Seed of Destruction is essentially a gigantic fortress. Throughout its corridors are barriers and doors controlled by several devices guarded by Mounted Troop soldiers. To penetrate into the interior, you must attack those devices. Even then, you'll need to force open the doors.<br><br> +When you get inside, you'll see the fortress for yourself. Since this is Tiat's last line of defense, there will be a large number of Mounted Troop soldiers. Defeat them and you'll reach the Throne Room and Tiat herself.<br> +<font color="LEVEL">A word of advice: move as quickly as possible through the fortress. The longer it takes you, the more enemies will appear.</font> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-02.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-02.html new file mode 100644 index 0000000000..dc5d0bea70 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-02.html @@ -0,0 +1,6 @@ +<html><body>Sergeant Allenos:<br> +Hail! Welcome to the Seed of Destruction. We have a report that the Dragon race is preparing an attack, but for now everything is peaceful.<br> +<a action="bypass -h Quest Allenos ENTER_SOD">Enter the Seed of Destruction.</a><br> +<a action="bypass -h Quest Allenos 03">Ask about the Seed of Destruction.</a><br> +<a action="bypass -h npc_%objectId%_Quest">Quest</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-03.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-03.html new file mode 100644 index 0000000000..2a08b2c2c1 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-03.html @@ -0,0 +1,6 @@ +<html><body>Sergeant Allenos:<br> +The Seed of Destruction is currently occupied by Keucereus' clan. Every entrance is open, so there's no restriction in moving through its interior.<br> +Find Officer Edric in Central Square and he'll assign you several missions.<br> +We have also received reports about a mysterious energy emanating from several fissures inside the Seed.<br> +We have also heard that the Dragon race is preparing to attack us. We estimate that the attack will come 12 hours after we occupy the Seed of Destruction. Even if we win that battle, chances are that they will launch surprise attacks from time to time. They certainly know the terrain better than we do! +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-04.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-04.html new file mode 100644 index 0000000000..62ba08e54f --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526-04.html @@ -0,0 +1,5 @@ +<html><body>Sergeant Allenos:<br> +There is a battle raging, so I'm afraid I can't allow you to enter right now. The Mounted Troop controls every entrance, and they would kill you as soon as you came through.<br> +We'll know soon enough whether our clan will continue to occupy this place or whether Tiat will take the Throne again...<br> +<a action="bypass -h npc_%objectId%_Quest">Quest</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526.html new file mode 100644 index 0000000000..26b7d4b079 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/32526.html @@ -0,0 +1,6 @@ +<html><body>Sergeant Allenos:<br> +Shhh! Be quiet! There are Dragonkins not far from the <font color="LEVEL">Secret Airstrip</font>!<br> +<a action="bypass -h npc_%objectId%_Quest Stage1">Enter the Seed of Destruction.</a><br> +<a action="bypass -h Quest Allenos 01">Learn about the Seed of Destruction.</a><br> +<a action="bypass -h npc_%objectId%_Quest">Quest</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/Allenos.java b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/Allenos.java new file mode 100644 index 0000000000..c3f3996b93 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/Allenos/Allenos.java @@ -0,0 +1,77 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.ai.npc.Allenos; + +import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.network.SystemMessageId; + +/** + * Gracia NPC Allenos AI + * @author Lomka + */ +public class Allenos extends AbstractNpcAI { + private static final int ALLENOS = 32526; + private static final Location TELEPORT_LOCATION = new Location(-245800, 220488, -12112); + + public Allenos() { + super(Allenos.class.getSimpleName(), "gracia/AI/NPC"); + addStartNpc(ALLENOS); + addFirstTalkId(ALLENOS); + addTalkId(ALLENOS); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) { + String htmltext = null; + final int seedState = GraciaSeedsManager.getInstance().getSoDState(); + if (seedState == 1) { + return "32526.html"; + } else if (seedState == 2) { + htmltext = "32526-02.html"; + } else if (seedState >= 3) { + htmltext = "32526-04.html"; + } + return htmltext; + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "ENTER_SOD": { + if (player.isFlyingMounted()) { + player.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_SEED_IN_FLYING_TRANSFORM); + break; + } + teleportPlayer(player, TELEPORT_LOCATION, 0, false); + break; + } + case "01": { + return "32526-01.html"; + } + case "03": { + return "32526-03.html"; + } + } + return super.onAdvEvent(event, npc, player); + } +} \ No newline at end of file diff --git a/src/main/resources/data/html/default/32549-2.htm b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-2.html similarity index 93% rename from src/main/resources/data/html/default/32549-2.htm rename to src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-2.html index cf24606c20..86125a2d34 100644 --- a/src/main/resources/data/html/default/32549-2.htm +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-2.html @@ -1,7 +1,7 @@ -<html><body>Dilios:<br> -Currently, the Mounted Troop controls the Seed of Destruction. You must go there and defeat its captain, Tiat.<br> -A command channel consisting of 5 parties should be established in order to attack the Seed. Then entry is possible through Sergeant Allenos, who has been dispatched there.<br> -There is a time limit for attacking the Seed of Destruction, however. If you cannot carry out an assault within 2 hours, you will be expelled. The interior of the Seed is blocked by various obstacles, among them a powerful barrier protected by 3 devices.<br> -Once you have broken through all the barriers and gates, you will reach the <font color="LEVEL">Fortress of Destruction</font>. If you can then defeat Tiat and his minions, victory will be ours!<br> -<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +<html><body>Dilios:<br> +Currently, the Mounted Troop controls the Seed of Destruction. You must go there and defeat its captain,Tiat.<br> +A command channel consisting of 5 parties should be established in order to attack the Seed. Then entry is possible through Sergeant Allenos, who has been dispatched there.<br> +There is a time limit for attacking the Seed of Destruction, however. If you cannot carry out an assault within 2 hours, you will be expelled. The interior of the Seed is blocked by various obstacles, among them a powerful barrier protected by 3 devices.<br> +Once you have broken through all the barriers and gates, you will reach the <font color="LEVEL">Fortress of Destruction</font>. If you can then defeat Tiat and his minions, victory will be ours!<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> </body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-3.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-3.html new file mode 100644 index 0000000000..98b02f1db1 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-3.html @@ -0,0 +1,7 @@ +<html><body>Dilios:<br> +Our Keucereus clan currently controls the Seed of Destruction.<br> +Whoever enters it can freely wander throughout its interior. If you wish to battle some of the enemy remnants, see Officer Edric at the entrance and gather the mysterious energy released from several gaps.<br> +Remember that the Mounted Troop has not completely withdrawn! They may attack at any time. Our scouts will raise the alarm if they see any evidence of one. If that occurs, enter the Seed of Destruction and prepare to defend the Seed.<br> +If you are caught outside, the Mounted Troop will surround the Seed and prevent us from re-entering. If that happens, all we can do is to pray that our comrades inside the Seed will be able to protect it...<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-4.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-4.html new file mode 100644 index 0000000000..44d3d096ff --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-4.html @@ -0,0 +1,5 @@ +<html><body>Dilios:<br> +Fighting in the Seed of Destruction between the adventurers of Keucereus' clan and the Mounted Troop is at its peak. According to our scouts' reports, it is completely surrounded by the Mounted Troop; entry is impossible at the moment.<br> +Perhaps if you wait nearby until the battle ends... But of course nobody knows which side will prevail. <br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> diff --git a/src/main/resources/data/html/default/32549-3.htm b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-5.html similarity index 97% rename from src/main/resources/data/html/default/32549-3.htm rename to src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-5.html index 29718d94e8..0f4dc54293 100644 --- a/src/main/resources/data/html/default/32549-3.htm +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-5.html @@ -1,7 +1,7 @@ -<html><body>Dilos:<br> -Our enemy currently controls the Seed of Infinity. Keucereus' clan cannot enter unless we first attack. We can assault either the Hall of Suffering or the Hall of Erosion.<br> -We must destroy the tumors of death and kill the cursed twin knights, Yehan Klodekus and Yehan Klanikus, in the Hall of Suffering. Be advised that they become stronger the further apart from each other they are.<br> -Destroy the tumors of death in the Hall of Erosion and kill Cohemenes and Argekunte, who share one soul through an infernal contract. They are masters of ancient Gracian magic, but there is a limit to the spells that they can cast at the same time. Keep that in mind when you carry out an assault.<br> -The road that leads to Ekimus will stay open as long as you defeat his followers in the two halls and his influence weakens...<br> -<a action="bypass -h npc_%objectId%_Chat 0">Back</a> -</body></html> \ No newline at end of file +<html><body>Dilos:<br> +Our enemy currently controls the Seed of Infinity. Keucereus' clan cannot enter unless we first attack. We can assault either the Hall of Suffering or the Hall of Erosion.<br> +We must destroy the tumors of death and kill the cursed twin knights, Yehan Klodekus and Yehan Klanikus, in the Hall of Suffering. Be advised that they become stronger the further apart from each other they are.<br> +Destroy the tumors of death in the Hall of Erosion and kill Cohemenes and Argekunte, who share one soul through an infernal contract. They are masters of ancient Gracian magic, but there is a limit to the spells that they can cast at the same time. Keep that in mind when you carry out an assault.<br> +The road that leads to Ekimus will stay open as long as you defeat his followers in the two halls and his influence weakens...<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-6.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-6.html new file mode 100644 index 0000000000..0f26ec1bf8 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-6.html @@ -0,0 +1,5 @@ +<html><body>Dilos:<br> +I still can't believe it but we hold the Hall of Suffering and the Hall of Erosion in the current Seed of Infinity. Hopefully this will last.<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> + \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-7.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-7.html new file mode 100644 index 0000000000..2ae51e6377 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-7.html @@ -0,0 +1,6 @@ +<html><body>Dilos:<br> +Currently we control the Seed of Infinity. <br> +We can enter and extract the seed energy from all areas. I have heard that undead ancient Gracians who have regained their wills sometimes wander about inside of the seed, so it's best to be on guard at all times.<br> +And know that as Ekimus slowly regains his power, the undead will begin to awaken in greater numbers.<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-8.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-8.html new file mode 100644 index 0000000000..331873f0d0 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-8.html @@ -0,0 +1,7 @@ +<html><body>Dilios:<br> +The Seed of Infinity is being attacked! The Hall of Suffering and the Hall of Erosion are both being attacked by the undead! <br> +The Seed of Life is being attacked by the followers of Ekimus. The Seed of Life is a major energy source, so we must protect it! If the tumors are completely revived, our enemies powers will be greatly strengthened, and their attacks against the Seed of Life will become nigh on unstoppable!<br> +Also, you mustn't forget about the twin knights who were born in the Hall of Suffering. The tumors of death that they are trying to revive should be destroyed!<br> +The Heart of Infinity is currently the only place where the seed energy can be extracted. If you're mindful of Ancient Gracia's powers, this place is still safe enough.<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-9.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-9.html new file mode 100644 index 0000000000..7e6e30f2cf --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/32549-9.html @@ -0,0 +1,5 @@ +<html><body>Dilios:<br> +It's a very dangerous situation. The undead are attacking throughout the area.<br> +Soul predators who have been fully fed with souls are supplying soul energy to Ekimus. Unless you can stop it, he will awaken and the Seed of Infinity will fall back into the enemy's possession.<br> +<a action="bypass -h npc_%objectId%_Chat 0">Back</a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/GeneralDilios.java b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/GeneralDilios.java index 27b4e418c0..55cb736f9a 100644 --- a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/GeneralDilios.java +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/GeneralDilios/GeneralDilios.java @@ -23,6 +23,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; @@ -32,7 +33,7 @@ import com.l2jserver.gameserver.network.serverpackets.NpcSay; /** * Dilios AI - * @author JIV, Sephiroth, Apocalipce + * @author JIV, Sephiroth, Apocalipce, Lomka */ public final class GeneralDilios extends AbstractNpcAI { private static final int GENERAL_ID = 32549; @@ -41,25 +42,28 @@ public final class GeneralDilios extends AbstractNpcAI { private L2Npc _general = null; private final Set<L2Spawn> _guards = Collections.newSetFromMap(new ConcurrentHashMap<L2Spawn, Boolean>()); - private static final NpcStringId[] DILIOS_TEXT = { - NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_WERE_GATHERING_BRAVE_ADVENTURERS_TO_ATTACK_TIATS_MOUNTED_TROOP_THATS_ROOTED_IN_THE_SEED_OF_DESTRUCTION, - // NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_SEED_OF_DESTRUCTION_IS_CURRENTLY_SECURED_UNDER_THE_FLAG_OF_THE_KEUCEREUS_ALLIANCE, - // NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_TIATS_MOUNTED_TROOP_IS_CURRENTLY_TRYING_TO_RETAKE_SEED_OF_DESTRUCTION_COMMIT_ALL_THE_AVAILABLE_REINFORCEMENTS_INTO_SEED_OF_DESTRUCTION, - NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_BRAVE_ADVENTURERS_WHO_HAVE_CHALLENGED_THE_SEED_OF_INFINITY_ARE_CURRENTLY_INFILTRATING_THE_HALL_OF_EROSION_THROUGH_THE_DEFENSIVELY_WEAK_HALL_OF_SUFFERING, - // NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_SWEEPING_THE_SEED_OF_INFINITY_IS_CURRENTLY_COMPLETE_TO_THE_HEART_OF_THE_SEED_EKIMUS_IS_BEING_DIRECTLY_ATTACKED_AND_THE_UNDEAD_REMAINING_IN_THE_HALL_OF_SUFFERING_ARE_BEING_ERADICATED, - NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_SEED_OF_INFINITY_IS_CURRENTLY_SECURED_UNDER_THE_FLAG_OF_THE_KEUCEREUS_ALLIANCE - // NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_RESURRECTED_UNDEAD_IN_THE_SEED_OF_INFINITY_ARE_POURING_INTO_THE_HALL_OF_SUFFERING_AND_THE_HALL_OF_EROSION - // NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_EKIMUS_IS_ABOUT_TO_BE_REVIVED_BY_THE_RESURRECTED_UNDEAD_IN_SEED_OF_INFINITY_SEND_ALL_REINFORCEMENTS_TO_THE_HEART_AND_THE_HALL_OF_SUFFERING - }; - public GeneralDilios() { super(GeneralDilios.class.getSimpleName(), "gracia/AI/NPC"); - + addTalkId(GENERAL_ID); addSpawnId(GENERAL_ID, GUARD_ID); } @Override public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + if (event.equalsIgnoreCase("SOD_STATE")) { + switch (GraciaSeedsManager.getInstance().getSoDState()) { + case 1: + return "32549-2.html"; + case 2: + return "32549-3.html"; + default: + return "32549-4.html"; + } + } + if (event.equalsIgnoreCase("SOI_STATE")) { + // TODO: SoI stages not implemented yet + return "32549-5.html"; + } if (event.startsWith("command_")) { int value = Integer.parseInt(event.substring(8)); if (value < 6) { @@ -67,7 +71,7 @@ public final class GeneralDilios extends AbstractNpcAI { startQuestTimer("guard_animation_0", 3400, null, null); } else { value = -1; - _general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_SHOUT, GENERAL_ID, DILIOS_TEXT[getRandom(DILIOS_TEXT.length)])); + _general.broadcastPacket(new NpcSay(_general.getObjectId(), Say2.NPC_SHOUT, GENERAL_ID, getShoutMessage())); } startQuestTimer("command_" + (value + 1), 60000, null, null); } else if (event.startsWith("guard_animation_")) { @@ -82,6 +86,26 @@ public final class GeneralDilios extends AbstractNpcAI { return super.onAdvEvent(event, npc, player); } + private NpcStringId getShoutMessage() { + if (getRandom(2) == 0) { + // TODO: SoI Stages not implemented yet + // NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_SWEEPING_THE_SEED_OF_INFINITY_IS_CURRENTLY_COMPLETE_TO_THE_HEART_OF_THE_SEED_EKIMUS_IS_BEING_DIRECTLY_ATTACKED_AND_THE_UNDEAD_REMAINING_IN_THE_HALL_OF_SUFFERING_ARE_BEING_ERADICATED, + // NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_SEED_OF_INFINITY_IS_CURRENTLY_SECURED_UNDER_THE_FLAG_OF_THE_KEUCEREUS_ALLIANCE + // NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_RESURRECTED_UNDEAD_IN_THE_SEED_OF_INFINITY_ARE_POURING_INTO_THE_HALL_OF_SUFFERING_AND_THE_HALL_OF_EROSION + // NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_EKIMUS_IS_ABOUT_TO_BE_REVIVED_BY_THE_RESURRECTED_UNDEAD_IN_SEED_OF_INFINITY_SEND_ALL_REINFORCEMENTS_TO_THE_HEART_AND_THE_HALL_OF_SUFFERING + return NpcStringId.MESSENGER_INFORM_THE_BROTHERS_IN_KUCEREUS_CLAN_OUTPOST_BRAVE_ADVENTURERS_WHO_HAVE_CHALLENGED_THE_SEED_OF_INFINITY_ARE_CURRENTLY_INFILTRATING_THE_HALL_OF_EROSION_THROUGH_THE_DEFENSIVELY_WEAK_HALL_OF_SUFFERING; + } + switch (GraciaSeedsManager.getInstance().getSoDState()) { + case 1: + return NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_WERE_GATHERING_BRAVE_ADVENTURERS_TO_ATTACK_TIATS_MOUNTED_TROOP_THATS_ROOTED_IN_THE_SEED_OF_DESTRUCTION; + case 2: + return NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_THE_SEED_OF_DESTRUCTION_IS_CURRENTLY_SECURED_UNDER_THE_FLAG_OF_THE_KEUCEREUS_ALLIANCE; + default: + return NpcStringId.MESSENGER_INFORM_THE_PATRONS_OF_THE_KEUCEREUS_ALLIANCE_BASE_TIATS_MOUNTED_TROOP_IS_CURRENTLY_TRYING_TO_RETAKE_SEED_OF_DESTRUCTION_COMMIT_ALL_THE_AVAILABLE_REINFORCEMENTS_INTO_SEED_OF_DESTRUCTION; + } + + } + @Override public String onSpawn(L2Npc npc) { if (npc.getId() == GENERAL_ID) { diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-01.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-01.html new file mode 100644 index 0000000000..456d365da8 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-01.html @@ -0,0 +1,6 @@ +<html><body>Temporary Teleporter:<br> +This is a temporary teleporter installed in Kucereus' outpost at the Seed ofDestruction.<br> +<a action="bypass -h Quest TemporaryTeleporter TP_CENTRAL_SQUARE">Teleport to Central Square.</a><br> +<a action="bypass -h Quest TemporaryTeleporter TP_FORTRESS_OF_DESTRUCTION">Teleport to the Fortress.</a><br> +<a action="bypass -h Quest TemporaryTeleporter TP_CRIMSON_THRONE">Teleport to the Crimson Throne.</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-02.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-02.html new file mode 100644 index 0000000000..f683dcc8ee --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602-02.html @@ -0,0 +1,6 @@ +<html> +<body>Temporary Teleporter:<br> +This is a temporary teleporter for escape during a battle with remnants of the enemy troops. Do you wish to escape?<br> +<a action="bypass -h Quest TemporaryTeleporter EXIT_REMNANTS">Teleport to the Landing Site.</a> +</body> +</html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602.html b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602.html new file mode 100644 index 0000000000..64a158ba1d --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/32602.html @@ -0,0 +1,4 @@ +<html><body>Temporary Teleporter:<br> +This is a temporary teleporter for escape in the event of enemy attacks. Do you wish to escape?<br> +<a action="bypass -h Quest TemporaryTeleporter EXIT_SOD">Teleport to the Landing Point.</a> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/TemporaryTeleporter.java b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/TemporaryTeleporter.java new file mode 100644 index 0000000000..3d454258b9 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/ai/npc/TemporaryTeleporter/TemporaryTeleporter.java @@ -0,0 +1,86 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.ai.npc.TemporaryTeleporter; + +import com.l2jserver.datapack.ai.npc.AbstractNpcAI; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; + +/** + * Gracia Temporary Teleporter AI + * @author Lomka + */ +public class TemporaryTeleporter extends AbstractNpcAI { + private static final int TEMPORARY_TELEPORTER = 32602; + + // Teleport Locations + private static final Location SOD_DOCK = new Location(-248683, 250243, 4336); + private static final Location CENTRAL_SQUARE = new Location(-245833, 220174, -12104); + private static final Location FORTRESS_OF_DESTRUCTION = new Location(-251624, 213420, -12072); + private static final Location CRIMSON_THRONE = new Location(-249774, 207316, -11952); + private static final Location REMNANT_TP_POINT = new Location(-248567, 250117, 4336); + + public TemporaryTeleporter() { + super(TemporaryTeleporter.class.getSimpleName(), "gracia/AI/NPC"); + addStartNpc(TEMPORARY_TELEPORTER); + addFirstTalkId(TEMPORARY_TELEPORTER); + addTalkId(TEMPORARY_TELEPORTER); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) { + final int seedState = GraciaSeedsManager.getInstance().getSoDState(); + if (seedState == 2) { + if (player.getInstanceId() != 0) { + return "32602-02.html"; + } + return "32602-01.html"; + } + return "32602.html"; + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "TP_CENTRAL_SQUARE": { + teleportPlayer(player, CENTRAL_SQUARE, 0, true); + break; + } + case "TP_FORTRESS_OF_DESTRUCTION": { + teleportPlayer(player, FORTRESS_OF_DESTRUCTION, 0, true); + break; + } + case "TP_CRIMSON_THRONE": { + teleportPlayer(player, CRIMSON_THRONE, 0, true); + break; + } + case "EXIT_SOD": { + teleportPlayer(player, SOD_DOCK, 0, true); + break; + } + case "EXIT_REMNANTS": { + teleportPlayer(player, REMNANT_TP_POINT, 0, true); + break; + } + } + return super.onAdvEvent(event, npc, player); + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/32527-entrance.html b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/32527-entrance.html new file mode 100644 index 0000000000..8ffd0d1e9f --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/32527-entrance.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +I hope you and your party work well together. Good luck! +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/ChamblainsMountedTroop.java b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/ChamblainsMountedTroop.java new file mode 100644 index 0000000000..cc27b3d74f --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/ChamblainsMountedTroop.java @@ -0,0 +1,350 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jserver.datapack.instances.AbstractInstance; +import com.l2jserver.datapack.quests.Q00693_DefeatingDragonkinRemnants.Q00693_DefeatingDragonkinRemnants; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.L2Territory; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * Gracia SoD Chamblains Mounted Troop Instance + * @author Lomka + */ +public final class ChamblainsMountedTroop extends AbstractInstance { + protected class ChamblainsMountedTroopWorld extends InstanceWorld { + protected L2Attackable doorMan = null; + protected L2Attackable remnantMachine = null; + protected List<L2Npc> npcList = new ArrayList<>(); + } + + private static final int TEMPLATE_ID = 123; + private static final int EXIT_TIME = 5; + private static final int MAX_PLAYERS = 9; + private static final int MIN_LEVEL = 75; + private static final int EDRIC = 32527; + + private static final int DEFEATED_TROOPS_INFANTRY = 18786; + private static final int DEFEATED_TROOPS_MAGIC_SOLDIER = 18789; + private static final int DOORMAN = DEFEATED_TROOPS_INFANTRY; + + private static final int REMNANT_MACHINE = 18703; + private static final int SEED_CONTROLLER = 32602; + + private static final int[] DOORS = { + 12240001, + 12240002 + }; + + private static Location ENTER_TELEPORT_LOC = new Location(-242754, 219982, -10011); + private static final Location DOORMAN_SPAWN_LOC = new Location(-239504, 219984, -10112, 32767); + private static final Location REMNANT_MACHINE_LOC = new Location(-238320, 219983, -10112, 0); + + private static final L2Territory _hallZone1 = new L2Territory(1); + private static final L2Territory _hallZone2 = new L2Territory(2); + + private static final Map<Integer, Integer> HALL_1_SPAWNS = new HashMap<>(); + { + HALL_1_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 3); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_MAGIC_SOLDIER, 3); + } + + private static final Map<Integer, Integer> HALL_2_SPAWNS = new HashMap<>(); + { + HALL_2_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 3); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_MAGIC_SOLDIER, 2); + } + + private static final int[][] HALL_ZONE_1_COORDINATES = { + { + -240766, + 219168, + -10178, + -9978 + }, + { + -240755, + 220795, + -10178, + -9978 + }, + { + -240667, + 220889, + -10178, + -9978 + }, + { + -239595, + 220886, + -10178, + -9978 + }, + { + -239487, + 220765, + -10178, + -9978 + }, + { + -239490, + 219170, + -10178, + -9978 + }, + { + -239583, + 219059, + -10178, + -9978 + }, + { + -240665, + 219065, + -10178, + -9978 + }, + }; + + private static final int[][] HALL_ZONE_2_COORDINATES = { + { + -238353, + 219165, + -10175, + -9975 + }, + { + -238340, + 220788, + -10175, + -9975 + }, + { + -238431, + 220888, + -10175, + -9975 + }, + { + -238933, + 220890, + -10175, + -9975 + }, + { + -239027, + 220789, + -10175, + -9975 + }, + { + -239034, + 219195, + -10175, + -9975 + }, + { + -238924, + 219067, + -10175, + -9975 + }, + { + -238445, + 219065, + -10175, + -9975 + }, + }; + + public ChamblainsMountedTroop() { + super(ChamblainsMountedTroop.class.getSimpleName(), "gracia/instances"); + addStartNpc(EDRIC); + addTalkId(EDRIC); + addKillId(DOORMAN, REMNANT_MACHINE); + for (int[] coord : HALL_ZONE_1_COORDINATES) { + _hallZone1.add(coord[0], coord[1], coord[2], coord[3], 0); + } + for (int[] coord : HALL_ZONE_2_COORDINATES) { + _hallZone2.add(coord[0], coord[1], coord[2], coord[3], 0); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "DOORMAN_KILLED": { + openDoor(DOORS[0], npc.getInstanceId()); + openDoor(DOORS[1], npc.getInstanceId()); + break; + } + } + return ""; + } + + @Override + protected boolean checkConditions(L2PcInstance player) { + final L2Party party = player.getParty(); + + if (party == null) { + player.sendPacket(SystemMessageId.NOT_IN_PARTY_CANT_ENTER); + return false; + } + + if (party.getLeader() != player) { + player.sendPacket(SystemMessageId.ONLY_PARTY_LEADER_CAN_ENTER); + return false; + } + + if (party.getMemberCount() > MAX_PLAYERS) { + player.sendPacket(SystemMessageId.PARTY_EXCEEDED_THE_LIMIT_CANT_ENTER); + return false; + } + for (L2PcInstance partyMember : party.getMembers()) { + if (partyMember.getLevel() < MIN_LEVEL) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (!Util.checkIfInRange(1000, player, partyMember, true)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (partyMember.isFlyingMounted()) { + partyMember.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_SEED_IN_FLYING_TRANSFORM); + return false; + } + } + return true; + } + + @Override + public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) { + if (firstEntrance) { + final L2Party party = player.getParty(); + ChamblainsMountedTroopWorld _world = (ChamblainsMountedTroopWorld) world; + _world.doorMan = (L2Attackable) addSpawn(DOORMAN, DOORMAN_SPAWN_LOC, false, 0, false, _world.getInstanceId()); + _world.remnantMachine = (L2Attackable) addSpawn(REMNANT_MACHINE, REMNANT_MACHINE_LOC, false, 0, false, _world.getInstanceId()); + _world.doorMan.setIsNoRndWalk(true); + _world.remnantMachine.disableCoreAI(true); + _world.remnantMachine.setIsImmobilized(true); + // Spawn mobs in the 1st hall + HALL_1_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone1.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn mobs in the 2nd hall + HALL_2_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone2.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn temporary teleporter + addSpawn(SEED_CONTROLLER, ENTER_TELEPORT_LOC, false, 0, false, _world.getInstanceId()); + closeDoor(DOORS[0], _world.getInstanceId()); + closeDoor(DOORS[1], _world.getInstanceId()); + + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null) { + st.set("difficulty", 1); + st.setMemoState(2); + st.set("members", party.getMemberCount()); + _world.addAllowed(players.getObjectId()); + teleportPlayer(players, ENTER_TELEPORT_LOC, _world.getInstanceId(), true); + } + } + } + } + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) { + if (checkConditions(player)) { + enterInstance(player, new ChamblainsMountedTroopWorld(), "ChamblainsMountedTroop.xml", TEMPLATE_ID); + return "32527-entrance.html"; + } + return ""; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (tmpworld instanceof ChamblainsMountedTroopWorld) { + final ChamblainsMountedTroopWorld world = (ChamblainsMountedTroopWorld) InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (npc == world.doorMan) { + startQuestTimer("DOORMAN_KILLED", 2000, npc, null); + } + if (npc.getId() == REMNANT_MACHINE) { + world.doorMan.deleteMe(); + for (L2Npc _npc : world.npcList) { + _npc.deleteMe(); + } + world.npcList.clear(); + final L2Party party = killer.getParty(); + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null && players.getInstanceId() == world.getInstanceId()) { + st.setMemoState(3); + } + } + } + // finish Instance + cancelQuestTimers("FAILED_IN_TIME"); + finishInstance(world, EXIT_TIME * 60000); + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/GreatWarriorsMountedTroop.java b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/GreatWarriorsMountedTroop.java new file mode 100644 index 0000000000..ee877733e0 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/GreatWarriorsMountedTroop.java @@ -0,0 +1,357 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jserver.datapack.instances.AbstractInstance; +import com.l2jserver.datapack.quests.Q00693_DefeatingDragonkinRemnants.Q00693_DefeatingDragonkinRemnants; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.L2Territory; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * Gracia SoD Great Warriors Mounted Troop Instance + * @author Lomka + */ +public final class GreatWarriorsMountedTroop extends AbstractInstance { + protected class GreatWarriorsMountedTroopWorld extends InstanceWorld { + protected L2Attackable doorMan = null; + protected L2Attackable remnantMachine = null; + protected List<L2Npc> npcList = new ArrayList<>(); + } + + private static final int TEMPLATE_ID = 126; + private static final int EXIT_TIME = 5; + private static final int MAX_PLAYERS = 9; + private static final int MIN_LEVEL = 75; + private static final int EDRIC = 32527; + + private static final int DEFEATED_TROOPS_WHITE_DRAGON_LEADER = 18785; + private static final int DEFEATED_TROOPS_HEALER = 18790; + private static final int DEFEATED_TROOPS_BATALION_COMMANDER = 18784; + private static final int DEFEATED_TROOPS_COMMANDER = 18783; + private static final int DEFEATED_TROOPS_MAGIC_LEADER = 18787; + + private static final int DOORMAN = DEFEATED_TROOPS_COMMANDER; + + private static final int REMNANT_MACHINE = 18703; + private static final int SEED_CONTROLLER = 32602; + + private static final int[] DOORS = { + 12240001, + 12240002 + }; + + private static Location ENTER_TELEPORT_LOC = new Location(-242754, 219982, -10011); + private static final Location DOORMAN_SPAWN_LOC = new Location(-239504, 219984, -10112, 32767); + private static final Location REMNANT_MACHINE_LOC = new Location(-238320, 219983, -10112, 0); + + private static final L2Territory _hallZone1 = new L2Territory(1); + private static final L2Territory _hallZone2 = new L2Territory(2); + + private static final Map<Integer, Integer> HALL_1_SPAWNS = new HashMap<>(); + { + HALL_1_SPAWNS.put(DEFEATED_TROOPS_HEALER, 2); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_MAGIC_LEADER, 2); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_BATALION_COMMANDER, 2); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_COMMANDER, 3); + } + + private static final Map<Integer, Integer> HALL_2_SPAWNS = new HashMap<>(); + { + HALL_2_SPAWNS.put(DEFEATED_TROOPS_MAGIC_LEADER, 2); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_WHITE_DRAGON_LEADER, 5); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_BATALION_COMMANDER, 2); + } + + private static final int[][] HALL_ZONE_1_COORDINATES = { + { + -240766, + 219168, + -10178, + -9978 + }, + { + -240755, + 220795, + -10178, + -9978 + }, + { + -240667, + 220889, + -10178, + -9978 + }, + { + -239595, + 220886, + -10178, + -9978 + }, + { + -239487, + 220765, + -10178, + -9978 + }, + { + -239490, + 219170, + -10178, + -9978 + }, + { + -239583, + 219059, + -10178, + -9978 + }, + { + -240665, + 219065, + -10178, + -9978 + }, + }; + + private static final int[][] HALL_ZONE_2_COORDINATES = { + { + -238353, + 219165, + -10175, + -9975 + }, + { + -238340, + 220788, + -10175, + -9975 + }, + { + -238431, + 220888, + -10175, + -9975 + }, + { + -238933, + 220890, + -10175, + -9975 + }, + { + -239027, + 220789, + -10175, + -9975 + }, + { + -239034, + 219195, + -10175, + -9975 + }, + { + -238924, + 219067, + -10175, + -9975 + }, + { + -238445, + 219065, + -10175, + -9975 + }, + }; + + public GreatWarriorsMountedTroop() { + super(GreatWarriorsMountedTroop.class.getSimpleName(), "gracia/instances"); + addStartNpc(EDRIC); + addTalkId(EDRIC); + addKillId(DOORMAN, REMNANT_MACHINE); + for (int[] coord : HALL_ZONE_1_COORDINATES) { + _hallZone1.add(coord[0], coord[1], coord[2], coord[3], 0); + } + for (int[] coord : HALL_ZONE_2_COORDINATES) { + _hallZone2.add(coord[0], coord[1], coord[2], coord[3], 0); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "DOORMAN_KILLED": { + openDoor(DOORS[0], npc.getInstanceId()); + openDoor(DOORS[1], npc.getInstanceId()); + break; + } + } + return ""; + } + + @Override + protected boolean checkConditions(L2PcInstance player) { + final L2Party party = player.getParty(); + + if (party == null) { + player.sendPacket(SystemMessageId.NOT_IN_PARTY_CANT_ENTER); + return false; + } + + if (party.getLeader() != player) { + player.sendPacket(SystemMessageId.ONLY_PARTY_LEADER_CAN_ENTER); + return false; + } + + if (party.getMemberCount() > MAX_PLAYERS) { + player.sendPacket(SystemMessageId.PARTY_EXCEEDED_THE_LIMIT_CANT_ENTER); + return false; + } + for (L2PcInstance partyMember : party.getMembers()) { + if (partyMember.getLevel() < MIN_LEVEL) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (!Util.checkIfInRange(1000, player, partyMember, true)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (partyMember.isFlyingMounted()) { + partyMember.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_SEED_IN_FLYING_TRANSFORM); + return false; + } + } + return true; + } + + @Override + public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) { + if (firstEntrance) { + final L2Party party = player.getParty(); + GreatWarriorsMountedTroopWorld _world = (GreatWarriorsMountedTroopWorld) world; + _world.doorMan = (L2Attackable) addSpawn(DOORMAN, DOORMAN_SPAWN_LOC, false, 0, false, _world.getInstanceId()); + _world.remnantMachine = (L2Attackable) addSpawn(REMNANT_MACHINE, REMNANT_MACHINE_LOC, false, 0, false, _world.getInstanceId()); + _world.doorMan.setIsNoRndWalk(true); + _world.remnantMachine.disableCoreAI(true); + _world.remnantMachine.setIsImmobilized(true); + // Spawn mobs in the 1st hall + HALL_1_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone1.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn mobs in the 2nd hall + HALL_2_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone2.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn temporary teleporter + addSpawn(SEED_CONTROLLER, ENTER_TELEPORT_LOC, false, 0, false, _world.getInstanceId()); + closeDoor(DOORS[0], _world.getInstanceId()); + closeDoor(DOORS[1], _world.getInstanceId()); + + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null) { + st.set("difficulty", 4); + st.setMemoState(2); + st.set("members", party.getMemberCount()); + _world.addAllowed(players.getObjectId()); + teleportPlayer(players, ENTER_TELEPORT_LOC, _world.getInstanceId(), true); + } + } + } + } + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) { + if (checkConditions(player)) { + enterInstance(player, new GreatWarriorsMountedTroopWorld(), "GreatWarriorsMountedTroop.xml", TEMPLATE_ID); + return "32527-entrance.html"; + } + return ""; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (tmpworld instanceof GreatWarriorsMountedTroopWorld) { + final GreatWarriorsMountedTroopWorld world = (GreatWarriorsMountedTroopWorld) InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (npc == world.doorMan) { + startQuestTimer("DOORMAN_KILLED", 2000, npc, null); + } + if (npc.getId() == REMNANT_MACHINE) { + world.doorMan.deleteMe(); + for (L2Npc _npc : world.npcList) { + _npc.deleteMe(); + } + world.npcList.clear(); + final L2Party party = killer.getParty(); + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null && players.getInstanceId() == world.getInstanceId()) { + st.setMemoState(3); + } + } + } + // finish Instance + cancelQuestTimers("FAILED_IN_TIME"); + finishInstance(world, EXIT_TIME * 60000); + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/SoldiersMountedTroop.java b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/SoldiersMountedTroop.java new file mode 100644 index 0000000000..24b87e5369 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/SoldiersMountedTroop.java @@ -0,0 +1,352 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jserver.datapack.instances.AbstractInstance; +import com.l2jserver.datapack.quests.Q00693_DefeatingDragonkinRemnants.Q00693_DefeatingDragonkinRemnants; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.L2Territory; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * Gracia SoD Soldiers Mounted Troop Instance + * @author Lomka + */ +public final class SoldiersMountedTroop extends AbstractInstance { + protected class SoldiersMountedTroopWorld extends InstanceWorld { + protected L2Attackable doorMan = null; + protected L2Attackable remnantMachine = null; + protected List<L2Npc> npcList = new ArrayList<>(); + } + + private static final int TEMPLATE_ID = 124; + private static final int EXIT_TIME = 5; + private static final int MAX_PLAYERS = 9; + private static final int MIN_LEVEL = 75; + private static final int EDRIC = 32527; + + private static final int DEFEATED_TROOPS_WHITE_DRAGON_LEADER = 18785; + private static final int DEFEATED_TROOPS_INFANTRY = 18786; + private static final int DEFEATED_TROOPS_MAGIC_SOLDIER = 18789; + private static final int DOORMAN = DEFEATED_TROOPS_INFANTRY; + + private static final int REMNANT_MACHINE = 18703; + private static final int SEED_CONTROLLER = 32602; + + private static final int[] DOORS = { + 12240001, + 12240002 + }; + + private static Location ENTER_TELEPORT_LOC = new Location(-242754, 219982, -10011); + private static final Location DOORMAN_SPAWN_LOC = new Location(-239504, 219984, -10112, 32767); + private static final Location REMNANT_MACHINE_LOC = new Location(-238320, 219983, -10112, 0); + + private static final L2Territory _hallZone1 = new L2Territory(1); + private static final L2Territory _hallZone2 = new L2Territory(2); + + private static final Map<Integer, Integer> HALL_1_SPAWNS = new HashMap<>(); + { + HALL_1_SPAWNS.put(DEFEATED_TROOPS_WHITE_DRAGON_LEADER, 4); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 3); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_MAGIC_SOLDIER, 3); + } + + private static final Map<Integer, Integer> HALL_2_SPAWNS = new HashMap<>(); + { + HALL_2_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 4); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_MAGIC_SOLDIER, 3); + } + + private static final int[][] HALL_ZONE_1_COORDINATES = { + { + -240766, + 219168, + -10178, + -9978 + }, + { + -240755, + 220795, + -10178, + -9978 + }, + { + -240667, + 220889, + -10178, + -9978 + }, + { + -239595, + 220886, + -10178, + -9978 + }, + { + -239487, + 220765, + -10178, + -9978 + }, + { + -239490, + 219170, + -10178, + -9978 + }, + { + -239583, + 219059, + -10178, + -9978 + }, + { + -240665, + 219065, + -10178, + -9978 + }, + }; + + private static final int[][] HALL_ZONE_2_COORDINATES = { + { + -238353, + 219165, + -10175, + -9975 + }, + { + -238340, + 220788, + -10175, + -9975 + }, + { + -238431, + 220888, + -10175, + -9975 + }, + { + -238933, + 220890, + -10175, + -9975 + }, + { + -239027, + 220789, + -10175, + -9975 + }, + { + -239034, + 219195, + -10175, + -9975 + }, + { + -238924, + 219067, + -10175, + -9975 + }, + { + -238445, + 219065, + -10175, + -9975 + }, + }; + + public SoldiersMountedTroop() { + super(SoldiersMountedTroop.class.getSimpleName(), "gracia/instances"); + addStartNpc(EDRIC); + addTalkId(EDRIC); + addKillId(DOORMAN, REMNANT_MACHINE); + for (int[] coord : HALL_ZONE_1_COORDINATES) { + _hallZone1.add(coord[0], coord[1], coord[2], coord[3], 0); + } + for (int[] coord : HALL_ZONE_2_COORDINATES) { + _hallZone2.add(coord[0], coord[1], coord[2], coord[3], 0); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "DOORMAN_KILLED": { + openDoor(DOORS[0], npc.getInstanceId()); + openDoor(DOORS[1], npc.getInstanceId()); + break; + } + } + return ""; + } + + @Override + protected boolean checkConditions(L2PcInstance player) { + final L2Party party = player.getParty(); + + if (party == null) { + player.sendPacket(SystemMessageId.NOT_IN_PARTY_CANT_ENTER); + return false; + } + + if (party.getLeader() != player) { + player.sendPacket(SystemMessageId.ONLY_PARTY_LEADER_CAN_ENTER); + return false; + } + + if (party.getMemberCount() > MAX_PLAYERS) { + player.sendPacket(SystemMessageId.PARTY_EXCEEDED_THE_LIMIT_CANT_ENTER); + return false; + } + for (L2PcInstance partyMember : party.getMembers()) { + if (partyMember.getLevel() < MIN_LEVEL) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (!Util.checkIfInRange(1000, player, partyMember, true)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (partyMember.isFlyingMounted()) { + partyMember.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_SEED_IN_FLYING_TRANSFORM); + return false; + } + } + return true; + } + + @Override + public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) { + if (firstEntrance) { + final L2Party party = player.getParty(); + SoldiersMountedTroopWorld _world = (SoldiersMountedTroopWorld) world; + _world.doorMan = (L2Attackable) addSpawn(DOORMAN, DOORMAN_SPAWN_LOC, false, 0, false, _world.getInstanceId()); + _world.remnantMachine = (L2Attackable) addSpawn(REMNANT_MACHINE, REMNANT_MACHINE_LOC, false, 0, false, _world.getInstanceId()); + _world.doorMan.setIsNoRndWalk(true); + _world.remnantMachine.disableCoreAI(true); + _world.remnantMachine.setIsImmobilized(true); + // Spawn mobs in the 1st hall + HALL_1_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone1.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn mobs in the 2nd hall + HALL_2_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone2.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn temporary teleporter + addSpawn(SEED_CONTROLLER, ENTER_TELEPORT_LOC, false, 0, false, _world.getInstanceId()); + closeDoor(DOORS[0], _world.getInstanceId()); + closeDoor(DOORS[1], _world.getInstanceId()); + + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null) { + st.set("difficulty", 2); + st.setMemoState(2); + st.set("members", party.getMemberCount()); + _world.addAllowed(players.getObjectId()); + teleportPlayer(players, ENTER_TELEPORT_LOC, _world.getInstanceId(), true); + } + } + } + } + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) { + if (checkConditions(player)) { + enterInstance(player, new SoldiersMountedTroopWorld(), "SoldiersMountedTroop.xml", TEMPLATE_ID); + return "32527-entrance.html"; + } + return ""; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (tmpworld instanceof SoldiersMountedTroopWorld) { + final SoldiersMountedTroopWorld world = (SoldiersMountedTroopWorld) InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (npc == world.doorMan) { + startQuestTimer("DOORMAN_KILLED", 2000, npc, null); + } + if (npc.getId() == REMNANT_MACHINE) { + world.doorMan.deleteMe(); + for (L2Npc _npc : world.npcList) { + _npc.deleteMe(); + } + world.npcList.clear(); + final L2Party party = killer.getParty(); + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null && players.getInstanceId() == world.getInstanceId()) { + st.setMemoState(3); + } + } + } + // finish Instance + cancelQuestTimers("FAILED_IN_TIME"); + finishInstance(world, EXIT_TIME * 60000); + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/WarriorsMountedTroop.java b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/WarriorsMountedTroop.java new file mode 100644 index 0000000000..d80c7edf94 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/gracia/instances/SeedOfDestruction/MountedTroops/WarriorsMountedTroop.java @@ -0,0 +1,359 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.gracia.instances.SeedOfDestruction.MountedTroops; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.l2jserver.datapack.instances.AbstractInstance; +import com.l2jserver.datapack.quests.Q00693_DefeatingDragonkinRemnants.Q00693_DefeatingDragonkinRemnants; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.L2Territory; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.util.Util; + +/** + * Gracia SoD Warriors Mounted Troop Instance + * @author Lomka + */ +public final class WarriorsMountedTroop extends AbstractInstance { + protected class WarriorsMountedTroopWorld extends InstanceWorld { + protected L2Attackable doorMan = null; + protected L2Attackable remnantMachine = null; + protected List<L2Npc> npcList = new ArrayList<>(); + } + + private static final int TEMPLATE_ID = 125; + private static final int EXIT_TIME = 5; + private static final int MAX_PLAYERS = 9; + private static final int MIN_LEVEL = 75; + private static final int EDRIC = 32527; + + private static final int DEFEATED_TROOPS_WHITE_DRAGON_LEADER = 18785; + private static final int DEFEATED_TROOPS_INFANTRY = 18786; + private static final int DEFEATED_TROOPS_HEALER = 18790; + private static final int DEFEATED_TROOPS_BATALION_COMMANDER = 18784; + private static final int DEFEATED_TROOPS_COMMANDER = 18783; + private static final int DEFEATED_TROOPS_MAGICIAN = 18788; + + private static final int DOORMAN = DEFEATED_TROOPS_WHITE_DRAGON_LEADER; + + private static final int REMNANT_MACHINE = 18703; + private static final int SEED_CONTROLLER = 32602; + + private static final int[] DOORS = { + 12240001, + 12240002 + }; + + private static Location ENTER_TELEPORT_LOC = new Location(-242754, 219982, -10011); + private static final Location DOORMAN_SPAWN_LOC = new Location(-239504, 219984, -10112, 32767); + private static final Location REMNANT_MACHINE_LOC = new Location(-238320, 219983, -10112, 0); + + private static final L2Territory _hallZone1 = new L2Territory(1); + private static final L2Territory _hallZone2 = new L2Territory(2); + + private static final Map<Integer, Integer> HALL_1_SPAWNS = new HashMap<>(); + { + HALL_1_SPAWNS.put(DEFEATED_TROOPS_WHITE_DRAGON_LEADER, 1); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 3); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_HEALER, 2); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_BATALION_COMMANDER, 3); + HALL_1_SPAWNS.put(DEFEATED_TROOPS_COMMANDER, 1); + } + + private static final Map<Integer, Integer> HALL_2_SPAWNS = new HashMap<>(); + { + HALL_2_SPAWNS.put(DEFEATED_TROOPS_BATALION_COMMANDER, 3); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_MAGICIAN, 3); + HALL_2_SPAWNS.put(DEFEATED_TROOPS_INFANTRY, 1); + } + + private static final int[][] HALL_ZONE_1_COORDINATES = { + { + -240766, + 219168, + -10178, + -9978 + }, + { + -240755, + 220795, + -10178, + -9978 + }, + { + -240667, + 220889, + -10178, + -9978 + }, + { + -239595, + 220886, + -10178, + -9978 + }, + { + -239487, + 220765, + -10178, + -9978 + }, + { + -239490, + 219170, + -10178, + -9978 + }, + { + -239583, + 219059, + -10178, + -9978 + }, + { + -240665, + 219065, + -10178, + -9978 + }, + }; + + private static final int[][] HALL_ZONE_2_COORDINATES = { + { + -238353, + 219165, + -10175, + -9975 + }, + { + -238340, + 220788, + -10175, + -9975 + }, + { + -238431, + 220888, + -10175, + -9975 + }, + { + -238933, + 220890, + -10175, + -9975 + }, + { + -239027, + 220789, + -10175, + -9975 + }, + { + -239034, + 219195, + -10175, + -9975 + }, + { + -238924, + 219067, + -10175, + -9975 + }, + { + -238445, + 219065, + -10175, + -9975 + }, + }; + + public WarriorsMountedTroop() { + super(WarriorsMountedTroop.class.getSimpleName(), "gracia/instances"); + addStartNpc(EDRIC); + addTalkId(EDRIC); + addKillId(DOORMAN, REMNANT_MACHINE); + for (int[] coord : HALL_ZONE_1_COORDINATES) { + _hallZone1.add(coord[0], coord[1], coord[2], coord[3], 0); + } + for (int[] coord : HALL_ZONE_2_COORDINATES) { + _hallZone2.add(coord[0], coord[1], coord[2], coord[3], 0); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + switch (event) { + case "DOORMAN_KILLED": { + openDoor(DOORS[0], npc.getInstanceId()); + openDoor(DOORS[1], npc.getInstanceId()); + break; + } + } + return ""; + } + + @Override + protected boolean checkConditions(L2PcInstance player) { + final L2Party party = player.getParty(); + + if (party == null) { + player.sendPacket(SystemMessageId.NOT_IN_PARTY_CANT_ENTER); + return false; + } + + if (party.getLeader() != player) { + player.sendPacket(SystemMessageId.ONLY_PARTY_LEADER_CAN_ENTER); + return false; + } + + if (party.getMemberCount() > MAX_PLAYERS) { + player.sendPacket(SystemMessageId.PARTY_EXCEEDED_THE_LIMIT_CANT_ENTER); + return false; + } + for (L2PcInstance partyMember : party.getMembers()) { + if (partyMember.getLevel() < MIN_LEVEL) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_REQUIREMENT_IS_NOT_SUFFICIENT_AND_CANNOT_BE_ENTERED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (!Util.checkIfInRange(1000, player, partyMember, true)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), TEMPLATE_ID)) { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET); + sm.addPcName(partyMember); + party.broadcastPacket(sm); + return false; + } + if (partyMember.isFlyingMounted()) { + partyMember.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_SEED_IN_FLYING_TRANSFORM); + return false; + } + } + return true; + } + + @Override + public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance) { + if (firstEntrance) { + final L2Party party = player.getParty(); + WarriorsMountedTroopWorld _world = (WarriorsMountedTroopWorld) world; + _world.doorMan = (L2Attackable) addSpawn(DOORMAN, DOORMAN_SPAWN_LOC, false, 0, false, _world.getInstanceId()); + _world.remnantMachine = (L2Attackable) addSpawn(REMNANT_MACHINE, REMNANT_MACHINE_LOC, false, 0, false, _world.getInstanceId()); + _world.doorMan.setIsNoRndWalk(true); + _world.remnantMachine.disableCoreAI(true); + _world.remnantMachine.setIsImmobilized(true); + // Spawn mobs in the 1st hall + HALL_1_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone1.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn mobs in the 2nd hall + HALL_2_SPAWNS.entrySet().forEach(entry -> { + for (int i = 0; i < entry.getValue(); i++) { + final Location location = _hallZone2.getRandomPoint(); + location.setHeading(getRandom(65536)); + L2Attackable spawn = (L2Attackable) addSpawn(entry.getKey(), location, false, 0, false, _world.getInstanceId()); + spawn.setIsNoRndWalk(true); + _world.npcList.add(spawn); + } + }); + // Spawn temporary teleporter + addSpawn(SEED_CONTROLLER, ENTER_TELEPORT_LOC, false, 0, false, _world.getInstanceId()); + closeDoor(DOORS[0], _world.getInstanceId()); + closeDoor(DOORS[1], _world.getInstanceId()); + + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null) { + st.set("difficulty", 3); + st.setMemoState(2); + st.set("members", party.getMemberCount()); + _world.addAllowed(players.getObjectId()); + teleportPlayer(players, ENTER_TELEPORT_LOC, _world.getInstanceId(), true); + } + } + } + } + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) { + if (checkConditions(player)) { + enterInstance(player, new WarriorsMountedTroopWorld(), "WarriorsMountedTroop.xml", TEMPLATE_ID); + return "32527-entrance.html"; + } + return ""; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (tmpworld instanceof WarriorsMountedTroopWorld) { + final WarriorsMountedTroopWorld world = (WarriorsMountedTroopWorld) InstanceManager.getInstance().getWorld(npc.getInstanceId()); + if (npc == world.doorMan) { + startQuestTimer("DOORMAN_KILLED", 2000, npc, null); + } + if (npc.getId() == REMNANT_MACHINE) { + world.doorMan.deleteMe(); + for (L2Npc _npc : world.npcList) { + _npc.deleteMe(); + } + world.npcList.clear(); + final L2Party party = killer.getParty(); + if (party != null) { + for (L2PcInstance players : party.getMembers()) { + QuestState st = players.getQuestState(Q00693_DefeatingDragonkinRemnants.class.getSimpleName()); + if (st != null && players.getInstanceId() == world.getInstanceId()) { + st.setMemoState(3); + } + } + } + // finish Instance + cancelQuestTimers("FAILED_IN_TIME"); + finishInstance(world, EXIT_TIME * 60000); + } + } + return super.onKill(npc, killer, isSummon); + } +} diff --git a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGraciaSeeds.java b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGraciaSeeds.java index 8116fea5fd..f3a1a71ca0 100644 --- a/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGraciaSeeds.java +++ b/src/main/java/com/l2jserver/datapack/handlers/admincommandhandlers/AdminGraciaSeeds.java @@ -46,7 +46,7 @@ public class AdminGraciaSeeds implements IAdminCommandHandler { if (actualCommand.equalsIgnoreCase("admin_kill_tiat")) { GraciaSeedsManager.getInstance().increaseSoDTiatKilled(); } else if (actualCommand.equalsIgnoreCase("admin_set_sodstate")) { - GraciaSeedsManager.getInstance().setSoDState(Integer.parseInt(val), true); + GraciaSeedsManager.getInstance().setSoDState(Integer.parseInt(val), true, Integer.parseInt(val) < 3); } showMenu(activeChar); diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00.html new file mode 100644 index 0000000000..af42e436e5 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00.html @@ -0,0 +1,5 @@ +<html><head><body>Officer Edric:<br> +Hail! I am <font color="LEVEL">Officer Edric, who manages the remnant of the Mounted Troop</font> here. We caught some of the <font color="LEVEL">Mounted Troop's lesser minions when the Seed of Destruction became temporarily stable</font>.<br> +Do you have time for a chat?<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants">Quest</a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00a.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00a.html new file mode 100644 index 0000000000..7a547027ce --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-00a.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +The Seed of Destruction is on the rise. Orders have come down to withdraw. We must flee now and hope for the best... Perhaps fortune will allow us to wage this battle some other time. Right now, our focus just needs to be on survival. +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-01.htm b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-01.htm new file mode 100644 index 0000000000..efb58d94e9 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-01.htm @@ -0,0 +1,7 @@ +<html><head><body>Officer Edric:<br> +When I was a soldier, I fought, armed only with patriotism and loyalty. And I survived, as you can see. But all I got for my efforts were these menial chores and this lowly rank of "Officer."<br> +Ha! How I long for the days when I saw my enemy face to face! But I am still a soldier, and I will still obey orders -- no matter how much I hate them.<br> +Will you at least fight on my behalf? I long to see <font color="LEVEL">these remnants destroyed</font>.<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-02.html">Listen to the rules of battle.</a><br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-05.htm">Register for the battle with the Mounted Troop.<a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-02.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-02.html new file mode 100644 index 0000000000..9682a6e871 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-02.html @@ -0,0 +1,6 @@ +<html><head><body>Officer Edric:<br> +The rules are so simple, I almost don't need to explain. <font color="LEVEL">When your party is ready, the remnants will be freed at the Entrance of Destruction. You and your party will enter through it. Then we will block the only passage.</font>At that point, the full-scale show-down begins.<br> +<font color="LEVEL">You and your party will eliminate the remnants and escape after breaking through the blocked passage.</font> You'll be rewarded for your efforts, I promise you.<br> +<font color="LEVEL">However, you have only 20 minutes to succeed.</font> I'm not releasing those hard-caught remnants simply to watch a long and boring battle! You will lose if everyone in your team dies or if more than 1 minute passes after everyone escapes through Scroll of Escape or some other means. If I have to send my troops to catch them again, I won't pay you a thing.<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-03.html">Keep listening.</a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-03.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-03.html new file mode 100644 index 0000000000..b7388107a4 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-03.html @@ -0,0 +1,10 @@ +<html><head><body>Officer Edric:<br> +If you are interested in the match, simply <font color="LEVEL">register for battle</font>. <font color="LEVEL">When you are ready to start, have the leader of your party let me know.</font><br> +After the party leader selects one of the following <font color="LEVEL">degrees of battle difficulty</font>, entry will be granted:<br> +<font color="LEVEL">2-3</font> for battle with <font color="LEVEL">Mounted Troop Chamberlains</font>,<br> +<font color="LEVEL">4-5</font> for battle with <font color="LEVEL">Mounted Troop Soldiers</font>,<br> +<font color="LEVEL">6-7</font> for <font color="LEVEL">Mounted Troop Warriors</font>, and <br> +<font color="LEVEL">8-9</font> for <font color="LEVEL">Mounted Troop Great Warriors</font>.<br> +These are only recommendations; choose whichever level you want. But you're responsible for the consequences of your selection...<br><br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-04.htm">Keep listening.</a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-04.htm b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-04.htm new file mode 100644 index 0000000000..aba86e656a --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-04.htm @@ -0,0 +1,6 @@ +<html><head><body>Officer Edric:<br> +There have been cases in which the defeated party kept requesting a rematch, <font color="LEVEL">so by rule the battle is allowed only once a day. (The clock is reset in real time at 6:30 AM)</font> You can come back to avenge your defeat any time the next day if you want.<br> +This battle is only available when the Seed of Destruction is stable. Otherwise, we are the ones who must flee from the Dragon Tribe! Who knows, perhaps we might end up serving as their entertainment instead!<br> +Any questions? It will seem simpler once you're in battle -- I promise. What do you say? Ready to do it?<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-05.htm">Register for battle with the Mounted Troop.</a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-05.htm b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-05.htm new file mode 100644 index 0000000000..be7d8cf11c --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-05.htm @@ -0,0 +1,6 @@ +<html><head><body>Officer Edric:<br> +<font color="LEVEL">You're now registered for battle.</font><br> +I'm looking forward to seeing what you can do in there... <br> +What? Don't look at me like that. Do you think the higher-level officers care about mere remnants? Nobody cares about them! Do with them whatever you want. <font color="LEVEL">Your name will be remembered as a hero who attacked the Mounted Troop, defeated them and killed many of the Dragon Tribe!</font> Ha ha!<br> +Now see to your party's preparations. When you're ready, have your party leader let me know.<br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-06.htm b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-06.htm new file mode 100644 index 0000000000..6cece173de --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-06.htm @@ -0,0 +1,12 @@ +<html><head><body>Officer Edric:<br> +Are you ready? Then choose the degree of battle difficulty.<br> +Battle with <font color="LEVEL">Mounted Troop Chamberlains</font>: 2-3<br> +Battle with <font color="LEVEL">Mounted Troop Soldiers</font>: 4-5<br> +Battle with <font color="LEVEL">Mounted Troop Warriors</font>: 6-7<br> +Battle with <font color="LEVEL">Mounted Troop Great Warriors</font>: 8-9<br> +These are only recommendations. You can select a battle regardless of the number of members in your party.<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-07.html">Fight with Mounted Troop Chamberlains.</a><br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-08.html">Fight with Mounted Troop Soldiers.</a><br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-09.html">Fight with Mounted Troop Warriors.</a><br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants 32527-10.html">Fight with Mounted Troop Great Warriors.</a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-07.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-07.html new file mode 100644 index 0000000000..9ab1d5d8fd --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-07.html @@ -0,0 +1,5 @@ +<html><head><body>Officer Edric:<br> +You've chosen the <font color="LEVEL">battle with Mounted Troop Chamberlains</font>.<br>You shouldn't have any problems with this one. Next time, choose something more challenging!<br> +Please confirm all your party members are ready. When they are, I'll teleport you to the arena.<br> +<a action="bypass -h Quest ChamblainsMountedTroop">Move to the battle location.<a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-08.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-08.html new file mode 100644 index 0000000000..eb117e4496 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-08.html @@ -0,0 +1,6 @@ +<html><head><body>Office Edric:<br> +You've chosen the <font color="LEVEL">battle with Mounted Troop Soldiers</font>.<br> +This will be an easy one. May your triumph be swift and complete!<br> +Please confirm all your party members are ready. When they are, I'll teleport you to the arena.<br> +<a action="bypass -h Quest SoldiersMountedTroop">Move to the battle location.<a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-09.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-09.html new file mode 100644 index 0000000000..519d2a2068 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-09.html @@ -0,0 +1,6 @@ +<html><head><body>Office Edric:<br> +You've chosen the <font color="LEVEL">battle with Mounted Troop Warriors</font>.<br> +This one won't be so easy. Do your best and work together!<br> +Please confirm all your party members are ready. When they are, I'll teleport you to the arena.<br> +<a action="bypass -h Quest WarriorsMountedTroop">Move to the battle location.<a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-10.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-10.html new file mode 100644 index 0000000000..ed6580979b --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-10.html @@ -0,0 +1,6 @@ +<html><head><body>Office Edric:<br> +You've chosen the <font color="LEVEL">battle with Mounted Troop Great Warriors</font>.<br> +This one won't be so easy. Do your best and work together!<br> +Please confirm all your party members are ready. When they are, I'll teleport you to the arena.<br> +<a action="bypass -h Quest GreatWarriorsMountedTroop">Move to the battle location.<a><br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-11.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-11.html new file mode 100644 index 0000000000..a06cfa4f87 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-11.html @@ -0,0 +1,5 @@ +<html><head><body>Officer Edric:<br> +I'll send you back to the Entrance of Destruction if you want. If you want to start from the beginning, that's fine with me.<br> +(To start the quest from the beginning, first select "Quest Stop.")<br> +<a action="bypass -h Quest Q00693_DefeatingDragonkinRemnants reenter">Move to the battle location.<a> +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-12.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-12.html new file mode 100644 index 0000000000..d4d0ed819f --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-12.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +You need some cool-down time. By rule, you can only participate in the battle once a day. (The clock is reset in real-time at 6:30 a.m.) +</body></html> diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-lowlevel.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-lowlevel.html new file mode 100644 index 0000000000..3a0e500fe2 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-lowlevel.html @@ -0,0 +1,6 @@ +<html><head><body>Officer Edric:<br> +When I was a soldier, I fought, armed only with patriotism and loyalty. And I survived, as you can see. But all I got for my efforts were these menial chores and this lowly rank of "Officer."<br> +Ha! How I long for the days when I saw my enemy face to face! But I am still a soldier, and I will still obey orders -- no matter how much I hate them.<br> +So I kill only time now watching the courageous <font color="LEVEL">adventurers match their skills against the remnants of the Dragon Tribe</font>. When you have a little more experience, perhaps you can take part.<br> +(Only characters who are level 75 or above may undertake this quest.)<br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noleader.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noleader.html new file mode 100644 index 0000000000..b63f1b8ebf --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noleader.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +<font color="LEVEL">You need a party leader to enter.</font> Let me talk to your leader. Call %leader% for me.<br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noparty.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noparty.html new file mode 100644 index 0000000000..21e14c203a --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noparty.html @@ -0,0 +1,4 @@ +<html><head><body>Officer Edric:<br> +They are still demons under the power of Dragon of Darkness, even if they are the captured remnants of the Mounted Troupe. Do you think you can confront them by yourself?<br> +<font color="LEVEL">Find a party and come back.</font> I won't let you in there otherwise.<br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noquest.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noquest.html new file mode 100644 index 0000000000..16100f43b4 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noquest.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +Uh... %member% isn't registered. <font color="LEVEL">Your party can't enter the battle with an un-registered member.</font> Tell him to register right away!<br> +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noreward.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noreward.html new file mode 100644 index 0000000000..9b0b18f247 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-noreward.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +Well done. Watching you fight remind me of my own time in the ranks. It sure brought back memories! Unfortunately, you didn't qualify for a reward. Tat's not a reflection on your skills, believe me. It just wasn't your day. When you try again, I'm sure things will turn out better. +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-reward.html b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-reward.html new file mode 100644 index 0000000000..f96f0f3443 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/32527-reward.html @@ -0,0 +1,3 @@ +<html><head><body>Officer Edric:<br> +Well done. Watching you fight remind me of my own time in the ranks. It sure brought back memories! I only wish I could give you a better reward than this. Please come back and challenge again soon! +</body></html> \ No newline at end of file diff --git a/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/Q00693_DefeatingDragonkinRemnants.java b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/Q00693_DefeatingDragonkinRemnants.java new file mode 100644 index 0000000000..fb8498f8d0 --- /dev/null +++ b/src/main/java/com/l2jserver/datapack/quests/Q00693_DefeatingDragonkinRemnants/Q00693_DefeatingDragonkinRemnants.java @@ -0,0 +1,171 @@ +/* + * Copyright © 2004-2021 L2J DataPack + * + * This file is part of L2J DataPack. + * + * L2J DataPack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * L2J DataPack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package com.l2jserver.datapack.quests.Q00693_DefeatingDragonkinRemnants; + +import com.l2jserver.gameserver.enums.audio.Sound; +import com.l2jserver.gameserver.instancemanager.GraciaSeedsManager; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.Quest; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.network.SystemMessageId; + +/** + * Quest 693 - Defeating Dragonkin Remnants + * @author Lomka + */ +public class Q00693_DefeatingDragonkinRemnants extends Quest { + private static final int EDRIC = 32527; + private static final int MIN_LEVEL = 75; + private static Location ENTER_TELEPORT_LOC = new Location(-242754, 219982, -10011); + + public Q00693_DefeatingDragonkinRemnants() { + super(693, Q00693_DefeatingDragonkinRemnants.class.getSimpleName(), "Defeating Dragonkin Remnants"); + addStartNpc(EDRIC); + addFirstTalkId(EDRIC); + addTalkId(EDRIC); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) { + if (GraciaSeedsManager.getInstance().getSoDState() == 2) { + return "32527-00.html"; + } + return "32527-00a.html"; + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance talker) { + QuestState st = getQuestState(talker, true); + String htmltext = getNoQuestMsg(talker); + if (npc.getId() == EDRIC) { + if (talker.getLevel() < 75) { + htmltext = "32527-lowlevel.htm"; + } else if (st.getMemoState() < 1) { + htmltext = "32527-01.htm"; + } else if (st.isStarted() && st.getMemoState() >= 1) { + L2Party party = talker.getParty(); + if (st.getMemoState() >= 3) { + if (st.isMemoState(3) && rewardPlayer(st, st.getInt("difficulty"), st.getInt("members"))) { + htmltext = "32527-reward.html"; + } else { + htmltext = "32527-noreward.html"; + } + st.unset("difficulty"); + st.unset("members"); + playSound(talker, Sound.ITEMSOUND_QUEST_FINISH); + st.exitQuest(true); + } else if (st.isMemoState(2)) { + htmltext = "32527-11.html"; + } else if (party == null) { + htmltext = "32527-noparty.html"; + } else if (!party.getLeader().equals(talker)) { + htmltext = getHtm(talker.getHtmlPrefix(), "32527-noleader.html"); + htmltext = htmltext.replace("%leader%", party.getLeader().getName()); + } else { + for (L2PcInstance member : party.getMembers()) { + QuestState state = getQuestState(member, false); + if (state == null || (!state.isStarted()) || (!state.isMemoState(1))) { + htmltext = getHtm(talker.getHtmlPrefix(), "32527-noquest.html"); + htmltext = htmltext.replace("%member%", member.getName()); + return htmltext; + } + } + htmltext = "32527-06.htm"; + } + } + } + return htmltext; + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { + final QuestState st = getQuestState(player, false); + String htmltext = event; + if (st == null) { + return null; + } + if (event.equalsIgnoreCase("32527-05.htm")) { + if (checkInstances(player)) { + playSound(player, Sound.ITEMSOUND_QUEST_ACCEPT); + if (player.getLevel() >= MIN_LEVEL) { + st.startQuest(false); + st.setMemoState(1); + st.playSound(Sound.ITEMSOUND_QUEST_ACCEPT); + htmltext = event; + } + } else { + htmltext = "32527-12.html"; + } + } + if (event.equalsIgnoreCase("reenter")) { + htmltext = ""; + if (st.getInt("difficulty") >= 1) { + InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); + // player already in the instance + if (world != null) { + if (world.getTemplateId() >= 123 && world.getTemplateId() <= 126) { + teleportPlayer(player, ENTER_TELEPORT_LOC, world.getInstanceId(), true); + } else { + player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON); + } + } else { + htmltext = "32527-noreward.html"; + st.unset("difficulty"); + st.unset("members"); + playSound(player, Sound.ITEMSOUND_QUEST_FINISH); + st.exitQuest(true); + } + } + } + return htmltext; + } + + private boolean checkInstances(L2PcInstance talker) { + if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(talker.getObjectId(), 123) // + || System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(talker.getObjectId(), 124) // + || System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(talker.getObjectId(), 125) // + || System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(talker.getObjectId(), 126) // + ) { + return false; + } + return true; + } + + private boolean rewardPlayer(QuestState st, int difficulty, int memberCount) { + if (getRandom(1000) < (10000 / (memberCount * 10) * (1 + difficulty * 2))) { + if (difficulty == 4) { + st.giveItems(14638, 1L); // Best Quality Battle Reward Chest + } else if (difficulty == 3) { + st.giveItems(14637, 1L); // High-Grade Battle Reward Chest + } else if (difficulty == 2) { + st.giveItems(14636, 1L); // Middle Quality Battle Reward Chest + } else if (difficulty == 1) { + st.giveItems(14635, 1L); // Low Quality Battle Reward Chest + } + return true; + } + return false; + } + +} diff --git a/src/main/resources/data/Routes.xml b/src/main/resources/data/Routes.xml index 6e1b890748..1d1dd14976 100644 --- a/src/main/resources/data/Routes.xml +++ b/src/main/resources/data/Routes.xml @@ -1111,6 +1111,91 @@ <point X="124948" Y="206778" Z="-3400" delay="0" run="false" /> <point X="124483" Y="207777" Z="-3200" delay="60" run="false" /> </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_center" repeat="true" repeatStyle="back"> + <point X="-251457" Y="217771" Z="-12304" delay="0" run="true" /> + <point X="-251446" Y="217377" Z="-12288" delay="0" run="true" /> + <point X="-251791" Y="217292" Z="-12288" delay="0" run="true" /> + <point X="-252172" Y="216891" Z="-12264" delay="0" run="true" /> + <point X="-251965" Y="216458" Z="-12248" delay="0" run="true" /> + <point X="-251424" Y="216370" Z="-12248" delay="0" run="true" /> + <point X="-251424" Y="215790" Z="-12208" delay="0" run="true" /> + <point X="-251424" Y="215213" Z="-12152" delay="0" run="true" /> + <point X="-251424" Y="214565" Z="-12080" delay="0" run="true" /> + <point X="-251424" Y="213729" Z="-12080" delay="0" run="true" /> + <point X="-251424" Y="213114" Z="-12064" delay="0" run="true" /> + <point X="-251434" Y="212237" Z="-11984" delay="0" run="true" /> + <point X="-251444" Y="212045" Z="-11984" delay="0" run="true" /> + <point X="-251441" Y="211784" Z="-11984" delay="0" run="true" /> + <point X="-251442" Y="211679" Z="-11984" delay="0" run="true" /> + <point X="-251310" Y="211667" Z="-11984" delay="0" run="true" /> + <point X="-250897" Y="211673" Z="-11912" delay="0" run="true" /> + <point X="-250416" Y="211676" Z="-11856" delay="0" run="true" /> + <point X="-250415" Y="211189" Z="-11856" delay="0" run="true" /> + <point X="-250422" Y="209048" Z="-11952" delay="0" run="true" /> + <point X="-250401" Y="207541" Z="-11952" delay="0" run="true" /> + </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_left" repeat="true" repeatStyle="back"> + <point X="-252913" Y="217802" Z="-12312" delay="0" run="true" /> + <point X="-252744" Y="217350" Z="-12288" delay="0" run="true" /> + <point X="-252263" Y="217283" Z="-12288" delay="0" run="true" /> + <point X="-252222" Y="216955" Z="-12280" delay="0" run="true" /> + <point X="-252015" Y="216522" Z="-12248" delay="0" run="true" /> + <point X="-251474" Y="216434" Z="-12248" delay="0" run="true" /> + <point X="-251474" Y="215854" Z="-12208" delay="0" run="true" /> + <point X="-251474" Y="215277" Z="-12168" delay="0" run="true" /> + <point X="-251475" Y="214629" Z="-12080" delay="0" run="true" /> + <point X="-251474" Y="213793" Z="-12080" delay="0" run="true" /> + <point X="-251474" Y="213178" Z="-12064" delay="0" run="true" /> + <point X="-251484" Y="212301" Z="-11984" delay="0" run="true" /> + <point X="-251484" Y="212301" Z="-11984" delay="0" run="true" /> + <point X="-251497" Y="212109" Z="-11984" delay="0" run="true" /> + <point X="-251489" Y="211848" Z="-11984" delay="0" run="true" /> + <point X="-251462" Y="211680" Z="-11984" delay="0" run="true" /> + <point X="-251310" Y="211679" Z="-11984" delay="0" run="true" /> + <point X="-250893" Y="211679" Z="-11912" delay="0" run="true" /> + <point X="-250434" Y="211675" Z="-11856" delay="0" run="true" /> + <point X="-250420" Y="211203" Z="-11856" delay="0" run="true" /> + <point X="-250437" Y="209055" Z="-11952" delay="0" run="true" /> + <point X="-252013" Y="207677" Z="-11960" delay="0" run="true" /> + </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_right" repeat="true" repeatStyle="back"> + <point X="-249895" Y="217888" Z="-12328" delay="0" run="true" /> + <point X="-249966" Y="217368" Z="-12288" delay="0" run="true" /> + <point X="-250690" Y="217337" Z="-12288" delay="0" run="true" /> + <point X="-250690" Y="216902" Z="-12272" delay="0" run="true" /> + <point X="-250965" Y="216491" Z="-12248" delay="0" run="true" /> + <point X="-251431" Y="216450" Z="-12248" delay="0" run="true" /> + <point X="-251430" Y="215870" Z="-12208" delay="0" run="true" /> + <point X="-251432" Y="215293" Z="-12168" delay="0" run="true" /> + <point X="-251432" Y="214645" Z="-12080" delay="0" run="true" /> + <point X="-251432" Y="213809" Z="-12080" delay="0" run="true" /> + <point X="-251434" Y="213194" Z="-12064" delay="0" run="true" /> + <point X="-251444" Y="212317" Z="-11984" delay="0" run="true" /> + <point X="-251451" Y="212125" Z="-11984" delay="0" run="true" /> + <point X="-251445" Y="211864" Z="-11984" delay="0" run="true" /> + <point X="-251448" Y="211691" Z="-11984" delay="0" run="true" /> + <point X="-251315" Y="211669" Z="-11984" delay="0" run="true" /> + <point X="-250987" Y="211669" Z="-11928" delay="0" run="true" /> + <point X="-250438" Y="211671" Z="-11856" delay="0" run="true" /> + <point X="-250409" Y="211175" Z="-11856" delay="0" run="true" /> + <point X="-250391" Y="209043" Z="-11952" delay="0" run="true" /> + <point X="-248790" Y="207749" Z="-11960" delay="0" run="true" /> + </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_left_surprise" repeat="true" repeatStyle="back"> + <point X="-251776" Y="207789" Z="-11995" delay="0" run="true" /> + </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_center_surprise" repeat="true" repeatStyle="back"> + <point X="-250398" Y="207811" Z="-11995" delay="0" run="true" /> + </route> + <!-- Seed of Destruction - Defence Stage --> + <route name="invasion_right_surprise" repeat="true" repeatStyle="back"> + <point X="-248958" Y="208053" Z="-11995" delay="0" run="true" /> + </route> <!-- Suspicious Merchant - Borderland Fortress --> <route name="godad_fort_ordery" repeat="true" repeatStyle="back"> <target id="35928" spawnX="161876" spawnY="-73407" spawnZ="-2984" /> diff --git a/src/main/resources/data/html/admin/graciaseeds.htm b/src/main/resources/data/html/admin/graciaseeds.htm index d8004a603a..d120fcc79c 100644 --- a/src/main/resources/data/html/admin/graciaseeds.htm +++ b/src/main/resources/data/html/admin/graciaseeds.htm @@ -25,10 +25,14 @@ Seed of Destruction:<br> </table><br> <table width=270 border=0 bgcolor="444444"> <tr> -<td><button value="Kill Tiat" action="bypass -h admin_kill_tiat" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> -<td><button value="State 1" action="bypass -h admin_set_sodstate 1" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> -<td><button value="State 2" action="bypass -h admin_set_sodstate 2" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> -<td><button value="State 3" action="bypass -h admin_set_sodstate 3" width=65 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +<td><button value="Kill Tiat" action="bypass -h admin_kill_tiat" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +<td><button value="State 1" action="bypass -h admin_set_sodstate 1" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +<td><button value="State 2" action="bypass -h admin_set_sodstate 2" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +</tr> +<tr> +<td><button value="State 3" action="bypass -h admin_set_sodstate 3" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +<td><button value="State 4" action="bypass -h admin_set_sodstate 4" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> +<td><button value="State 5" action="bypass -h admin_set_sodstate 5" width=86 height=21 back="L2UI_CT1.Button_DF_Down" fore="L2UI_CT1.Button_DF"></td> </tr> </table> </body></html> \ No newline at end of file diff --git a/src/main/resources/data/html/default/32549-1.htm b/src/main/resources/data/html/default/32549-1.htm index 85ef73e451..853f980071 100644 --- a/src/main/resources/data/html/default/32549-1.htm +++ b/src/main/resources/data/html/default/32549-1.htm @@ -1,6 +1,6 @@ <html><body>Dilios<br> The Keucereus clan is currently battling the rulers of the Seeds. It will help you to know the current status of each Seed.<br> Which one do you want to know first?<br> -<a action="bypass -h npc_%objectId%_Chat 2">Seed of Destruction</a><br> -<a action="bypass -h npc_%objectId%_Chat 3">Seed of Infinity</a> +<a action="bypass -h Quest GeneralDilios SOD_STATE">Seed of Destruction</a><br> +<a action="bypass -h Quest GeneralDilios SOI_STATE">Seed of Infinity</a> </body></html> \ No newline at end of file diff --git a/src/main/resources/data/html/default/32632-1.htm b/src/main/resources/data/html/default/32632-1.htm deleted file mode 100644 index e421b50117..0000000000 --- a/src/main/resources/data/html/default/32632-1.htm +++ /dev/null @@ -1,5 +0,0 @@ -<html><body>Gracia Survivor:<br> -The current situation in Gracia?<br> -Right now, the Seed of Destruction is It's currently occupied by the enemy and our troops are attacking.<br> -The Seed of Infinity is It's currently occupied by the enemy and our troops are attacking. -</body></html> \ No newline at end of file diff --git a/src/main/resources/data/html/default/32632.htm b/src/main/resources/data/html/default/32632.htm index 7728f32f90..7e3b979b69 100644 --- a/src/main/resources/data/html/default/32632.htm +++ b/src/main/resources/data/html/default/32632.htm @@ -3,5 +3,5 @@ Do you know of the continent of Gracia? It is located far across the sea from Ad But now all has changed... Strange Seeds appeared throughout the continent, spawning <font color="LEVEL">Pagan Monsters</font> who wreaked havoc on the land. Although we fought under the command of King Keucereus, we were outmatched. Gracia fell under the sway of that great evil.<br> Fortunately, a few survivors were able to reach Aden and ask for help. There your clan leaders promised to send assistance. Since then, our soldiers have formed a combined force under the command of King Keucereus, waiting for our chance to exact vengeance on those who destroyed our homes. A few of my comrades stayed behind in Aden to appeal to other adventurers for help.<br> <a action="bypass -h npc_%objectId%_Quest Survivor">Ask how to help Gracia.</a><br> -<a action="bypass -h npc_%objectId%_Chat 1">Ask about the current situation in Gracia.</a> +<a action="bypass -h npc_%objectId%_Quest Survivor STATUS">Ask about the current situation in Gracia.</a> </body></html> \ No newline at end of file diff --git a/src/main/resources/data/instances/ChamblainsMountedTroop.xml b/src/main/resources/data/instances/ChamblainsMountedTroop.xml new file mode 100644 index 0000000000..127e97305d --- /dev/null +++ b/src/main/resources/data/instances/ChamblainsMountedTroop.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<instance name="Seed of Destruction (Chamblain's Mounted Troop)" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd"> + <activityTime val="20" /> + <allowSummon val="false" /> + <emptyDestroyTime val="10" /> + <exitPoint x="-248567" y="250117" z="4336" /> + <reenter additionStyle="ON_INSTANCE_FINISH"> + <reset day="Monday" hour="6" minute="30" /> + <reset day="Tuesday" hour="6" minute="30" /> + <reset day="Wednesday" hour="6" minute="30" /> + <reset day="Thursday" hour="6" minute="30" /> + <reset day="Friday" hour="6" minute="30" /> + <reset day="Saturday" hour="6" minute="30" /> + <reset day="Sunday" hour="6" minute="30" /> + </reenter> + <removeBuffs type="ALL" /> + <doorlist> + <door doorId="12240001" /> + <door doorId="12240002" /> + </doorlist> +</instance> diff --git a/src/main/resources/data/instances/GreatWarriorsMountedTroop.xml b/src/main/resources/data/instances/GreatWarriorsMountedTroop.xml new file mode 100644 index 0000000000..09333ba92d --- /dev/null +++ b/src/main/resources/data/instances/GreatWarriorsMountedTroop.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<instance name="Seed of Destruction (Great Warrior's Mounted Troop)" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd"> + <activityTime val="20" /> + <allowSummon val="false" /> + <emptyDestroyTime val="10" /> + <exitPoint x="-248567" y="250117" z="4336" /> + <reenter additionStyle="ON_INSTANCE_FINISH"> + <reset day="Monday" hour="6" minute="30" /> + <reset day="Tuesday" hour="6" minute="30" /> + <reset day="Wednesday" hour="6" minute="30" /> + <reset day="Thursday" hour="6" minute="30" /> + <reset day="Friday" hour="6" minute="30" /> + <reset day="Saturday" hour="6" minute="30" /> + <reset day="Sunday" hour="6" minute="30" /> + </reenter> + <removeBuffs type="ALL" /> + <doorlist> + <door doorId="12240001" /> + <door doorId="12240002" /> + </doorlist> +</instance> diff --git a/src/main/resources/data/instances/SoldiersMountedTroop.xml b/src/main/resources/data/instances/SoldiersMountedTroop.xml new file mode 100644 index 0000000000..8df30911fc --- /dev/null +++ b/src/main/resources/data/instances/SoldiersMountedTroop.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<instance name="Seed of Destruction (Soldier's Mounted Troop)" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd"> + <activityTime val="20" /> + <allowSummon val="false" /> + <emptyDestroyTime val="10" /> + <exitPoint x="-248567" y="250117" z="4336" /> + <reenter additionStyle="ON_INSTANCE_FINISH"> + <reset day="Monday" hour="6" minute="30" /> + <reset day="Tuesday" hour="6" minute="30" /> + <reset day="Wednesday" hour="6" minute="30" /> + <reset day="Thursday" hour="6" minute="30" /> + <reset day="Friday" hour="6" minute="30" /> + <reset day="Saturday" hour="6" minute="30" /> + <reset day="Sunday" hour="6" minute="30" /> + </reenter> + <removeBuffs type="ALL" /> + <doorlist> + <door doorId="12240001" /> + <door doorId="12240002" /> + </doorlist> +</instance> diff --git a/src/main/resources/data/instances/WarriorsMountedTroop.xml b/src/main/resources/data/instances/WarriorsMountedTroop.xml new file mode 100644 index 0000000000..810d9bd948 --- /dev/null +++ b/src/main/resources/data/instances/WarriorsMountedTroop.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<instance name="Seed of Destruction (Warrior's Mounted Troop)" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd"> + <activityTime val="20" /> + <allowSummon val="false" /> + <emptyDestroyTime val="10" /> + <exitPoint x="-248567" y="250117" z="4336" /> + <reenter additionStyle="ON_INSTANCE_FINISH"> + <reset day="Monday" hour="6" minute="30" /> + <reset day="Tuesday" hour="6" minute="30" /> + <reset day="Wednesday" hour="6" minute="30" /> + <reset day="Thursday" hour="6" minute="30" /> + <reset day="Friday" hour="6" minute="30" /> + <reset day="Saturday" hour="6" minute="30" /> + <reset day="Sunday" hour="6" minute="30" /> + </reenter> + <removeBuffs type="ALL" /> + <doorlist> + <door doorId="12240001" /> + <door doorId="12240002" /> + </doorlist> +</instance> diff --git a/src/main/resources/data/spawnZones/gracia_energy_seeds.xml b/src/main/resources/data/spawnZones/gracia_energy_seeds.xml new file mode 100644 index 0000000000..a3074621f4 --- /dev/null +++ b/src/main/resources/data/spawnZones/gracia_energy_seeds.xml @@ -0,0 +1,1776 @@ +<?xml version="1.0" encoding="UTF-8"?> +<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/spawnZones.xsd"> + <spawnZones> + <!-- Seed of Destructon Zones --> + <zone id="101" minZ="-12426" maxZ="-12226"> + <point x="-242621" y="217288" /> + <point x="-242610" y="218916" /> + <point x="-242522" y="219010" /> + <point x="-241449" y="219006" /> + <point x="-241342" y="218886" /> + <point x="-241344" y="217290" /> + <point x="-241438" y="217179" /> + <point x="-242520" y="217185" /> + </zone> + <zone id="102" minZ="-12417" maxZ="-12217"> + <point x="-240207" y="217286" /> + <point x="-240194" y="218908" /> + <point x="-240286" y="219009" /> + <point x="-240788" y="219010" /> + <point x="-240882" y="218909" /> + <point x="-240889" y="217315" /> + <point x="-240778" y="217187" /> + <point x="-240300" y="217186" /> + </zone> + <zone id="103" minZ="-12676" maxZ="-12476"> + <point x="-239622" y="216216" /> + <point x="-239593" y="217191" /> + <point x="-239466" y="217305" /> + <point x="-237955" y="217295" /> + <point x="-237849" y="217192" /> + <point x="-237863" y="216189" /> + <point x="-237933" y="216097" /> + <point x="-239505" y="216094" /> + </zone> + <zone id="104" minZ="-12679" maxZ="-12479"> + <point x="-237824" y="215035" /> + <point x="-237817" y="215506" /> + <point x="-237911" y="215595" /> + <point x="-239522" y="215604" /> + <point x="-239609" y="215503" /> + <point x="-239613" y="215032" /> + <point x="-239520" y="214937" /> + <point x="-237927" y="214940" /> + </zone> + <zone id="105" minZ="-12810" maxZ="-12610"> + <point x="-239636" y="212608" /> + <point x="-239606" y="213583" /> + <point x="-239479" y="213697" /> + <point x="-237968" y="213687" /> + <point x="-237862" y="213584" /> + <point x="-237876" y="212581" /> + <point x="-237947" y="212489" /> + <point x="-239519" y="212486" /> + </zone> + <zone id="106" minZ="-12813" maxZ="-12613"> + <point x="-237837" y="211427" /> + <point x="-237831" y="211898" /> + <point x="-237924" y="211987" /> + <point x="-239535" y="211996" /> + <point x="-239622" y="211895" /> + <point x="-239626" y="211424" /> + <point x="-239534" y="211329" /> + <point x="-237940" y="211332" /> + </zone> + <zone id="107" minZ="-12559" maxZ="-12359"> + <point x="-243691" y="213504" /> + <point x="-243661" y="214480" /> + <point x="-243534" y="214593" /> + <point x="-242024" y="214583" /> + <point x="-241917" y="214480" /> + <point x="-241932" y="213477" /> + <point x="-242002" y="213386" /> + <point x="-243574" y="213382" /> + </zone> + <zone id="108" minZ="-12562" maxZ="-12362"> + <point x="-241892" y="212324" /> + <point x="-241886" y="212794" /> + <point x="-241980" y="212883" /> + <point x="-243590" y="212892" /> + <point x="-243678" y="212792" /> + <point x="-243681" y="212320" /> + <point x="-243589" y="212225" /> + <point x="-241996" y="212228" /> + </zone> + <zone id="109" minZ="-12681" maxZ="-12481"> + <point x="-243715" y="209886" /> + <point x="-243685" y="210861" /> + <point x="-243558" y="210975" /> + <point x="-242048" y="210965" /> + <point x="-241941" y="210861" /> + <point x="-241956" y="209859" /> + <point x="-242026" y="209767" /> + <point x="-243598" y="209764" /> + </zone> + <zone id="110" minZ="-12684" maxZ="-12484"> + <point x="-241916" y="208705" /> + <point x="-241910" y="209176" /> + <point x="-242004" y="209264" /> + <point x="-243614" y="209273" /> + <point x="-243702" y="209173" /> + <point x="-243706" y="208702" /> + <point x="-243613" y="208607" /> + <point x="-242020" y="208610" /> + </zone> + <zone id="111" minZ="-12930" maxZ="-12730"> + <point x="-241343" y="207015" /> + <point x="-241332" y="208643" /> + <point x="-241243" y="208737" /> + <point x="-240171" y="208733" /> + <point x="-240063" y="208613" /> + <point x="-240066" y="207017" /> + <point x="-240159" y="206906" /> + <point x="-241242" y="206912" /> + </zone> + <zone id="112" minZ="-12921" maxZ="-12721"> + <point x="-238929" y="207013" /> + <point x="-238916" y="208635" /> + <point x="-239007" y="208736" /> + <point x="-239509" y="208737" /> + <point x="-239604" y="208636" /> + <point x="-239610" y="207042" /> + <point x="-239500" y="206914" /> + <point x="-239021" y="206913" /> + </zone> + <zone id="113" minZ="-12420" maxZ="-12220"> + <point x="-246780" y="212112" /> + <point x="-246751" y="213088" /> + <point x="-246623" y="213201" /> + <point x="-245113" y="213191" /> + <point x="-245007" y="213088" /> + <point x="-245021" y="212085" /> + <point x="-245091" y="211994" /> + <point x="-246663" y="211990" /> + </zone> + <zone id="114" minZ="-12423" maxZ="-12223"> + <point x="-244981" y="210932" /> + <point x="-244975" y="211402" /> + <point x="-245069" y="211491" /> + <point x="-246679" y="211500" /> + <point x="-246767" y="211400" /> + <point x="-246771" y="210928" /> + <point x="-246678" y="210833" /> + <point x="-245085" y="210836" /> + </zone> + <zone id="115" minZ="-12562" maxZ="-12362"> + <point x="-246789" y="208504" /> + <point x="-246760" y="209480" /> + <point x="-246632" y="209593" /> + <point x="-245122" y="209583" /> + <point x="-245016" y="209480" /> + <point x="-245030" y="208477" /> + <point x="-245100" y="208386" /> + <point x="-246672" y="208382" /> + </zone> + <zone id="116" minZ="-12565" maxZ="-12365"> + <point x="-244990" y="207324" /> + <point x="-244984" y="207794" /> + <point x="-245078" y="207883" /> + <point x="-246688" y="207892" /> + <point x="-246776" y="207792" /> + <point x="-246780" y="207320" /> + <point x="-246687" y="207225" /> + <point x="-245094" y="207228" /> + </zone> + <zone id="117" minZ="-12807" maxZ="-12607"> + <point x="-244430" y="205650" /> + <point x="-244419" y="207278" /> + <point x="-244331" y="207371" /> + <point x="-243259" y="207368" /> + <point x="-243151" y="207247" /> + <point x="-243154" y="205652" /> + <point x="-243247" y="205541" /> + <point x="-244329" y="205547" /> + </zone> + <zone id="118" minZ="-12798" maxZ="-12598"> + <point x="-242017" y="205648" /> + <point x="-242004" y="207270" /> + <point x="-242095" y="207370" /> + <point x="-242597" y="207372" /> + <point x="-242691" y="207271" /> + <point x="-242698" y="205677" /> + <point x="-242588" y="205549" /> + <point x="-242109" y="205548" /> + </zone> + <zone id="119" minZ="-12484" maxZ="-12284"> + <point x="-249545" y="219269" /> + <point x="-249534" y="220897" /> + <point x="-249445" y="220991" /> + <point x="-248373" y="220987" /> + <point x="-248265" y="220867" /> + <point x="-248268" y="219271" /> + <point x="-248362" y="219160" /> + <point x="-249444" y="219166" /> + </zone> + <zone id="120" minZ="-12492" maxZ="-12292"> + <point x="-250008" y="219250" /> + <point x="-249995" y="220872" /> + <point x="-250086" y="220973" /> + <point x="-250588" y="220975" /> + <point x="-250682" y="220874" /> + <point x="-250689" y="219280" /> + <point x="-250579" y="219152" /> + <point x="-250100" y="219150" /> + </zone> + <zone id="121" minZ="-12335" maxZ="-11935"> + <point x="-253210" y="217086" /> + <point x="-249653" y="217077" /> + <point x="-249648" y="217678" /> + <point x="-253196" y="217670" /> + </zone> + <zone id="122" minZ="-12299" maxZ="-11899"> + <point x="-253202" y="216420" /> + <point x="-252605" y="216424" /> + <point x="-252600" y="216738" /> + <point x="-253206" y="216737" /> + </zone> + <zone id="123" minZ="-12292" maxZ="-11892"> + <point x="-251806" y="216452" /> + <point x="-251102" y="216450" /> + <point x="-251106" y="216773" /> + <point x="-251804" y="216777" /> + </zone> + <zone id="124" minZ="-12290" maxZ="-11890"> + <point x="-250381" y="216459" /> + <point x="-249677" y="216457" /> + <point x="-249681" y="216780" /> + <point x="-250379" y="216784" /> + </zone> + <zone id="125" minZ="-12261" maxZ="-11861"> + <point x="-251798" y="215642" /> + <point x="-251094" y="215639" /> + <point x="-251098" y="215962" /> + <point x="-251796" y="215967" /> + </zone> + <zone id="126" minZ="-12273" maxZ="-11873"> + <point x="-253177" y="215692" /> + <point x="-252538" y="215689" /> + <point x="-252542" y="216012" /> + <point x="-253187" y="216013" /> + </zone> + <zone id="127" minZ="-12274" maxZ="-11874"> + <point x="-250334" y="215701" /> + <point x="-249676" y="215698" /> + <point x="-249680" y="216021" /> + <point x="-250333" y="216025" /> + </zone> + <!-- Seed of Infinity Zones --> + <zone id="201" minZ="-15550" maxZ="-15450"> + <point x="-178819" y="212427" /> + <point x="-178819" y="213212" /> + <point x="-179185" y="213605" /> + <point x="-179921" y="213603" /> + <point x="-180314" y="213217" /> + <point x="-180314" y="212433" /> + <point x="-179902" y="212045" /> + <point x="-179242" y="212043" /> + </zone> + <zone id="202" minZ="-15550" maxZ="-15450"> + <point x="-176050" y="210757" /> + <point x="-175888" y="211267" /> + <point x="-176229" y="211880" /> + <point x="-176744" y="212007" /> + <point x="-177459" y="211628" /> + <point x="-177526" y="210986" /> + <point x="-177313" y="210618" /> + <point x="-176688" y="210363" /> + </zone> + <zone id="203" minZ="-15550" maxZ="-15450"> + <point x="-176272" y="207222" /> + <point x="-175898" y="207841" /> + <point x="-176051" y="208386" /> + <point x="-176710" y="208789" /> + <point x="-177223" y="208666" /> + <point x="-177608" y="208000" /> + <point x="-177459" y="207499" /> + <point x="-176775" y="207113" /> + </zone> + <zone id="204" minZ="-15550" maxZ="-15450"> + <point x="-178813" y="205936" /> + <point x="-178815" y="206690" /> + <point x="-179158" y="207104" /> + <point x="-179952" y="207105" /> + <point x="-180269" y="206683" /> + <point x="-180268" y="205935" /> + <point x="-179858" y="205503" /> + <point x="-179222" y="205503" /> + </zone> + <zone id="205" minZ="-15550" maxZ="-15450"> + <point x="-181657" y="207504" /> + <point x="-181487" y="208000" /> + <point x="-181884" y="208679" /> + <point x="-182408" y="208791" /> + <point x="-183050" y="208360" /> + <point x="-183201" y="207811" /> + <point x="-182867" y="207245" /> + <point x="-182348" y="207127" /> + </zone> + <zone id="206" minZ="-15550" maxZ="-15450"> + <point x="-181883" y="210474" /> + <point x="-181501" y="211134" /> + <point x="-181652" y="211614" /> + <point x="-182342" y="212017" /> + <point x="-182916" y="211866" /> + <point x="-183220" y="211319" /> + <point x="-183071" y="210741" /> + <point x="-182383" y="210365" /> + </zone> + <zone id="207" minZ="-12860" maxZ="-12660"> + <point x="-179918" y="210722" /> + <point x="-179395" y="210725" /> + <point x="-179461" y="211363" /> + <point x="-179852" y="211363" /> + </zone> + <zone id="208" minZ="-12112" maxZ="-11912"> + <point x="-179062" y="211047" /> + <point x="-177776" y="211044" /> + <point x="-177780" y="212297" /> + <point x="-179066" y="212290" /> + </zone> + <zone id="209" minZ="-12132" maxZ="-11932"> + <point x="-179055" y="205880" /> + <point x="-177787" y="205878" /> + <point x="-177770" y="207195" /> + <point x="-179060" y="207178" /> + </zone> + <zone id="210" minZ="-12108" maxZ="-11908"> + <point x="-181555" y="205901" /> + <point x="-180256" y="205901" /> + <point x="-180210" y="207176" /> + <point x="-181550" y="207196" /> + </zone> + <zone id="211" minZ="-12116" maxZ="-11916"> + <point x="-181552" y="211012" /> + <point x="-180262" y="211012" /> + <point x="-180259" y="212302" /> + <point x="-181606" y="212286" /> + </zone> + <zone id="212" minZ="-12027" maxZ="-11827"> + <point x="-176304" y="209293" /> + <point x="-175395" y="209697" /> + <point x="-175860" y="210713" /> + <point x="-176708" y="210363" /> + </zone> + <zone id="213" minZ="-12027" maxZ="-11827"> + <point x="-176659" y="207801" /> + <point x="-175812" y="207513" /> + <point x="-175401" y="208597" /> + <point x="-176314" y="208925" /> + </zone> + <zone id="214" minZ="-12017" maxZ="-11817"> + <point x="-183475" y="207498" /> + <point x="-182689" y="207732" /> + <point x="-183094" y="208941" /> + <point x="-183930" y="208568" /> + </zone> + <zone id="215" minZ="-12029" maxZ="-11829"> + <point x="-183868" y="209471" /> + <point x="-182962" y="209286" /> + <point x="-182662" y="210431" /> + <point x="-183661" y="210627" /> + </zone> + <zone id="216" minZ="-9571" maxZ="-9371"> + <point x="-186593" y="207997" /> + <point x="-186045" y="207997" /> + <point x="-186045" y="208585" /> + <point x="-186593" y="208585" /> + </zone> + <zone id="217" minZ="-9576" maxZ="-9376"> + <point x="-184757" y="210866" /> + <point x="-184209" y="210866" /> + <point x="-184209" y="211454" /> + <point x="-184757" y="211454" /> + </zone> + <zone id="218" minZ="-9581" maxZ="-9381"> + <point x="-183070" y="213607" /> + <point x="-182522" y="213607" /> + <point x="-182522" y="214195" /> + <point x="-183070" y="214195" /> + </zone> + <zone id="219" minZ="-9568" maxZ="-9368"> + <point x="-181201" y="216483" /> + <point x="-180653" y="216483" /> + <point x="-180653" y="217071" /> + <point x="-181201" y="217071" /> + </zone> + <zone id="220" minZ="-9593" maxZ="-9393"> + <point x="-177507" y="217560" /> + <point x="-176959" y="217560" /> + <point x="-176959" y="218148" /> + <point x="-177507" y="218148" /> + </zone> + <zone id="221" minZ="-9603" maxZ="-9403"> + <point x="-173956" y="217823" /> + <point x="-173408" y="217823" /> + <point x="-173408" y="218411" /> + <point x="-173956" y="218411" /> + </zone> + <zone id="222" minZ="-9576" maxZ="-9376"> + <point x="-187842" y="205628" /> + <point x="-187642" y="205628" /> + <point x="-187642" y="205828" /> + <point x="-187842" y="205828" /> + </zone> + <!-- Seed of Annihilation (Bistakon) Zones --> + <zone id="301" minZ="-10206" maxZ="-10106"> + <point x="-175973" y="175888" /> + <point x="-173914" y="178503" /> + <point x="-174611" y="180178" /> + <point x="-177411" y="178025" /> + </zone> + <zone id="302" minZ="-10384" maxZ="-10284"> + <point x="-177730" y="181924" /> + <point x="-177013" y="181814" /> + <point x="-177984" y="183704" /> + <point x="-178685" y="183490" /> + </zone> + <zone id="303" minZ="-10277" maxZ="-10177"> + <point x="-179701" y="179488" /> + <point x="-178826" y="179254" /> + <point x="-177566" y="180107" /> + <point x="-178755" y="180665" /> + </zone> + <zone id="304" minZ="-10324" maxZ="-10224"> + <point x="-181691" y="178956" /> + <point x="-180038" y="179797" /> + <point x="-180437" y="180732" /> + <point x="-182747" y="180311" /> + </zone> + <zone id="305" minZ="-10033" maxZ="-9933"> + <point x="-184058" y="175634" /> + <point x="-183283" y="176075" /> + <point x="-183586" y="177200" /> + <point x="-184713" y="176600" /> + </zone> + <zone id="306" minZ="-10181" maxZ="-10081"> + <point x="-185748" y="177557" /> + <point x="-183769" y="177854" /> + <point x="-184627" y="179609" /> + <point x="-185514" y="179832" /> + </zone> + <zone id="307" minZ="-10264" maxZ="-10164"> + <point x="-184399" y="180447" /> + <point x="-183585" y="180316" /> + <point x="-183587" y="181077" /> + <point x="-184776" y="181082" /> + </zone> + <zone id="308" minZ="-10270" maxZ="-10170"> + <point x="-185601" y="181552" /> + <point x="-184563" y="181249" /> + <point x="-184480" y="182239" /> + <point x="-185572" y="182199" /> + </zone> + <zone id="309" minZ="-10330" maxZ="-10230"> + <point x="-184640" y="182699" /> + <point x="-182220" y="182659" /> + <point x="-182557" y="183832" /> + <point x="-184640" y="183792" /> + </zone> + <!-- Seed of Annihilation (Reptilikon) Zones --> + <zone id="401" minZ="-15706" maxZ="-15556"> + <point x="-177113" y="177217" /> + <point x="-175895" y="177181" /> + <point x="-174867" y="178636" /> + <point x="-177610" y="178574" /> + </zone> + <zone id="402" minZ="-15581" maxZ="-15431"> + <point x="-176920" y="179012" /> + <point x="-174726" y="179041" /> + <point x="-174387" y="180717" /> + <point x="-175828" y="180830" /> + </zone> + <zone id="403" minZ="-15546" maxZ="-15396"> + <point x="-176505" y="181256" /> + <point x="-174350" y="181229" /> + <point x="-173952" y="182908" /> + <point x="-176670" y="182761" /> + </zone> + <zone id="404" minZ="-15029" maxZ="-14879"> + <point x="-181027" y="176943" /> + <point x="-179948" y="176929" /> + <point x="-179885" y="178941" /> + <point x="-181711" y="179087" /> + </zone> + <zone id="405" minZ="-15061" maxZ="-14911"> + <point x="-182518" y="180112" /> + <point x="-179880" y="180143" /> + <point x="-180026" y="180917" /> + <point x="-182346" y="181268" /> + </zone> + <zone id="406" minZ="-15279" maxZ="-15129"> + <point x="-185765" y="175812" /> + <point x="-184264" y="175350" /> + <point x="-183475" y="177392" /> + <point x="-186212" y="177297" /> + </zone> + <zone id="407" minZ="-15403" maxZ="-15253"> + <point x="-186631" y="177796" /> + <point x="-184134" y="178765" /> + <point x="-184319" y="179935" /> + <point x="-186832" y="179761" /> + </zone> + <zone id="408" minZ="-15461" maxZ="-15311"> + <point x="-187038" y="180215" /> + <point x="-184047" y="180498" /> + <point x="-184514" y="181888" /> + <point x="-186720" y="182214" /> + </zone> + <zone id="409" minZ="-15640" maxZ="-15490"> + <point x="-186832" y="182488" /> + <point x="-183943" y="182514" /> + <point x="-183865" y="183199" /> + <point x="-186664" y="183768" /> + </zone> + <zone id="410" minZ="-15646" maxZ="-15496"> + <point x="-186714" y="184055" /> + <point x="-184960" y="183748" /> + <point x="-184527" y="185180" /> + <point x="-186182" y="185580" /> + </zone> + <zone id="411" minZ="-15678" maxZ="-15528"> + <point x="-186264" y="185820" /> + <point x="-184242" y="185370" /> + <point x="-183717" y="186786" /> + <point x="-185213" y="187396" /> + </zone> + <!-- Seed of Annihilation (Kokracon) Zones --> + <zone id="501" minZ="-12640" maxZ="-12420"> + <point x="-220263" y="179629" /> + <point x="-218588" y="179648" /> + <point x="-218544" y="181215" /> + <point x="-220322" y="181178" /> + </zone> + <zone id="502" minZ="-12655" maxZ="-12455"> + <point x="-220287" y="175583" /> + <point x="-219698" y="175587" /> + <point x="-219679" y="178289" /> + <point x="-220330" y="178317" /> + </zone> + <zone id="503" minZ="-11386" maxZ="-11186"> + <point x="-220236" y="174141" /> + <point x="-218438" y="174141" /> + <point x="-218438" y="175910" /> + <point x="-220236" y="175910" /> + </zone> + <zone id="504" minZ="-11388" maxZ="-11188"> + <point x="-219449" y="177087" /> + <point x="-218569" y="176796" /> + <point x="-218545" y="180133" /> + <point x="-219176" y="180037" /> + </zone> + <zone id="505" minZ="-11391" maxZ="-11191"> + <point x="-219428" y="180568" /> + <point x="-218438" y="180403" /> + <point x="-218541" y="181052" /> + <point x="-220262" y="181002" /> + <point x="-220250" y="178145" /> + <point x="-219711" y="178123" /> + </zone> + <zone id="506" minZ="-11386" maxZ="-11186"> + <point x="-220195" y="182250" /> + <point x="-218482" y="182250" /> + <point x="-218482" y="183979" /> + <point x="-220195" y="183979" /> + </zone> + <zone id="507" minZ="-11388" maxZ="-11188"> + <point x="-219044" y="185807" /> + <point x="-217143" y="185755" /> + <point x="-217074" y="186374" /> + <point x="-218990" y="186589" /> + </zone> + <zone id="508" minZ="-11757" maxZ="-11557"> + <point x="-211990" y="181199" /> + <point x="-210835" y="180067" /> + <point x="-210216" y="180872" /> + <point x="-211863" y="181387" /> + </zone> + <zone id="509" minZ="-11064" maxZ="-10864"> + <point x="-215475" y="182310" /> + <point x="-214460" y="182073" /> + <point x="-214327" y="182676" /> + <point x="-215388" y="182686" /> + </zone> + <zone id="510" minZ="-11408" maxZ="-11208"> + <point x="-208840" y="182880" /> + <point x="-207193" y="182880" /> + <point x="-207196" y="184487" /> + <point x="-208843" y="184487" /> + </zone> + <zone id="511" minZ="-11387" maxZ="-11187"> + <point x="-206617" y="177644" /> + <point x="-205975" y="177644" /> + <point x="-205975" y="180111" /> + <point x="-206617" y="180053" /> + </zone> + <zone id="512" minZ="-12645" maxZ="-12425"> + <point x="-220202" y="182247" /> + <point x="-218505" y="182237" /> + <point x="-218484" y="183833" /> + <point x="-220261" y="183795" /> + </zone> + <zone id="513" minZ="-11419" maxZ="-11219"> + <point x="-207614" y="179028" /> + <point x="-206972" y="179028" /> + <point x="-206972" y="181495" /> + <point x="-207614" y="181437" /> + </zone> + <zone id="514" minZ="-11385" maxZ="-11185"> + <point x="-207534" y="174402" /> + <point x="-205881" y="174402" /> + <point x="-205881" y="176234" /> + <point x="-207534" y="176234" /> + </zone> + <zone id="515" minZ="-12705" maxZ="-12505"> + <point x="-207387" y="180196" /> + <point x="-205625" y="180196" /> + <point x="-205625" y="181913" /> + <point x="-207387" y="181913" /> + </zone> + <zone id="516" minZ="-12745" maxZ="-12545"> + <point x="-207414" y="174952" /> + <point x="-205652" y="174952" /> + <point x="-205652" y="176669" /> + <point x="-207414" y="176669" /> + </zone> + <zone id="517" minZ="-12718" maxZ="-12518"> + <point x="-207410" y="177780" /> + <point x="-205648" y="177780" /> + <point x="-205648" y="179497" /> + <point x="-207410" y="179497" /> + </zone> + <zone id="518" minZ="-12780" maxZ="-12580"> + <point x="-214218" y="178477" /> + <point x="-212673" y="179060" /> + <point x="-212983" y="179508" /> + <point x="-214357" y="179479" /> + </zone> + <zone id="519" minZ="-12634" maxZ="-12434"> + <point x="-219201" y="174239" /> + <point x="-218582" y="174243" /> + <point x="-218563" y="177514" /> + <point x="-219244" y="177542" /> + </zone> + <zone id="520" minZ="-12643" maxZ="-12443"> + <point x="-219237" y="177774" /> + <point x="-218445" y="177752" /> + <point x="-218420" y="178540" /> + <point x="-219242" y="178525" /> + </zone> + </spawnZones> + <npc> + <!-- Seed of Destructon Spawns --> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="101" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="101" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="101" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="102" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="102" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="102" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="103" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="103" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="103" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="104" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="104" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="104" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="105" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="105" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="105" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="106" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="106" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="106" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="107" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="107" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="107" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="108" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="108" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="108" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="109" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="109" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="109" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="110" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="110" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="110" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="111" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="111" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="111" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="112" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="112" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="112" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="113" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="113" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="113" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="114" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="114" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="114" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="115" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="115" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="115" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="116" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="116" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="116" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="117" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="117" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="117" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="118" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="118" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="118" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="119" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="119" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="119" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="120" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="120" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="120" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="121" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="121" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="121" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="122" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="122" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="122" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="123" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="123" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="123" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="124" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="124" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="124" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="125" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="125" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="125" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="126" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="126" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="126" count="1" /> + </spawn> + <spawn npcId="18678" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <spawn npcId="18679" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <spawn npcId="18680" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <spawn npcId="18681" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <spawn npcId="18682" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <spawn npcId="18683" flag="1" respawnDelay="15" respawnRandom="30"> + <zone id="127" count="1" /> + </spawn> + <!-- Seed of Infinity Spawns --> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="201" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="201" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="202" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="202" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="203" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="203" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="204" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="204" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="205" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="205" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="206" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="70" respawnRandom="20"> + <zone id="206" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="207" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="207" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="207" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="207" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="208" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="208" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="208" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="208" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="209" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="209" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="209" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="209" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="210" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="210" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="210" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="210" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="211" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="211" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="211" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="211" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="212" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="212" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="212" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="212" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="213" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="213" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="213" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="213" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="214" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="214" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="214" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="214" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="215" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="215" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="215" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="60" respawnRandom="20"> + <zone id="215" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="216" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="217" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="218" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="219" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="220" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="221" count="1" /> + </spawn> + <spawn npcId="18682" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <spawn npcId="18683" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <spawn npcId="18678" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <spawn npcId="18679" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <spawn npcId="18680" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <spawn npcId="18681" flag="2" respawnDelay="50" respawnRandom="20"> + <zone id="222" count="1" /> + </spawn> + <!-- Seed of Annihilation (Bistakon) Spawns --> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="301" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="302" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="303" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="304" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="305" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="306" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="307" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="308" count="1" /> + </spawn> + <spawn npcId="18678" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <spawn npcId="18679" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <spawn npcId="18680" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <spawn npcId="18681" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <spawn npcId="18682" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <spawn npcId="18683" flag="3" respawnDelay="90" respawnRandom="15"> + <zone id="309" count="1" /> + </spawn> + <!-- Seed of Annihilation (Reptilikon) Spawns --> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="401" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="402" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="403" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="404" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="405" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="406" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="407" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="408" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="409" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="410" count="1" /> + </spawn> + <spawn npcId="18678" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <spawn npcId="18679" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <spawn npcId="18680" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <spawn npcId="18681" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <spawn npcId="18682" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <spawn npcId="18683" flag="4" respawnDelay="90" respawnRandom="15"> + <zone id="411" count="1" /> + </spawn> + <!-- Seed of Annihilation (Kokracon) Spawns --> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="501" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="501" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="501" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="501" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="502" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="502" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="502" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="502" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="503" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="503" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="503" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="503" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="504" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="504" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="504" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="504" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="505" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="505" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="505" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="505" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="506" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="506" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="506" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="506" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="507" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="507" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="507" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="507" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="508" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="508" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="508" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="508" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="509" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="509" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="510" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="510" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="510" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="510" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="511" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="511" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="511" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="511" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="512" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="512" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="512" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="512" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="513" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="513" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="513" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="513" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="514" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="514" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="514" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="514" count="1" /> + </spawn> + <spawn npcId="18680" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="515" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="515" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="515" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="515" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="516" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="516" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="516" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="516" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="517" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="517" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="517" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="517" count="1" /> + </spawn> + <spawn npcId="18678" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="518" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="518" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="518" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="518" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="518" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="519" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="519" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="519" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="519" count="1" /> + </spawn> + <spawn npcId="18679" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="520" count="1" /> + </spawn> + <spawn npcId="18681" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="520" count="1" /> + </spawn> + <spawn npcId="18682" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="520" count="1" /> + </spawn> + <spawn npcId="18683" flag="5" respawnDelay="90" respawnRandom="15"> + <zone id="520" count="1" /> + </spawn> + </npc> +</list> \ No newline at end of file diff --git a/src/main/resources/data/stats/npcs/18700-18799.xml b/src/main/resources/data/stats/npcs/18700-18799.xml index 34c0dadcb0..fa8bc7b3cb 100644 --- a/src/main/resources/data/stats/npcs/18700-18799.xml +++ b/src/main/resources/data/stats/npcs/18700-18799.xml @@ -70,7 +70,7 @@ <height normal="10" /> </collision> </npc> - <npc id="18702" level="80" type="L2Npc" name="Dimension Moving Device"> + <npc id="18702" level="80" type="L2Monster" name="Dimension Moving Device"> <!-- Confirmed CT2.5 --> <race>CONSTRUCT</race> <sex>FEMALE</sex> @@ -3073,7 +3073,7 @@ <height normal="10" /> </collision> </npc> - <npc id="18775" level="81" type="L2Npc" name="Seed of Destruction Control Device"> + <npc id="18775" level="81" type="L2Guard" name="Seed of Destruction Control Device"> <!-- Confirmed CT2.5 --> <race>CONSTRUCT</race> <sex>FEMALE</sex> @@ -3436,7 +3436,7 @@ </skillList> <exCrtEffect>true</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="BALANCED" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3491,7 +3491,7 @@ </skillList> <exCrtEffect>true</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="BALANCED" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3546,7 +3546,7 @@ </skillList> <exCrtEffect>false</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="BALANCED" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3601,7 +3601,7 @@ </skillList> <exCrtEffect>false</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="BALANCED" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3657,7 +3657,7 @@ </skillList> <exCrtEffect>true</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="MAGE" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3713,7 +3713,7 @@ </skillList> <exCrtEffect>false</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="MAGE" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3770,7 +3770,7 @@ </skillList> <exCrtEffect>false</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="MAGE" aggroRange="450" clanHelpRange="1000"> <clanList> <clan>DES_DRAGON</clan> </clanList> @@ -3823,7 +3823,7 @@ </skillList> <exCrtEffect>false</exCrtEffect> <sNpcPropHpRate>0.5</sNpcPropHpRate> - <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> + <ai type="HEALER" aggroRange="450" clanHelpRange="1000" isAggressive="false"> <clanList> <clan>DES_DRAGON</clan> </clanList> diff --git a/src/main/resources/data/stats/npcs/29100-29199.xml b/src/main/resources/data/stats/npcs/29100-29199.xml index 536970659c..c6b19eff6c 100644 --- a/src/main/resources/data/stats/npcs/29100-29199.xml +++ b/src/main/resources/data/stats/npcs/29100-29199.xml @@ -3372,6 +3372,11 @@ <skill id="4416" level="10" /> <!--Dragons --> <skill id="5462" level="1" /> <!--Fire Attacks --> <skill id="6127" level="1" /> <!--Anti-limit --> + <skill id="5839" level="1" /> <!--Breath --> + <skill id="5840" level="1" /> <!--Fire Breath --> + <skill id="5841" level="1" /> <!--Multi Defense --> + <skill id="5842" level="1" /> <!--Spinning Slasher --> + <skill id="5843" level="1" /> <!--Terror --> </skillList> <exCrtEffect>true</exCrtEffect> <ai type="BALANCED" aggroRange="450" clanHelpRange="1000" isAggressive="false"> diff --git a/src/main/resources/data/stats/skills/05900-05999.xml b/src/main/resources/data/stats/skills/05900-05999.xml index 05c4fbe9d9..2de77d1325 100644 --- a/src/main/resources/data/stats/skills/05900-05999.xml +++ b/src/main/resources/data/stats/skills/05900-05999.xml @@ -877,10 +877,10 @@ <set name="targetType" val="SELF" /> <effects> <effect name="BlockDamage"> - <param block="HP"/> + <param block="HP" /> </effect> <effect name="BlockDamage"> - <param block="MP"/> + <param block="MP" /> </effect> <effect name="BlockDebuff" /> <effect name="Buff"> diff --git a/src/main/resources/data/xsd/spawnZones.xsd b/src/main/resources/data/xsd/spawnZones.xsd index b958f1cd93..8d96d52430 100644 --- a/src/main/resources/data/xsd/spawnZones.xsd +++ b/src/main/resources/data/xsd/spawnZones.xsd @@ -56,6 +56,8 @@ </xs:restriction> </xs:simpleType> </xs:attribute> + <xs:attribute name="respawnDelay" type="xs:nonNegativeInteger" /> + <xs:attribute name="respawnRandom" type="xs:nonNegativeInteger" /> </xs:complexType> </xs:element> </xs:sequence> -- GitLab