diff --git a/trunk/dist/game/data/instances/IceQueensCastleHardBattle.xml b/trunk/dist/game/data/instances/IceQueensCastleHardBattle.xml
new file mode 100644
index 0000000000..982c1c7da2
--- /dev/null
+++ b/trunk/dist/game/data/instances/IceQueensCastleHardBattle.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts.cfg b/trunk/dist/game/data/scripts.cfg
index a59c2d482c..4c5fa51436 100644
--- a/trunk/dist/game/data/scripts.cfg
+++ b/trunk/dist/game/data/scripts.cfg
@@ -175,6 +175,7 @@ instances/ElcadiasTent/ElcadiasTent.java
instances/FinalEmperialTomb/FinalEmperialTomb.java
instances/HideoutOfTheDawn/HideoutOfTheDawn.java
instances/IceQueensCastle/IceQueensCastle.java
+instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java
instances/IceQueensCastleNormalBattle/IceQueensCastleNormalBattle.java
instances/JiniaGuildHideout1/JiniaGuildHideout1.java
instances/JiniaGuildHideout2/JiniaGuildHideout2.java
diff --git a/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-07.html b/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-07.html
index a93cd0e1c4..8df9cdd46f 100644
--- a/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-07.html
+++ b/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-07.html
@@ -1,5 +1,5 @@
Jinia:
Her power is without equal. She truly is a frozen goddess. Are you sure you're ready?
-"It's now or never."
+"It's now or never."
"Perhaps I'll think again."
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-10.html b/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-10.html
index d460409b60..f08e49ae0c 100644
--- a/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-10.html
+++ b/trunk/dist/game/data/scripts/ai/npc/Jinia/32781-10.html
@@ -1,5 +1,6 @@
Jinia:
Alright, we'll depart now. Keep those nerves of steel!
Enter the Ice Queen's Castle.
+Enter the Ice Queen's Castle (Hard).
"Wait a moment, I'm not ready."
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html b/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html
index 8fde7c56dc..6d82c4fc06 100644
--- a/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html
+++ b/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hard.html
@@ -1,4 +1,4 @@
Sirra:
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...
-Open door
+Open door
diff --git a/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html b/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html
index 4e28cc1427..100fe581e6 100644
--- a/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html
+++ b/trunk/dist/game/data/scripts/ai/npc/Sirra/32762-hardfight.html
@@ -1,4 +1,4 @@
Sirra:
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.
-I will go in.
+I will go in.
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851-01.html b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851-01.html
new file mode 100644
index 0000000000..8ca0096f88
--- /dev/null
+++ b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851-01.html
@@ -0,0 +1,3 @@
+Kegor:
+I'd entrust your associate with this mission, but..
+
diff --git a/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851.html b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851.html
new file mode 100644
index 0000000000..095f3aa301
--- /dev/null
+++ b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/18851.html
@@ -0,0 +1,6 @@
+Kegor:
+Without you, we would have failed. I can't thank you enough.
+Freya's last breath will flutter against your blade, I can feel it!
+Rest in peace!
+Can I have a second with you?
+
\ No newline at end of file
diff --git a/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.java
new file mode 100644
index 0000000000..f3147758d2
--- /dev/null
+++ b/trunk/dist/game/data/scripts/instances/IceQueensCastleHardBattle/IceQueensCastleHardBattle.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 .
+ */
+package instances.IceQueensCastleHardBattle;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+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.Skill;
+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 (Hard Battle) instance zone.
+ * @author St3eT
+ */
+public final class IceQueensCastleHardBattle extends AbstractNpcAI
+{
+ protected class IQCNBWorld extends InstanceWorld
+ {
+ List playersInside = new ArrayList<>();
+ List knightStatues = new ArrayList<>();
+ List spawnedMobs = new CopyOnWriteArrayList<>();
+ 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 = 29180; // Last freya (hard)
+ private static final int INVISIBLE_NPC = 18919;
+ private static final int KNIGHT = 18856; // Archery Knight (hard)
+ private static final int GLACIER = 18853; // Glacier
+ private static final int BREATH = 18854; // Archer's Breath
+ private static final int GLAKIAS = 25700; // Glakias (hard)
+ 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 = 45; // (hard)
+ private static final int MIN_PLAYERS = 36; // (hard)
+ 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 TEMPLATE_ID = 144; // Ice Queen's Castle (hard)
+ private static final int DOOR_ID = 23140101;
+
+ private IceQueensCastleHardBattle()
+ {
+ super(IceQueensCastleHardBattle.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, "IceQueensCastleHardBattle.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 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, Skill skill)
+ {
+ final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
+
+ if (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, Skill skill)
+ {
+ final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
+
+ if (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 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(), TEMPLATE_ID, reenter.getTimeInMillis());
+ final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.INSTANT_ZONE_S1_S_ENTRY_HAS_BEEN_RESTRICTED_YOU_CAN_CHECK_THE_NEXT_POSSIBLE_ENTRY_TIME_BY_USING_THE_COMMAND_INSTANCEZONE);
+ sm.addInstanceName(TEMPLATE_ID);
+ 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.YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON);
+ return;
+ }
+
+ if (checkConditions(player))
+ {
+ world = new IQCNBWorld();
+ world.setInstanceId(InstanceManager.getInstance().createDynamicInstance(template));
+ world.setTemplateId(TEMPLATE_ID);
+ world.setStatus(0);
+ InstanceManager.getInstance().addWorld(world);
+ _log.info("Ice Queen Castle started (Hard 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.YOU_ARE_NOT_CURRENTLY_IN_A_PARTY_SO_YOU_CANNOT_ENTER);
+ return false;
+ }
+ else if (channel == null)
+ {
+ player.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_BECAUSE_YOU_ARE_NOT_ASSOCIATED_WITH_THE_CURRENT_COMMAND_CHANNEL);
+ return false;
+ }
+ else if (player != channel.getLeader())
+ {
+ player.sendPacket(SystemMessageId.ONLY_A_PARTY_LEADER_CAN_MAKE_THE_REQUEST_TO_ENTER);
+ return false;
+ }
+ else if ((channel.getMemberCount() < MIN_PLAYERS) || (channel.getMemberCount() > MAX_PLAYERS))
+ {
+ player.sendPacket(SystemMessageId.YOU_CANNOT_ENTER_DUE_TO_THE_PARTY_HAVING_EXCEEDED_THE_LIMIT);
+ return false;
+ }
+ for (L2PcInstance channelMember : channel.getMembers())
+ {
+ if (channelMember.getLevel() < MIN_LEVEL)
+ {
+ SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_S_LEVEL_DOES_NOT_CORRESPOND_TO_THE_REQUIREMENTS_FOR_ENTRY);
+ sm.addPcName(channelMember);
+ party.broadcastPacket(sm);
+ return false;
+ }
+ else if (!Util.checkIfInRange(1000, player, channelMember, true))
+ {
+ SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_IS_IN_A_LOCATION_WHICH_CANNOT_BE_ENTERED_THEREFORE_IT_CANNOT_BE_PROCESSED);
+ sm.addPcName(channelMember);
+ party.broadcastPacket(sm);
+ return false;
+ }
+ else if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(channelMember.getObjectId(), TEMPLATE_ID))
+ {
+ SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_MAY_NOT_RE_ENTER_YET);
+ sm.addPcName(channelMember);
+ party.broadcastPacket(sm);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void manageRandomAttack(IQCNBWorld world, L2Attackable mob)
+ {
+ final List players = new ArrayList<>();
+ for (L2PcInstance player : world.playersInside)
+ {
+ if ((player != null) && !player.isDead() && (player.getInstanceId() == world.getInstanceId()) && !player.isInvisible())
+ {
+ players.add(player);
+ }
+ }
+
+ Collections.shuffle(players);
+ final L2PcInstance target = (!players.isEmpty()) ? 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 IceQueensCastleHardBattle();
+ }
+}
\ No newline at end of file