Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Freya Hard Instance (Custom)

Iniciado por Swarlog, Ago 03, 2025, 12:44 AM

Tema anterior - Siguiente tema

Swarlog

Index: dist/game/data/instances/IceQueensCastleUltimateBattle.xml
===================================================================
--- dist/game/data/instances/IceQueensCastleUltimateBattle.xml	(revision 0)
+++ dist/game/data/instances/IceQueensCastleUltimateBattle.xml	(working copy)
@@ -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
Index: dist/game/data/scripts/ai/npc/Jinia/32781-07.html
===================================================================
--- dist/game/data/scripts/ai/npc/Jinia/32781-07.html	(revision 10440)
+++ dist/game/data/scripts/ai/npc/Jinia/32781-07.html	(working copy)
@@ -1,5 +1,5 @@
 <html><body>Jinia:<br>
 Her power is without equal. She truly is a frozen goddess. Are you sure you're ready?<br>
-<a action="bypass -h Quest Jinia 32781-05.html">"It's now or never."</a><br>
+<a action="bypass -h Quest IceQueensCastleUltimateBattle enter">"It's now or never."</a><br>
 <a action="bypass -h Quest Jinia 32781-08.html">"Perhaps I'll think again."</a>
 </body></html>
\ No newline at end of file
Index: dist/game/data/scripts/ai/npc/Sirra/32762-hard.html
===================================================================
--- dist/game/data/scripts/ai/npc/Sirra/32762-hard.html	(revision 10440)
+++ dist/game/data/scripts/ai/npc/Sirra/32762-hard.html	(working copy)
@@ -1,4 +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>
+<a action="bypass -h Quest IceQueensCastleUltimateBattle openDoor">Open door</a>
 </body></html>
Index: dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851-01.html
===================================================================
--- dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851-01.html	(revision 0)
+++ dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851-01.html	(working copy)
@@ -0,0 +1,3 @@
+<html><body>Kegor:<br>
+I'd entrust your associate with this mission, but..
+</body></html>
Index: dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851.html
===================================================================
--- dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851.html	(revision 0)
+++ dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/18851.html	(working copy)
@@ -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 IceQueensCastleUltimateBattle killFreya">Rest in peace!</a><br>
+<a action="bypass -h Quest IceQueensCastleUltimateBattle 18851-01.html">Can I have a second with you?</a>
+</body></html>
\ No newline at end of file
Index: dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/IceQueensCastleUltimateBattle.java
===================================================================
--- dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/IceQueensCastleUltimateBattle.java	(revision 0)
+++ dist/game/data/scripts/instances/IceQueensCastleUltimateBattle/IceQueensCastleUltimateBattle.java	(working copy)
@@ -0,0 +1,1376 @@
+/*
+ * 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.IceQueensCastleUltimateBattle;
+
+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 (Normal Battle) instance zone.
+ * @author St3eT
+ */
+public final class IceQueensCastleUltimateBattle extends AbstractNpcAI
+{
+	protected class IQCUBWorld extends InstanceWorld
+	{
+		List<L2PcInstance> playersInside = new ArrayList<>();
+		List<L2Npc> knightStatues = new ArrayList<>();
+		List<L2Attackable> 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
+	private static final int INVISIBLE_NPC = 18919;
+	private static final int KNIGHT = 18856; // Archery Knight
+	private static final int GLACIER = 18853; // Glacier
+	private static final int BREATH = 18854; // Archer's Breath
+	private static final int GLAKIAS = 25700; // 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 = 4;
+	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 = 144; // Ice Queen's Castle
+	private static final int DOOR_ID = 23140101;
+	
+	private IceQueensCastleUltimateBattle()
+	{
+		super(IceQueensCastleUltimateBattle.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, "IceQueensCastleUltimateBattle.xml");
+		}
+		else
+		{
+			final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
+			
+			if ((tmpworld != null) && (tmpworld instanceof IQCUBWorld))
+			{
+				final IQCUBWorld world = (IQCUBWorld) 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":
+					{
+						if (world.freya != null)
+						{
+							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 IQCUBWorld))
+		{
+			final IQCUBWorld world = (IQCUBWorld) 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 != null) && (tmpworld instanceof IQCUBWorld))
+		{
+			final IQCUBWorld world = (IQCUBWorld) 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 != null) && (tmpworld instanceof IQCUBWorld))
+		{
+			final IQCUBWorld world = (IQCUBWorld) 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 IQCUBWorld))
+		{
+			final IQCUBWorld world = (IQCUBWorld) 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 IQCUBWorld)
+			{
+				// 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 IQCUBWorld();
+			world.setInstanceId(InstanceManager.getInstance().createDynamicInstance(template));
+			world.setTemplateId(INSTANCEID);
+			world.setStatus(0);
+			InstanceManager.getInstance().addWorld(world);
+			_log.info("Ice Queen Castle started (Ultimate Battle)" + template + " Instance: " + world.getInstanceId() + " created by player: " + player.getName());
+			
+			if (!player.isInParty())
+			{
+				managePlayerEnter(player, (IQCUBWorld) world);
+			}
+			else if (player.getParty().isInCommandChannel())
+			{
+				for (L2PcInstance players : player.getParty().getCommandChannel().getMembers())
+				{
+					managePlayerEnter(players, (IQCUBWorld) world);
+				}
+			}
+			else
+			{
+				for (L2PcInstance players : player.getParty().getMembers())
+				{
+					managePlayerEnter(players, (IQCUBWorld) world);
+				}
+			}
+		}
+	}
+	
+	private void managePlayerEnter(L2PcInstance player, IQCUBWorld 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(IQCUBWorld world, L2Attackable mob)
+	{
+		final List<L2PcInstance> 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(IQCUBWorld world)
+	{
+		world.canSpawnMobs = false;
+		for (L2Attackable mobs : world.spawnedMobs)
+		{
+			if ((mobs != null) && !mobs.isDead())
+			{
+				mobs.doDie(null);
+			}
+		}
+	}
+	
+	private void manageTimer(IQCUBWorld 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(IQCUBWorld world, NpcStringId stringId)
+	{
+		for (L2PcInstance players : world.playersInside)
+		{
+			if ((players != null) && (players.getInstanceId() == world.getInstanceId()))
+			{
+				showOnScreenMsg(players, stringId, 2, 6000);
+			}
+		}
+	}
+	
+	private void manageMovie(IQCUBWorld 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 IceQueensCastleUltimateBattle();
+	}
+}
\ No newline at end of file