diff --git a/L2J_DataPack_BETA/dist/game/data/instances/IceQueensCastleNormalBattle.xml b/L2J_DataPack_BETA/dist/game/data/instances/IceQueensCastleNormalBattle.xml new file mode 100644 index 0000000000000000000000000000000000000000..982c1c7da29103678228f32fa7cbe1608107f6cf --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/instances/IceQueensCastleNormalBattle.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<instance name="Ice Queen's Castle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd"> + <activityTime val="120" /> + <allowSummon val="false" /> + <emptyDestroyTime val="600" /> + <spawnPoint spawnX="115717" spawnY="-125734" spawnZ="-3392" /> + <doorlist> + <door doorId="23140101" /> + </doorlist> + <spawnlist> + <group name="general"> + <!-- Sirra --> + <spawn npcId="32762" x="114766" y="-113141" z="-11200" heading="15956" respawn="0" /> + </group> + </spawnlist> +</instance> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts.cfg b/L2J_DataPack_BETA/dist/game/data/scripts.cfg index 45714f03494e7544855f8efce6a214496a50c555..5294980515f28a99e0243860b09f4ee35f5cf02b 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts.cfg +++ b/L2J_DataPack_BETA/dist/game/data/scripts.cfg @@ -45,6 +45,7 @@ ai/npc/PriestOfBlessing/PriestOfBlessing.java ai/npc/Rignos/Rignos.java ai/npc/Rafforty/Rafforty.java ai/npc/Seyo/Seyo.java +ai/npc/Sirra/Sirra.java ai/npc/SubclassCertification/SubclassCertification.java ai/npc/Summons/MerchantGolem/GolemTrader.java ai/npc/SupportUnitCaptain/SupportUnitCaptain.java @@ -196,6 +197,7 @@ instances/FinalEmperialTomb/FinalEmperialTomb.java instances/HellboundTown/HellboundTown.java instances/HideoutOfTheDawn/HideoutOfTheDawn.java instances/IceQueensCastle/IceQueensCastle.java +instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java instances/JiniaGuildHideout1/JiniaGuildHideout1.java instances/JiniaGuildHideout2/JiniaGuildHideout2.java instances/JiniaGuildHideout3/JiniaGuildHideout3.java diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-06.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-06.html index 0407cb0bf94ed98070ab74c4a25bf9cd0be551c6..c6b42d82ab91b46db78f166f3afc7b46806475a1 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-06.html +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-06.html @@ -1,4 +1,4 @@ <html><body>Jinia:<br> Be careful. Should anything happen, we'll try to help you.<br> -<a action="bypass -h Quest Jinia 32781-05.html">"Thanks, Jinia."</a> +<a action="bypass -h Quest IceQueensCastleNormalBattle enter">"Thanks, Jinia."</a> </body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-09.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-09.html new file mode 100644 index 0000000000000000000000000000000000000000..d4f467fa9f67f9a15487ae7bf0032b5fd039df39 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-09.html @@ -0,0 +1,4 @@ +<html><body>Jinia:<br> +You're here! I've been waiting for you. All our preparations are complete. Shall we depart?<br> +<a action="bypass -h Quest Jinia 32781-10.html">"Yes, I'm ready."</a> +</body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-10.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-10.html new file mode 100644 index 0000000000000000000000000000000000000000..d460409b603dd78cbf7e70362bae19ba15e2e49e --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-10.html @@ -0,0 +1,5 @@ +<html><body>Jinia:<br> +Alright, we'll depart now. Keep those nerves of steel!<br> +<a action="bypass -h npc_%objectId%_Quest IceQueensCastleNormalBattle enter">Enter the Ice Queen's Castle.</a><br> +<a action="bypass -h Quest Jinia 32781-11.html">"Wait a moment, I'm not ready."</a> +</body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-11.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-11.html new file mode 100644 index 0000000000000000000000000000000000000000..e12de9660b7dba54633748c140b51949cd18994d --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/32781-11.html @@ -0,0 +1,3 @@ +<html><body>Jinia:<br> +Alright, understood. Preparations must be thorough. Just let me know when you're ready to go. +</body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/Jinia.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/Jinia.java index 69ba4dcc0636c006b99cbd0cf707372c281fe7b7..032e68ae0f33bc9f4ba05a2d78f664213c8370b5 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/Jinia.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Jinia/Jinia.java @@ -51,24 +51,34 @@ public final class Jinia extends AbstractNpcAI public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) { String htmltext = event; - if ("check".equals(event)) + switch (event) { - if (hasAtLeastOneQuestItem(player, FROZEN_CORE, BLACK_FROZEN_CORE)) + case "32781-10.html": + case "32781-11.html": { - htmltext = "32781-03.html"; + htmltext = event; + break; } - else + case "check": { - final QuestState st = player.getQuestState(Q10286_ReunionWithSirra.class.getSimpleName()); - if ((st != null) && st.isCompleted()) + if (hasAtLeastOneQuestItem(player, FROZEN_CORE, BLACK_FROZEN_CORE)) { - giveItems(player, FROZEN_CORE, 1); + htmltext = "32781-03.html"; } else { - giveItems(player, BLACK_FROZEN_CORE, 1); + final QuestState st = player.getQuestState(Q10286_ReunionWithSirra.class.getSimpleName()); + if ((st != null) && st.isCompleted()) + { + giveItems(player, FROZEN_CORE, 1); + } + else + { + giveItems(player, BLACK_FROZEN_CORE, 1); + } + htmltext = "32781-04.html"; } - htmltext = "32781-04.html"; + break; } } return htmltext; @@ -78,7 +88,18 @@ public final class Jinia extends AbstractNpcAI public String onFirstTalk(L2Npc npc, L2PcInstance player) { final QuestState st = player.getQuestState(Q10286_ReunionWithSirra.class.getSimpleName()); - return ((player.getLevel() >= MIN_LEVEL) && (st != null) && st.isCompleted()) ? "32781-02.html" : "32781-01.html"; + if ((st != null) && (player.getLevel() >= MIN_LEVEL)) + { + if (st.isCompleted()) + { + return "32781-02.html"; + } + else if (st.isCond(5) || st.isCond(6)) + { + return "32781-09.html"; + } + } + return "32781-01.html"; } public static void main(String[] args) diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easy.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easy.html new file mode 100644 index 0000000000000000000000000000000000000000..993a06e2f35447de647202b187c82253ce200471 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easy.html @@ -0,0 +1,4 @@ +<html><body>Sirra:<br> +This is the way to the Ice Queen's Throne room, where she awaits. As I've told you, Freya is powerful beyond all comprehension and can destroy you with a mere thought. I keep telling other would-be heroes this, but they keep going anyway. It's actually getting rather fun. But I'm SURE you're different than they were! You shall succeed where they failed. Hahahaha...<br> +<a action="bypass -h Quest IceQueensCastleNormalBattle openDoor">Open door</a> +</body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easyfight.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easyfight.html new file mode 100644 index 0000000000000000000000000000000000000000..2b9e1d50b6b45083f976e705ca156e07926c9b9c --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-easyfight.html @@ -0,0 +1,4 @@ +<html><body>Sirra:<br> +Beyond this door the Ice Queen Freya is making ice sculptures from foolish adventurers. You're not trying to join them, are you? Tsk tsk. The smart ones run screaming about now.<br> +<a action="bypass -h Quest IceQueensCastleNormalBattle portInside">I will go in.</a> +</body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html new file mode 100644 index 0000000000000000000000000000000000000000..8fde7c56dca35d88526568736c3a1e25248a6f7a --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html @@ -0,0 +1,4 @@ +<html><body>Sirra:<br> +This is the way to the Ice Queen's Throne room, where she awaits. As I've told you, Freya is powerful beyond all comprehension and can destroy you with a mere thought. I keep telling other would-be heroes this, but they keep going anyway. It's actually getting rather fun. But I'm SURE you're different than they were! You shall succeed where they failed. Hahahaha...<br> +<a action="bypass -h Quest IceQueenCastleUltimateBattle opendoor">Open door</a> +</body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html new file mode 100644 index 0000000000000000000000000000000000000000..4e28cc142787511f61ce8a6b301f0f1f56497fb3 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html @@ -0,0 +1,4 @@ +<html><body>Sirra:<br> +Beyond this door the Ice Queen Freya is making ice sculptures from foolish adventurers. You're not trying to join them, are you? Tsk tsk. The smart ones run screaming about now.<br> +<a action="bypass -h Quest IceQueensCastleUltimateBattle portInside">I will go in.</a> +</body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762.html b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762.html new file mode 100644 index 0000000000000000000000000000000000000000..33683617ea58ee74a4a85314f10a24f720916425 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/32762.html @@ -0,0 +1,4 @@ +<html><body>Sirra:<br> +I'm the great Sirra, Master Elven Magician and chamberlain to her majesty, the Ice Queen Freya. Some call me the Ice Fairy. No doubt you've heard of me.<br> +<a action="bypass -h npc_%objectId%_Quest">Quest</a><br> +</body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/Sirra.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/Sirra.java new file mode 100644 index 0000000000000000000000000000000000000000..367cf4ce17c1bd1654de88e597853816856c8720 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Sirra/Sirra.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2004-2014 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 ai.npc.Sirra; + +import ai.npc.AbstractNpcAI; + +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; + +/** + * Sirra AI. + * @author St3eT + */ +public final class Sirra extends AbstractNpcAI +{ + // NPC + private static final int SIRRA = 32762; + // Misc + private static final int FREYA_INSTID = 139; + private static final int FREYA_HARD_INSTID = 144; + + private Sirra() + { + super(Sirra.class.getSimpleName(), "ai/npc"); + addFirstTalkId(SIRRA); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + final InstanceWorld world = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((world != null) && (world.getTemplateId() == FREYA_INSTID)) + { + return (world.isStatus(0)) ? "32762-easy.html" : "32762-easyfight.html"; + } + else if ((world != null) && (world.getTemplateId() == FREYA_HARD_INSTID)) + { + return (world.isStatus(0)) ? "32762-hard.html" : "32762-hardfight.html"; + } + return "32762.html"; + } + + public static void main(String[] args) + { + new Sirra(); + } +} \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851-01.html b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851-01.html new file mode 100644 index 0000000000000000000000000000000000000000..8ca0096f88b95e353ff9aaaf6c423e8b03197511 --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851-01.html @@ -0,0 +1,3 @@ +<html><body>Kegor:<br> +I'd entrust your associate with this mission, but.. +</body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851.html b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851.html new file mode 100644 index 0000000000000000000000000000000000000000..f49a63fd881d51d4d999f0e0cfd013bce0a5887e --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/18851.html @@ -0,0 +1,6 @@ +<html><body>Kegor:<br> +Without you, we would have failed. I can't thank you enough.<br> +Freya's last breath will flutter against your blade, I can feel it!<br> +<a action="bypass -h Quest IceQueensCastleNormalBattle killFreya">Rest in peace!</a><br> +<a action="bypass -h Quest IceQueensCastleNormalBattle 18851-01.html">Can I have a second with you?</a> +</body></html> \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java new file mode 100644 index 0000000000000000000000000000000000000000..0c94165cb60b531ac4b3cdc83412a97700b5c7fb --- /dev/null +++ b/L2J_DataPack_BETA/dist/game/data/scripts/instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java @@ -0,0 +1,1373 @@ +/* + * Copyright (C) 2004-2014 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 instances.IceQueensCastleNormalBattle; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; + +import javolution.util.FastList; +import quests.Q10286_ReunionWithSirra.Q10286_ReunionWithSirra; +import ai.npc.AbstractNpcAI; + +import com.l2jserver.gameserver.ai.CtrlIntention; +import com.l2jserver.gameserver.enums.MountType; +import com.l2jserver.gameserver.instancemanager.InstanceManager; +import com.l2jserver.gameserver.model.L2CommandChannel; +import com.l2jserver.gameserver.model.L2Party; +import com.l2jserver.gameserver.model.Location; +import com.l2jserver.gameserver.model.PcCondOverride; +import com.l2jserver.gameserver.model.actor.L2Attackable; +import com.l2jserver.gameserver.model.actor.L2Character; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance; +import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.actor.instance.L2QuestGuardInstance; +import com.l2jserver.gameserver.model.actor.instance.L2RaidBossInstance; +import com.l2jserver.gameserver.model.holders.SkillHolder; +import com.l2jserver.gameserver.model.instancezone.InstanceWorld; +import com.l2jserver.gameserver.model.quest.QuestState; +import com.l2jserver.gameserver.model.quest.State; +import com.l2jserver.gameserver.model.skills.L2Skill; +import com.l2jserver.gameserver.model.variables.NpcVariables; +import com.l2jserver.gameserver.network.NpcStringId; +import com.l2jserver.gameserver.network.SystemMessageId; +import com.l2jserver.gameserver.network.clientpackets.Say2; +import com.l2jserver.gameserver.network.serverpackets.ActionFailed; +import com.l2jserver.gameserver.network.serverpackets.ExChangeClientEffectInfo; +import com.l2jserver.gameserver.network.serverpackets.ExSendUIEvent; +import com.l2jserver.gameserver.network.serverpackets.SystemMessage; +import com.l2jserver.gameserver.taskmanager.DecayTaskManager; +import com.l2jserver.gameserver.util.Util; + +/** + * Ice Queen's Castle (Normal Battle) instance zone. + * @author St3eT + */ +public final class IceQueensCastleNormalBattle extends AbstractNpcAI +{ + protected class IQCNBWorld extends InstanceWorld + { + ArrayList<L2PcInstance> playersInside = new ArrayList<>(); + ArrayList<L2Npc> knightStatues = new ArrayList<>(); + List<L2Attackable> spawnedMobs = new FastList<>(); + L2NpcInstance controller = null; + L2GrandBossInstance freya = null; + L2QuestGuardInstance supp_Jinia = null; + L2QuestGuardInstance supp_Kegor = null; + boolean isSupportActive = false; + boolean canSpawnMobs = true; + } + + // Npcs + private static final int FREYA_THRONE = 29177; // First freya + private static final int FREYA_SPELLING = 29178; // Second freya + private static final int FREYA_STAND = 29179; // Last freya + private static final int INVISIBLE_NPC = 18919; + private static final int KNIGHT = 18855; // Archery Knight + private static final int GLACIER = 18853; // Glacier + private static final int BREATH = 18854; // Archer's Breath + private static final int GLAKIAS = 25699; // Glakias (Archery Knight Captain) + private static final int SIRRA = 32762; // Sirra + private static final int JINIA = 32781; // Jinia + private static final int SUPP_JINIA = 18850; // Jinia + private static final int SUPP_KEGOR = 18851; // Kegor + // Skills + private static final SkillHolder BLIZZARD = new SkillHolder(6274, 1); // Eternal Blizzard + private static final SkillHolder BLIZZARD_BREATH = new SkillHolder(6299, 1); // Breath of Ice Palace - Ice Storm + private static final SkillHolder SUICIDE_BREATH = new SkillHolder(6300, 1); // Self-Destruction + private static final SkillHolder JINIA_SUPPORT = new SkillHolder(6288, 1); // Jinia's Prayer + private static final SkillHolder KEGOR_SUPPORT = new SkillHolder(6289, 1); // Kegor's Courage + private static final SkillHolder ICE_STONE = new SkillHolder(6301, 1); // Cold Mana's Fragment + private static final SkillHolder CANCEL = new SkillHolder(4618, 1); // NPC Cancel PC Target + private static final SkillHolder POWER_STRIKE = new SkillHolder(6293, 1); // Power Strike + private static final SkillHolder POINT_TARGET = new SkillHolder(6295, 1); // Point Target + private static final SkillHolder CYLINDER_THROW = new SkillHolder(6297, 1); // Cylinder Throw + private static final SkillHolder SelfRangeBuff = new SkillHolder(6294, 1); // Leader's Roar + private static final SkillHolder LEADER_RUSH = new SkillHolder(6296, 1); // Rush + private static final SkillHolder ANTI_STRIDER = new SkillHolder(4258, 1); // Hinder Strider + private static final SkillHolder ICE_BALL = new SkillHolder(6278, 1); // Ice Ball + private static final SkillHolder SUMMON_ELEMENTAL = new SkillHolder(6277, 1); // Summon Spirits + private static final SkillHolder SELF_NOVA = new SkillHolder(6279, 1); // Attack Nearby Range + private static final SkillHolder REFLECT_MAGIC = new SkillHolder(6282, 1); // Reflect Magic + // Locations + private static final Location FREYA_SPAWN = new Location(114720, -117085, -11088, 15956); + private static final Location FREYA_SPELLING_SPAWN = new Location(114723, -117502, -10672, 15956); + private static final Location FREYA_CORPSE = new Location(114767, -114795, -11200, 0); + private static final Location MIDDLE_POINT = new Location(114730, -114805, -11200); + private static final Location KEGOR_FINISH = new Location(114659, -114796, -11205); + private static final Location GLAKIAS_SPAWN = new Location(114707, -114799, -11199, 15956); + private static final Location SUPP_JINIA_SPAWN = new Location(114751, -114781, -11205); + private static final Location SUPP_KEGOR_SPAWN = new Location(114659, -114796, -11205); + private static final Location BATTLE_PORT = new Location(114694, -113700, -11200); + private static final Location CONTROLLER_LOC = new Location(114394, -112383, -11200); + private static final Location[] ENTER_LOC = + { + new Location(114185, -112435, -11210), + new Location(114183, -112280, -11210), + new Location(114024, -112435, -11210), + new Location(114024, -112278, -11210), + new Location(113865, -112435, -11210), + new Location(113865, -112276, -11210), + + }; + private static final Location[] STATUES_LOC = + { + new Location(113845, -116091, -11168, 8264), + new Location(113381, -115622, -11168, 8264), + new Location(113380, -113978, -11168, -8224), + new Location(113845, -113518, -11168, -8224), + new Location(115591, -113516, -11168, -24504), + new Location(116053, -113981, -11168, -24504), + new Location(116061, -115611, -11168, 24804), + new Location(115597, -116080, -11168, 24804), + new Location(112942, -115480, -10960, 52), + new Location(112940, -115146, -10960, 52), + new Location(112945, -114453, -10960, 52), + new Location(112945, -114123, -10960, 52), + new Location(116497, -114117, -10960, 32724), + new Location(116499, -114454, -10960, 32724), + new Location(116501, -115145, -10960, 32724), + new Location(116502, -115473, -10960, 32724), + }; + private static Location[] KNIGHTS_LOC = + { + new Location(114502, -115315, -11205, 15451), + new Location(114937, -115323, -11205, 18106), + new Location(114722, -115185, -11205, 16437), + }; + // Misc + private static final int MAX_PLAYERS = 27; + private static final int MIN_PLAYERS = 10; + private static final int MIN_LEVEL = 82; + private static final int RESET_HOUR = 6; + private static final int RESET_MIN = 30; + private static final int RESET_DAY_1 = 4; // Wednesday + private static final int RESET_DAY_2 = 7; // Saturday + private static final int INSTANCEID = 139; // Ice Queen's Castle + private static final int DOOR_ID = 23140101; + + private IceQueensCastleNormalBattle() + { + super(IceQueensCastleNormalBattle.class.getSimpleName(), "instances"); + addStartNpc(SIRRA, SUPP_KEGOR, SUPP_JINIA); + addFirstTalkId(SUPP_KEGOR, SUPP_JINIA); + addTalkId(SIRRA, JINIA, SUPP_KEGOR); + addAttackId(FREYA_THRONE, FREYA_STAND, GLAKIAS, GLACIER, BREATH, KNIGHT); + addKillId(GLAKIAS, FREYA_STAND, KNIGHT, GLACIER, BREATH); + addSpawnId(GLAKIAS, FREYA_STAND, KNIGHT, GLACIER, BREATH); + addSpellFinishedId(GLACIER, BREATH); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + if (event.equals("enter")) + { + enterInstance(player, "IceQueensCastleNormalBattle.xml"); + } + else + { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((tmpworld != null) && (tmpworld instanceof IQCNBWorld)) + { + final IQCNBWorld world = (IQCNBWorld) tmpworld; + switch (event) + { + case "openDoor": + { + if (npc.isScriptValue(0)) + { + npc.setScriptValue(1); + openDoor(DOOR_ID, world.getInstanceId()); + world.controller = (L2NpcInstance) addSpawn(INVISIBLE_NPC, CONTROLLER_LOC, false, 0, true, world.getInstanceId()); + for (Location loc : STATUES_LOC) + { + if (loc.getZ() == -11168) + { + final L2Npc statue = addSpawn(INVISIBLE_NPC, loc, false, 0, false, world.getInstanceId()); + world.knightStatues.add(statue); + } + } + for (L2PcInstance players : world.playersInside) + { + if ((players != null) && !players.isDead() && (players.getInstanceId() == world.getInstanceId())) + { + final QuestState qs = player.getQuestState(Q10286_ReunionWithSirra.class.getSimpleName()); + if ((qs != null) && (qs.getState() == State.STARTED) && qs.isCond(5)) + { + qs.setCond(6, true); + } + } + } + startQuestTimer("STAGE_1_MOVIE", 60000, world.controller, null); + } + break; + } + case "portInside": + { + teleportPlayer(player, BATTLE_PORT, world.getInstanceId()); + break; + } + case "killFreya": + { + final QuestState qs = player.getQuestState(Q10286_ReunionWithSirra.class.getSimpleName()); + if ((qs != null) && (qs.getState() == State.STARTED) && qs.isCond(6)) + { + qs.setMemoState(10); + qs.setCond(7, true); + } + world.supp_Kegor.deleteMe(); + world.freya.decayMe(); + manageMovie(world, 20); + cancelQuestTimer("FINISH_WORLD", world.controller, null); + startQuestTimer("FINISH_WORLD", 58500, world.controller, null); + break; + } + case "18851-01.html": + { + return event; + } + case "STAGE_1_MOVIE": + { + closeDoor(DOOR_ID, world.getInstanceId()); + world.setStatus(1); + manageMovie(world, 15); + startQuestTimer("STAGE_1_START", 53500, world.controller, null); + break; + } + case "STAGE_1_START": + { + world.freya = (L2GrandBossInstance) addSpawn(FREYA_THRONE, FREYA_SPAWN, false, 0, true, world.getInstanceId()); + world.freya.setIsMortal(false); + manageScreenMsg(world, NpcStringId.BEGIN_STAGE_1); + startQuestTimer("CAST_BLIZZARD", 50000, world.controller, null); + startQuestTimer("STAGE_1_SPAWN", 2000, world.freya, null); + break; + } + case "STAGE_1_SPAWN": + { + notifyEvent("START_SPAWN", world.controller, null); + break; + } + case "STAGE_1_FINISH": + { + world.freya.deleteMe(); + world.freya = null; + manageDespawnMinions(world); + manageMovie(world, 16); + startQuestTimer("STAGE_1_PAUSE", 24100 - 1000, world.controller, null); + break; + } + case "STAGE_1_PAUSE": + { + world.freya = (L2GrandBossInstance) addSpawn(FREYA_SPELLING, FREYA_SPELLING_SPAWN, false, 0, true, world.getInstanceId()); + world.freya.setIsInvul(true); + world.freya.disableCoreAI(true); + manageTimer(world, 60); + world.setStatus(2); + startQuestTimer("STAGE_2_START", 60000, world.controller, null); + break; + } + case "STAGE_2_START": + { + world.canSpawnMobs = true; + notifyEvent("START_SPAWN", world.controller, null); + manageScreenMsg(world, NpcStringId.BEGIN_STAGE_2); + break; + } + case "STAGE_2_MOVIE": + { + manageMovie(world, 23); + startQuestTimer("STAGE_2_GLAKIAS", 7000, world.controller, null); + break; + } + case "STAGE_2_GLAKIAS": + { + for (Location loc : STATUES_LOC) + { + if (loc.getZ() == -10960) + { + final L2Npc statue = addSpawn(INVISIBLE_NPC, loc, false, 0, false, world.getInstanceId()); + world.knightStatues.add(statue); + startQuestTimer("SPAWN_KNIGHT", 5000, statue, null); + } + } + final L2RaidBossInstance glakias = (L2RaidBossInstance) addSpawn(GLAKIAS, GLAKIAS_SPAWN, false, 0, true, world.getInstanceId()); + startQuestTimer("LEADER_DELAY", 5000, glakias, null); + break; + } + case "STAGE_3_MOVIE": + { + manageMovie(world, 17); + startQuestTimer("STAGE_3_START", 21500, world.controller, null); + break; + } + case "STAGE_3_START": + { + for (L2PcInstance players : world.playersInside) + { + if (players != null) + { + players.broadcastPacket(ExChangeClientEffectInfo.STATIC_FREYA_DESTROYED); + } + } + world.setStatus(4); + world.freya.deleteMe(); + world.canSpawnMobs = true; + world.freya = (L2GrandBossInstance) addSpawn(FREYA_STAND, FREYA_SPAWN, false, 0, true, world.getInstanceId()); + world.controller.getVariables().set("FREYA_MOVE", 0); + notifyEvent("START_SPAWN", world.controller, null); + startQuestTimer("START_MOVE", 10000, world.controller, null); + startQuestTimer("CAST_BLIZZARD", 50000, world.controller, null); + manageScreenMsg(world, NpcStringId.BEGIN_STAGE_3); + break; + } + case "START_MOVE": + { + if (npc.getVariables().getInt("FREYA_MOVE") == 0) + { + world.controller.getVariables().set("FREYA_MOVE", 1); + world.freya.setIsRunning(true); + world.freya.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, MIDDLE_POINT); + } + break; + } + case "CAST_BLIZZARD": + { + if (!world.freya.isInvul()) + { + world.freya.doCast(BLIZZARD.getSkill()); + manageScreenMsg(world, NpcStringId.STRONG_MAGIC_POWER_CAN_BE_FELT_FROM_SOMEWHERE); + } + + for (L2Attackable minion : world.spawnedMobs) + { + if ((minion != null) && !minion.isDead() && !minion.isInCombat()) + { + manageRandomAttack(world, minion); + } + } + startQuestTimer("CAST_BLIZZARD", getRandom(55, 60) * 1000, world.controller, null); + break; + } + case "SPAWN_SUPPORT": + { + for (L2PcInstance players : world.playersInside) + { + if ((players != null) && (players.getInstanceId() == world.getInstanceId())) + { + players.setIsInvul(false); + } + } + world.freya.setIsInvul(false); + world.freya.disableCoreAI(false); + manageScreenMsg(world, NpcStringId.BEGIN_STAGE_4); + world.supp_Jinia = (L2QuestGuardInstance) addSpawn(SUPP_JINIA, SUPP_JINIA_SPAWN, false, 0, true, world.getInstanceId()); + world.supp_Jinia.setIsRunning(true); + world.supp_Jinia.setIsInvul(true); + world.supp_Jinia.setCanReturnToSpawnPoint(false); + world.supp_Kegor = (L2QuestGuardInstance) addSpawn(SUPP_KEGOR, SUPP_KEGOR_SPAWN, false, 0, true, world.getInstanceId()); + world.supp_Kegor.setIsRunning(true); + world.supp_Kegor.setIsInvul(true); + world.supp_Kegor.setCanReturnToSpawnPoint(false); + startQuestTimer("ATTACK_FREYA", 5000, world.supp_Jinia, null); + startQuestTimer("ATTACK_FREYA", 5000, world.supp_Kegor, null); + startQuestTimer("GIVE_SUPPORT", 1000, world.controller, null); + break; + } + case "GIVE_SUPPORT": + { + if (world.isSupportActive) + { + world.supp_Jinia.doCast(JINIA_SUPPORT.getSkill()); + world.supp_Kegor.doCast(KEGOR_SUPPORT.getSkill()); + startQuestTimer("GIVE_SUPPORT", 25000, world.controller, null); + } + break; + } + case "FINISH_STAGE": + { + world.supp_Jinia.deleteMe(); + world.supp_Jinia = null; + world.freya.teleToLocation(FREYA_CORPSE); + world.supp_Kegor.teleToLocation(KEGOR_FINISH); + break; + } + case "START_SPAWN": + { + for (L2Npc statues : world.knightStatues) + { + notifyEvent("SPAWN_KNIGHT", statues, null); + } + + for (Location loc : KNIGHTS_LOC) + { + final L2Attackable knight = (L2Attackable) addSpawn(KNIGHT, loc, false, 0, false, world.getInstanceId()); + knight.disableCoreAI(true); + knight.setDisplayEffect(1); + knight.getSpawn().setLocation(loc); + world.spawnedMobs.add(knight); + startQuestTimer("ICE_RUPTURE", getRandom(2, 5) * 1000, knight, null); + } + + for (int i = 0; i < world.getStatus(); i++) + { + notifyEvent("SPAWN_GLACIER", world.controller, null); + } + break; + } + case "SPAWN_KNIGHT": + { + if (world.canSpawnMobs) + { + final Location loc = new Location(MIDDLE_POINT.getX() + getRandom(-1000, 1000), MIDDLE_POINT.getY() + getRandom(-1000, 1000), MIDDLE_POINT.getZ()); + final L2Attackable knight = (L2Attackable) addSpawn(KNIGHT, npc.getLocation(), false, 0, false, world.getInstanceId()); + knight.getVariables().set("SPAWNED_NPC", npc); + knight.disableCoreAI(true); + knight.setIsImmobilized(true); + knight.setDisplayEffect(1); + knight.getSpawn().setLocation(loc); + world.spawnedMobs.add(knight); + startQuestTimer("ICE_RUPTURE", getRandom(5, 10) * 1000, knight, null); + } + break; + } + case "SPAWN_GLACIER": + { + if (world.canSpawnMobs) + { + final Location loc = new Location(MIDDLE_POINT.getX() + getRandom(-1000, 1000), MIDDLE_POINT.getY() + getRandom(-1000, 1000), MIDDLE_POINT.getZ()); + final L2Attackable glacier = (L2Attackable) addSpawn(GLACIER, loc, false, 0, false, world.getInstanceId()); + glacier.setDisplayEffect(1); + glacier.disableCoreAI(true); + glacier.setIsImmobilized(true); + world.spawnedMobs.add(glacier); + startQuestTimer("CHANGE_STATE", 1400, glacier, null); + } + break; + } + case "ICE_RUPTURE": + { + if (npc.isCoreAIDisabled()) + { + npc.disableCoreAI(false); + npc.setIsImmobilized(false); + npc.setDisplayEffect(2); + manageRandomAttack(world, (L2Attackable) npc); + } + break; + } + case "FIND_TARGET": + { + manageRandomAttack(world, (L2Attackable) npc); + break; + } + case "CHANGE_STATE": + { + npc.setDisplayEffect(2); + startQuestTimer("CAST_SKILL", 20000, npc, null); + break; + } + case "CAST_SKILL": + { + if (npc.isScriptValue(0) && !npc.isDead()) + { + npc.setTarget(npc); + npc.doCast(ICE_STONE.getSkill()); + npc.setScriptValue(1); + } + break; + } + case "SUICIDE": + { + npc.setDisplayEffect(3); + npc.setIsMortal(true); + npc.doDie(null); + break; + } + case "BLIZZARD": + { + npc.getVariables().set("SUICIDE_COUNT", npc.getVariables().getInt("SUICIDE_COUNT") + 1); + + if (npc.getVariables().getInt("SUICIDE_ON") == 0) + { + if (npc.getVariables().getInt("SUICIDE_COUNT") == 2) + { + startQuestTimer("ELEMENTAL_SUICIDE", 20000, npc, null); + } + else + { + if (npc.checkDoCastConditions(BLIZZARD_BREATH.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(npc); + npc.doCast(BLIZZARD_BREATH.getSkill()); + } + startQuestTimer("BLIZZARD", 20000, npc, null); + } + } + break; + } + case "ELEMENTAL_SUICIDE": + { + npc.setTarget(npc); + npc.doCast(SUICIDE_BREATH.getSkill()); + break; + } + case "ELEMENTAL_KILLED": + { + if (npc.getVariables().getInt("SUICIDE_ON") == 1) + { + npc.setTarget(npc); + npc.doCast(SUICIDE_BREATH.getSkill()); + } + break; + } + case "ATTACK_FREYA": + { + final SkillHolder skill = npc.getTemplate().getParameters().getObject("Skill01_ID", SkillHolder.class); + if (npc.isInsideRadius(world.freya, 100, true, false)) + { + if (npc.checkDoCastConditions(skill.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(world.freya); + npc.doCast(skill.getSkill()); + startQuestTimer("ATTACK_FREYA", 20000, npc, null); + } + else + { + startQuestTimer("ATTACK_FREYA", 5000, npc, null); + } + } + else + { + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, world.freya); + startQuestTimer("ATTACK_FREYA", 5000, npc, null); + } + break; + } + case "FINISH_WORLD": + { + if (world.freya != null) + { + world.freya.decayMe(); + } + + for (L2PcInstance players : world.playersInside) + { + if ((players != null)) + { + players.broadcastPacket(ExChangeClientEffectInfo.STATIC_FREYA_DEFAULT); + } + } + InstanceManager.getInstance().destroyInstance(world.getInstanceId()); + break; + } + case "LEADER_RANGEBUFF": + { + if (npc.checkDoCastConditions(SelfRangeBuff.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(npc); + npc.doCast(SelfRangeBuff.getSkill()); + } + else + { + startQuestTimer("LEADER_RANGEBUFF", 30000, npc, null); + } + break; + } + case "LEADER_RANDOMIZE": + { + final L2Attackable mob = (L2Attackable) npc; + mob.clearAggroList(); + + for (L2Character characters : npc.getKnownList().getKnownPlayersInRadius(1000)) + { + if ((characters != null)) + { + mob.addDamageHate(characters, 0, getRandom(10000, 20000)); + } + } + startQuestTimer("LEADER_RANDOMIZE", 25000, npc, null); + break; + } + case "LEADER_DASH": + { + final L2Character mostHated = ((L2Attackable) npc).getMostHated(); + if (getRandomBoolean() && !npc.isCastingNow() && (mostHated != null) && !mostHated.isDead() && (npc.calculateDistance(mostHated, true, false) < 1000)) + { + npc.setTarget(mostHated); + npc.doCast(LEADER_RUSH.getSkill()); + } + startQuestTimer("LEADER_DASH", 10000, npc, null); + break; + } + case "LEADER_DESTROY": + { + final L2Attackable mob = (L2Attackable) npc; + if (npc.getVariables().getInt("OFF_SHOUT") == 0) + { + manageScreenMsg(world, NpcStringId.THE_SPACE_FEELS_LIKE_ITS_GRADUALLY_STARTING_TO_SHAKE); + + switch (getRandom(4)) + { + case 0: + { + broadcastNpcSay(npc, Say2.SHOUT, NpcStringId.ARCHER_GIVE_YOUR_BREATH_FOR_THE_INTRUDER); + break; + } + case 1: + { + broadcastNpcSay(npc, Say2.SHOUT, NpcStringId.MY_KNIGHTS_SHOW_YOUR_LOYALTY); + break; + } + case 2: + { + broadcastNpcSay(npc, Say2.SHOUT, NpcStringId.I_CAN_TAKE_IT_NO_LONGER); + break; + } + case 3: + { + broadcastNpcSay(npc, Say2.SHOUT, NpcStringId.ARCHER_HEED_MY_CALL); + for (int i = 0; i < 3; i++) + { + final L2Attackable breath = (L2Attackable) addSpawn(BREATH, npc.getLocation(), true, 0, false, world.getInstanceId()); + breath.setIsRunning(true); + breath.addDamageHate(mob.getMostHated(), 0, 999); + breath.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, mob.getMostHated()); + startQuestTimer("BLIZZARD", 20000, breath, null); + world.spawnedMobs.add(breath); + } + break; + } + } + } + break; + } + case "LEADER_DELAY": + { + if (npc.getVariables().getInt("DELAY_VAL") == 0) + { + npc.getVariables().set("DELAY_VAL", 1); + } + break; + } + } + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onSpawn(L2Npc npc) + { + ((L2Attackable) npc).setOnKillDelay(0); + return super.onSpawn(npc); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((tmpworld != null) && (tmpworld instanceof IQCNBWorld)) + { + final IQCNBWorld world = (IQCNBWorld) tmpworld; + + if (npc.getId() == SUPP_JINIA) + { + player.sendPacket(ActionFailed.STATIC_PACKET); + return null; + } + else if (npc.getId() == SUPP_KEGOR) + { + if (world.isSupportActive) + { + player.sendPacket(ActionFailed.STATIC_PACKET); + return null; + } + return "18851.html"; + } + } + player.sendPacket(ActionFailed.STATIC_PACKET); + return null; + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, L2Skill skill) + { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((tmpworld != null) && (tmpworld instanceof IQCNBWorld)) + { + final IQCNBWorld world = (IQCNBWorld) tmpworld; + switch (npc.getId()) + { + case FREYA_THRONE: + { + if ((world.controller.getVariables().getInt("FREYA_MOVE") == 0) && world.isStatus(1)) + { + world.controller.getVariables().set("FREYA_MOVE", 1); + manageScreenMsg(world, NpcStringId.FREYA_HAS_STARTED_TO_MOVE); + world.freya.setIsRunning(true); + world.freya.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, MIDDLE_POINT); + } + + if (npc.getCurrentHp() < (npc.getMaxHp() * 0.02)) + { + notifyEvent("STAGE_1_FINISH", world.controller, null); + cancelQuestTimer("CAST_BLIZZARD", world.controller, null); + } + else + { + if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTI_STRIDER.getSkillId()) && !npc.isCastingNow()) + { + if (!npc.isSkillDisabled(ANTI_STRIDER.getSkill())) + { + npc.setTarget(attacker); + npc.doCast(ANTI_STRIDER.getSkill()); + } + } + + final L2Character mostHated = ((L2Attackable) npc).getMostHated(); + final boolean canReachMostHated = (mostHated != null) && !mostHated.isDead() && (npc.calculateDistance(mostHated, true, false) <= 800); + + if (getRandom(10000) < 3333) + { + if (getRandomBoolean()) + { + if ((npc.calculateDistance(attacker, true, false) <= 800) && npc.checkDoCastConditions(ICE_BALL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(ICE_BALL.getSkill()); + } + } + else + { + if (canReachMostHated && npc.checkDoCastConditions(ICE_BALL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(mostHated); + npc.doCast(ICE_BALL.getSkill()); + } + } + } + else if (getRandom(10000) < 800) + { + if (getRandomBoolean()) + { + if ((npc.calculateDistance(attacker, true, false) <= 800) && npc.checkDoCastConditions(SUMMON_ELEMENTAL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(SUMMON_ELEMENTAL.getSkill()); + } + } + else + { + if (canReachMostHated && npc.checkDoCastConditions(SUMMON_ELEMENTAL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(mostHated); + npc.doCast(SUMMON_ELEMENTAL.getSkill()); + } + } + } + else if (getRandom(10000) < 1500) + { + if (!npc.isAffectedBySkill(SELF_NOVA.getSkillId()) && npc.checkDoCastConditions(SELF_NOVA.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(npc); + npc.doCast(SELF_NOVA.getSkill()); + } + } + } + break; + } + case FREYA_STAND: + { + if (world.controller.getVariables().getInt("FREYA_MOVE") == 0) + { + world.controller.getVariables().set("FREYA_MOVE", 1); + world.freya.setIsRunning(true); + world.freya.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, MIDDLE_POINT); + } + + if ((npc.getCurrentHp() < (npc.getMaxHp() * 0.2)) && !world.isSupportActive) + { + world.isSupportActive = true; + world.freya.setIsInvul(true); + world.freya.disableCoreAI(true); + for (L2PcInstance players : world.playersInside) + { + players.setIsInvul(true); + players.abortAttack(); + } + manageMovie(world, 18); + startQuestTimer("SPAWN_SUPPORT", 27000, world.controller, null); + } + + if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTI_STRIDER.getSkillId()) && !npc.isCastingNow()) + { + if (!npc.isSkillDisabled(ANTI_STRIDER.getSkill())) + { + npc.setTarget(attacker); + npc.doCast(ANTI_STRIDER.getSkill()); + } + } + + final L2Character mostHated = ((L2Attackable) npc).getMostHated(); + final boolean canReachMostHated = (mostHated != null) && !mostHated.isDead() && (npc.calculateDistance(mostHated, true, false) <= 800); + + if (getRandom(10000) < 3333) + { + if (getRandomBoolean()) + { + if ((npc.calculateDistance(attacker, true, false) <= 800) && npc.checkDoCastConditions(ICE_BALL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(ICE_BALL.getSkill()); + } + } + else + { + if (canReachMostHated && npc.checkDoCastConditions(ICE_BALL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(mostHated); + npc.doCast(ICE_BALL.getSkill()); + } + } + } + else if (getRandom(10000) < 1333) + { + if (getRandomBoolean()) + { + if ((npc.calculateDistance(attacker, true, false) <= 800) && npc.checkDoCastConditions(SUMMON_ELEMENTAL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(SUMMON_ELEMENTAL.getSkill()); + } + } + else + { + if (canReachMostHated && npc.checkDoCastConditions(SUMMON_ELEMENTAL.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(mostHated); + npc.doCast(SUMMON_ELEMENTAL.getSkill()); + } + } + } + else if (getRandom(10000) < 1500) + { + if (!npc.isAffectedBySkill(SELF_NOVA.getSkillId()) && npc.checkDoCastConditions(SELF_NOVA.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(npc); + npc.doCast(SELF_NOVA.getSkill()); + } + } + else if (getRandom(10000) < 1333) + { + if (!npc.isAffectedBySkill(REFLECT_MAGIC.getSkillId()) && npc.checkDoCastConditions(REFLECT_MAGIC.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(npc); + npc.doCast(REFLECT_MAGIC.getSkill()); + } + } + break; + } + case GLACIER: + { + if (npc.isScriptValue(0) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))) + { + npc.setTarget(attacker); + npc.doCast(ICE_STONE.getSkill()); + npc.setScriptValue(1); + } + break; + } + case BREATH: + { + if ((npc.getCurrentHp() < (npc.getMaxHp() / 20)) && (npc.getVariables().getInt("SUICIDE_ON", 0) == 0)) + { + npc.getVariables().set("SUICIDE_ON", 1); + startQuestTimer("ELEMENTAL_KILLED", 1000, npc, null); + } + break; + } + case KNIGHT: + { + if (npc.isCoreAIDisabled()) + { + manageRandomAttack(world, (L2Attackable) npc); + npc.disableCoreAI(false); + npc.setIsImmobilized(false); + npc.setDisplayEffect(2); + cancelQuestTimer("ICE_RUPTURE", npc, null); + } + break; + } + case GLAKIAS: + { + if (npc.getCurrentHp() < (npc.getMaxHp() * 0.02)) + { + if (npc.getVariables().getInt("OFF_SHOUT") == 0) + { + npc.getVariables().set("OFF_SHOUT", 1); + npc.getVariables().set("DELAY_VAL", 2); + npc.setTarget(attacker); + npc.doCast(CANCEL.getSkill()); + } + else if (npc.getVariables().getInt("OFF_SHOUT") == 1) + { + npc.setTarget(attacker); + npc.doCast(CANCEL.getSkill()); + } + } + else if ((npc.getVariables().getInt("OFF_SHOUT") == 0) && (npc.getVariables().getInt("DELAY_VAL") == 1)) + { + final L2Character mostHated = ((L2Attackable) npc).getMostHated(); + final boolean canReachMostHated = (mostHated != null) && !mostHated.isDead() && (npc.calculateDistance(mostHated, true, false) < 1000); + + if (npc.getVariables().getInt("TIMER_ON") == 0) + { + npc.getVariables().set("TIMER_ON", 1); + startQuestTimer("LEADER_RANGEBUFF", getRandom(5, 30) * 1000, npc, null); + startQuestTimer("LEADER_RANDOMIZE", 25000, npc, null); + startQuestTimer("LEADER_DASH", 5000, npc, null); + startQuestTimer("LEADER_DESTROY", 60000, npc, null); + } + + if (getRandom(10000) < 2500) + { + if (getRandom(10000) < 2500) + { + if (npc.checkDoCastConditions(POWER_STRIKE.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(POWER_STRIKE.getSkill()); + } + } + else if (npc.checkDoCastConditions(POWER_STRIKE.getSkill()) && !npc.isCastingNow() && canReachMostHated) + { + npc.setTarget(((L2Attackable) npc).getMostHated()); + npc.doCast(POWER_STRIKE.getSkill()); + } + } + else if (getRandom(10000) < 1500) + { + if (getRandomBoolean()) + { + if (npc.checkDoCastConditions(POINT_TARGET.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(POINT_TARGET.getSkill()); + } + } + else if (npc.checkDoCastConditions(POINT_TARGET.getSkill()) && !npc.isCastingNow() && canReachMostHated) + { + npc.setTarget(((L2Attackable) npc).getMostHated()); + npc.doCast(POINT_TARGET.getSkill()); + } + } + else if (getRandom(10000) < 1500) + { + if (getRandomBoolean()) + { + if (npc.checkDoCastConditions(CYLINDER_THROW.getSkill()) && !npc.isCastingNow()) + { + npc.setTarget(attacker); + npc.doCast(CYLINDER_THROW.getSkill()); + } + } + else if (npc.checkDoCastConditions(CYLINDER_THROW.getSkill()) && !npc.isCastingNow() && canReachMostHated) + { + npc.setTarget(((L2Attackable) npc).getMostHated()); + npc.doCast(CYLINDER_THROW.getSkill()); + } + } + } + break; + } + } + } + return super.onAttack(npc, attacker, damage, isSummon, skill); + } + + @Override + public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill) + { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((tmpworld != null) && (tmpworld instanceof IQCNBWorld)) + { + final IQCNBWorld world = (IQCNBWorld) tmpworld; + + switch (npc.getId()) + { + case GLACIER: + { + if (skill == ICE_STONE.getSkill()) + { + if (getRandom(100) < 75) + { + final L2Attackable breath = (L2Attackable) addSpawn(BREATH, npc.getLocation(), false, 0, false, world.getInstanceId()); + if (player != null) + { + breath.setIsRunning(true); + breath.addDamageHate(player, 0, 999); + breath.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player); + } + else + { + manageRandomAttack(world, breath); + } + world.spawnedMobs.add(breath); + startQuestTimer("BLIZZARD", 20000, breath, null); + } + notifyEvent("SUICIDE", npc, null); + } + break; + } + case BREATH: + { + if (skill == SUICIDE_BREATH.getSkill()) + { + npc.doDie(null); + } + break; + } + } + } + return super.onSpellFinished(npc, player, skill); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId()); + + if ((tmpworld != null) && (tmpworld instanceof IQCNBWorld)) + { + final IQCNBWorld world = (IQCNBWorld) tmpworld; + switch (npc.getId()) + { + case GLAKIAS: + { + manageDespawnMinions(world); + manageTimer(world, 60); + startQuestTimer("STAGE_3_MOVIE", 60000, world.controller, null); + break; + } + case FREYA_STAND: + { + for (L2PcInstance player : world.playersInside) + { + if ((player != null) && (player.getInstanceId() == world.getInstanceId())) + { + Calendar reenter = Calendar.getInstance(); + Calendar.getInstance().set(Calendar.MINUTE, RESET_MIN); + Calendar.getInstance().set(Calendar.HOUR_OF_DAY, RESET_HOUR); + + if (reenter.getTimeInMillis() <= System.currentTimeMillis()) + { + reenter.add(Calendar.DAY_OF_MONTH, 1); + } + if (reenter.get(Calendar.DAY_OF_WEEK) <= RESET_DAY_1) + { + while (reenter.get(Calendar.DAY_OF_WEEK) != RESET_DAY_1) + { + reenter.add(Calendar.DAY_OF_MONTH, 1); + } + } + else + { + while (reenter.get(Calendar.DAY_OF_WEEK) != RESET_DAY_2) + { + reenter.add(Calendar.DAY_OF_MONTH, 1); + } + } + InstanceManager.getInstance().setInstanceTime(player.getObjectId(), INSTANCEID, reenter.getTimeInMillis()); + final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.INSTANT_ZONE_S1_RESTRICTED); + sm.addInstanceName(INSTANCEID); + player.sendPacket(sm); + } + } + world.isSupportActive = false; + manageMovie(world, 19); + manageDespawnMinions(world); + DecayTaskManager.getInstance().cancel(world.freya); + cancelQuestTimer("ATTACK_FREYA", world.supp_Jinia, null); + cancelQuestTimer("ATTACK_FREYA", world.supp_Kegor, null); + cancelQuestTimer("GIVE_SUPPORT", world.controller, null); + cancelQuestTimer("CAST_BLIZZARD", world.controller, null); + startQuestTimer("FINISH_STAGE", 16000, world.controller, null); + startQuestTimer("FINISH_WORLD", 300000, world.controller, null); + break; + } + case KNIGHT: + { + final L2Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", L2Npc.class); + final NpcVariables var = world.controller.getVariables(); + int knightCount = var.getInt("KNIGHT_COUNT"); + + if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) + { + var.set("FREYA_MOVE", 1); + manageScreenMsg(world, NpcStringId.FREYA_HAS_STARTED_TO_MOVE); + world.freya.setIsRunning(true); + world.freya.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, MIDDLE_POINT); + } + + if ((knightCount < 10) && (world.isStatus(2))) + { + knightCount++; + var.set("KNIGHT_COUNT", knightCount); + + if (knightCount == 10) + { + notifyEvent("STAGE_2_MOVIE", world.controller, null); + world.setStatus(3); + } + } + + if (spawnedBy != null) + { + startQuestTimer("SPAWN_KNIGHT", getRandom(30, 60) * 1000, spawnedBy, null); + } + world.spawnedMobs.remove(npc); + break; + } + case GLACIER: + { + startQuestTimer("SPAWN_GLACIER", getRandom(30, 60) * 1000, world.controller, null); + world.spawnedMobs.remove(npc); + break; + } + case BREATH: + { + world.spawnedMobs.remove(npc); + break; + } + } + } + return super.onKill(npc, killer, isSummon); + } + + private void enterInstance(L2PcInstance player, String template) + { + InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); + + if (world != null) + { + if (world instanceof IQCNBWorld) + { + player.stopAllEffectsExceptThoseThatLastThroughDeath(); + if (player.hasSummon()) + { + player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + } + + if (world.isStatus(4)) + { + teleportPlayer(player, BATTLE_PORT, world.getInstanceId()); + } + else + { + teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId(), false); + } + return; + } + player.sendPacket(SystemMessageId.ALREADY_ENTERED_ANOTHER_INSTANCE_CANT_ENTER); + return; + } + + if (checkConditions(player)) + { + world = new IQCNBWorld(); + world.setInstanceId(InstanceManager.getInstance().createDynamicInstance(template)); + world.setTemplateId(INSTANCEID); + world.setStatus(0); + InstanceManager.getInstance().addWorld(world); + _log.info("Ice Queen Castle started (Normal Battle)" + template + " Instance: " + world.getInstanceId() + " created by player: " + player.getName()); + + if (!player.isInParty()) + { + managePlayerEnter(player, (IQCNBWorld) world); + } + else if (player.getParty().isInCommandChannel()) + { + for (L2PcInstance players : player.getParty().getCommandChannel().getMembers()) + { + managePlayerEnter(players, (IQCNBWorld) world); + } + } + else + { + for (L2PcInstance players : player.getParty().getMembers()) + { + managePlayerEnter(players, (IQCNBWorld) world); + } + } + } + } + + private void managePlayerEnter(L2PcInstance player, IQCNBWorld world) + { + player.stopAllEffectsExceptThoseThatLastThroughDeath(); + if (player.hasSummon()) + { + player.getSummon().stopAllEffectsExceptThoseThatLastThroughDeath(); + } + world.playersInside.add(player); + world.addAllowed(player.getObjectId()); + teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId(), false); + } + + private boolean checkConditions(L2PcInstance player) + { + final L2Party party = player.getParty(); + final L2CommandChannel channel = party != null ? party.getCommandChannel() : null; + + if (player.isGM() && player.canOverrideCond(PcCondOverride.INSTANCE_CONDITIONS)) + { + return true; + } + + if (party == null) + { + player.sendPacket(SystemMessageId.NOT_IN_PARTY_CANT_ENTER); + return false; + } + else if (channel == null) + { + player.sendPacket(SystemMessageId.NOT_IN_COMMAND_CHANNEL_CANT_ENTER); + return false; + } + else if (player != channel.getLeader()) + { + player.sendPacket(SystemMessageId.ONLY_PARTY_LEADER_CAN_ENTER); + return false; + } + else if ((channel.getMemberCount() < MIN_PLAYERS) || (channel.getMemberCount() > MAX_PLAYERS)) + { + player.sendPacket(SystemMessageId.PARTY_EXCEEDED_THE_LIMIT_CANT_ENTER); + return false; + } + for (L2PcInstance channelMember : channel.getMembers()) + { + if (channelMember.getLevel() < MIN_LEVEL) + { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_LEVEL_REQUIREMENT_NOT_SUFFICIENT); + sm.addPcName(channelMember); + party.broadcastPacket(sm); + return false; + } + else if (!Util.checkIfInRange(1000, player, channelMember, true)) + { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_LOCATION_THAT_CANNOT_BE_ENTERED); + sm.addPcName(channelMember); + party.broadcastPacket(sm); + return false; + } + else if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(channelMember.getObjectId(), INSTANCEID)) + { + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_REENTER_YET); + sm.addPcName(channelMember); + party.broadcastPacket(sm); + return false; + } + } + return true; + } + + private void manageRandomAttack(IQCNBWorld world, L2Attackable mob) + { + final List<L2PcInstance> players = new ArrayList<>(); + for (L2PcInstance player : world.playersInside) + { + if ((player != null) && !player.isDead() && (player.getInstanceId() == world.getInstanceId()) && !player.getAppearance().getInvisible()) + { + players.add(player); + } + } + + Collections.shuffle(players); + final L2PcInstance target = (players.size() > 0) ? players.get(0) : null; + if (target != null) + { + mob.addDamageHate(target, 0, 999); + mob.setIsRunning(true); + mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); + } + else + { + startQuestTimer("FIND_TARGET", 10000, mob, null); + } + } + + private void manageDespawnMinions(IQCNBWorld world) + { + world.canSpawnMobs = false; + for (L2Attackable mobs : world.spawnedMobs) + { + if ((mobs != null) && !mobs.isDead()) + { + mobs.doDie(null); + } + } + } + + private void manageTimer(IQCNBWorld world, int time) + { + for (L2PcInstance players : world.playersInside) + { + if ((players != null) && (players.getInstanceId() == world.getInstanceId())) + { + players.sendPacket(new ExSendUIEvent(players, false, false, time, 0, "Time remaining until next battle")); + } + } + } + + private void manageScreenMsg(IQCNBWorld world, NpcStringId stringId) + { + for (L2PcInstance players : world.playersInside) + { + if ((players != null) && (players.getInstanceId() == world.getInstanceId())) + { + showOnScreenMsg(players, stringId, 2, 6000); + } + } + } + + private void manageMovie(IQCNBWorld world, int movie) + { + for (L2PcInstance players : world.playersInside) + { + if ((players != null) && (players.getInstanceId() == world.getInstanceId())) + { + players.showQuestMovie(movie); + } + } + } + + public static void main(String[] args) + { + new IceQueensCastleNormalBattle(); + } +} \ No newline at end of file diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/32781-01.html b/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/32781-01.html index 426a2bb3a9b60a5559c5223a6e1c169ff2bdd9d0..569b960d310bc162ee22b4126f8a03042961e70e 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/32781-01.html +++ b/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/32781-01.html @@ -1,4 +1,4 @@ <html><body>Jinia:<br> -You're here! I've been waiting for you. All our preparations are complete. Shall we depart?<br> -<a action="bypass -h Quest Q10286_ReunionWithSirra 32781-02.html">"Yes, I'm ready."</a> +I finally thought we had accomplished our life-long dream... Sirra's betrayal surprised us all. She only wanted to defeat the Ice Queen so she could take her place...<br> +But, we won't overlook the courage you've shown. Allow us a chance to properly show our gratitude. Why don't we go to Jinia Guild and conclude this later. </body></html> diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/Q10286_ReunionWithSirra.java b/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/Q10286_ReunionWithSirra.java index 0e2797a29b4692b3cac9c6b2b9add4893fe31c28..96b96f3c7cc71e8485239e42e9c417200884d1c2 100644 --- a/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/Q10286_ReunionWithSirra.java +++ b/L2J_DataPack_BETA/dist/game/data/scripts/quests/Q10286_ReunionWithSirra/Q10286_ReunionWithSirra.java @@ -243,15 +243,11 @@ public final class Q10286_ReunionWithSirra extends Quest } case JINIA2: { - if (st.isMemoState(2)) - { - htmltext = "32781-01.html"; - } - else if (st.isMemoState(10)) + if (st.isMemoState(10)) { st.addExpAndSp(2152200, 181070); st.exitQuest(false, true); - htmltext = "32781-04.html"; + htmltext = "32781-01.html"; } break; } diff --git a/L2J_DataPack_BETA/dist/game/data/stats/npcs/18800-18900.xml b/L2J_DataPack_BETA/dist/game/data/stats/npcs/18800-18900.xml index 93aac031d9ee52a026445bba748a44a7141b4b50..77428d5c04220da5d44ed34cb67186f9447803db 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/npcs/18800-18900.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/npcs/18800-18900.xml @@ -2138,7 +2138,7 @@ <height normal="30" /> </collision> </npc> - <npc id="18850" level="85" type="L2Npc" name="Jinia "> + <npc id="18850" level="85" type="L2QuestGuard" name="Jinia "> <!-- Confirmed CT2.5 --> <parameters> <skill name="Skill01_ID" id="6641" level="1" /> <!-- Holy Ball --> @@ -2169,7 +2169,6 @@ <skill id="4414" level="2" /> <!--Standard Type --> <skill id="4415" level="3" /> <!--One-handed Sword --> <skill id="4416" level="14" /> <!--Humans --> - <skill id="6288" level="1" /> <!--Jinia's Prayer --> <skill id="6641" level="1" /> <!--Holy Ball --> </skill_list> <ex_crt_effect>true</ex_crt_effect> @@ -2180,7 +2179,7 @@ <height normal="23.5" /> </collision> </npc> - <npc id="18851" level="85" type="L2Npc" name="Kegor"> + <npc id="18851" level="85" type="L2QuestGuard" name="Kegor"> <!-- Confirmed CT2.5 --> <parameters> <skill name="Skill01_ID" id="6643" level="1" /> <!-- Holy Strike --> @@ -2212,7 +2211,6 @@ <skill id="4414" level="2" /> <!--Standard Type --> <skill id="4415" level="3" /> <!--One-handed Sword --> <skill id="4416" level="14" /> <!--Humans --> - <skill id="6289" level="1" /> <!--Kegor's Courage --> <skill id="6642" level="1" /> <!--Dash --> <skill id="6643" level="1" /> <!--Holy Strike --> </skill_list> @@ -2260,7 +2258,7 @@ <height normal="22" /> </collision> </npc> - <npc id="18853" level="85" type="L2Npc" name="Glacier"> + <npc id="18853" level="85" type="L2Monster" name="Glacier"> <!-- Confirmed CT2.5 --> <parameters> <skill name="Buff" id="6301" level="1" /> <!-- Cold Mana's Fragment --> @@ -2302,7 +2300,7 @@ <height normal="27" /> </collision> </npc> - <npc id="18854" level="85" type="L2Npc" name="Archer's Breath"> + <npc id="18854" level="85" type="L2Monster" name="Archer's Breath"> <!-- Confirmed CT2.5 --> <parameters> <skill name="Skill_Blizzard" id="6299" level="1" /> <!-- Breath of Ice Palace - Ice Storm --> @@ -2335,8 +2333,6 @@ <skill id="4414" level="2" /> <!--Standard Type --> <skill id="4415" level="3" /> <!--One-handed Sword --> <skill id="4416" level="7" /> <!--Spirits --> - <skill id="6299" level="1" /> <!--Breath of Ice Palace - Ice Storm --> - <skill id="6300" level="1" /> <!--Self-Destruction --> </skill_list> <ex_crt_effect>true</ex_crt_effect> <ai aggroRange="300" clanHelpRange="300" /> @@ -2345,7 +2341,7 @@ <height normal="50" /> </collision> </npc> - <npc id="18855" level="85" type="L2Npc" name="Archery Knight"> + <npc id="18855" level="85" type="L2Monster" name="Archery Knight"> <!-- Confirmed CT2.5 --> <parameters> <skill name="Skill01_ID" id="6290" level="1" /> <!-- Power Strike --> @@ -2399,7 +2395,7 @@ <height normal="31" /> </collision> </npc> - <npc id="18856" level="85" type="L2Npc" name="Archery Knight"> + <npc id="18856" level="85" type="L2Monster" name="Archery Knight"> <!-- Confirmed CT2.5 --> <parameters> <skill name="Skill01_ID" id="6290" level="1" /> <!-- Power Strike --> diff --git a/L2J_DataPack_BETA/dist/game/data/stats/npcs/25600-25700.xml b/L2J_DataPack_BETA/dist/game/data/stats/npcs/25600-25700.xml index aaefb110807cc066673843063f8150b3184f5b26..531cb51af3386987416beb02ad94a19a7b8958df 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/npcs/25600-25700.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/npcs/25600-25700.xml @@ -6545,10 +6545,6 @@ <skill id="4416" level="6" /> <!--Humanoids --> <skill id="4494" level="1" /> <!--Raid Boss --> <skill id="5463" level="1" /> <!--Water Attacks --> - <skill id="6293" level="1" /> <!--Power Strike --> - <skill id="6294" level="1" /> <!--Leader's Roar --> - <skill id="6295" level="1" /> <!--Point Target --> - <skill id="6297" level="1" /> <!--Cylinder Throw --> <skill id="6298" level="1" /> <!--Summon Follower Knight --> <skill id="6661" level="1" /> <!--Level 85 Raid Boss --> </skill_list> diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/06300-06399.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/06300-06399.xml index 52cf81189db0e34aaa2ef76018fa20f4f0932bd1..b5199fb9433105d04638f6c3894eefbc98677910 100644 --- a/L2J_DataPack_BETA/dist/game/data/stats/skills/06300-06399.xml +++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/06300-06399.xml @@ -39,7 +39,7 @@ <set name="operateType" val="A2" /> <set name="targetType" val="AURA" /> <for> - <effect name="ManaDamOverTime" ticks="5" val="#mdot" /> + <effect name="ManaHealOverTime" ticks="5" val="#mdot" /> </for> </skill> <skill id="6302" levels="1" name="Cold Air">