Hard Freya

Support for the latest build of L2J Server, get help here with installations, upgrades, problems.
Do not post bugs reports here, use viewforum.php?f=77 instead.
There is no support for other server builds than the official provided by l2jserver.com
Forum rules
READ NOW: L2j Forums Rules of Conduct
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Hard Freya

Post by Driad »

When approximately can we expect the official add Hard Freya in L2jServer High five unstable? Or maybe have a separate Custom Mods for L2jServer High Five Unstable?
FallenAngel
Posts: 55
Joined: Thu Sep 11, 2014 10:05 am
Location: Slovakia

Re: Hard Freya

Post by FallenAngel »

Since developer what create Easy Freya left the L2j it's in stars.
All of time and space everything that ever happened or ever will - where do you want to start?
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Re: Hard Freya

Post by Driad »

And share no similar Hard Freya?
User avatar
CostyKiller
Posts: 220
Joined: Mon Aug 10, 2009 11:48 pm
Location: Romania

Re: Hard Freya

Post by CostyKiller »

I just copied the easy Freya instance and changed the instance template id and ids from monsters to the hard ones and use it that way.
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Re: Hard Freya

Post by Driad »

CostyKiller wrote:I just copied the easy Freya instance and changed the instance template id and ids from monsters to the hard ones and use it that way.
And you don't want to share? :)
FallenAngel
Posts: 55
Joined: Thu Sep 11, 2014 10:05 am
Location: Slovakia

Re: Hard Freya

Post by FallenAngel »

There are more differences between Easy and Hard freya than just npc IDs. :P
All of time and space everything that ever happened or ever will - where do you want to start?
User avatar
CostyKiller
Posts: 220
Joined: Mon Aug 10, 2009 11:48 pm
Location: Romania

Re: Hard Freya

Post by CostyKiller »

I know there are more changes but still is better than nothing.
Here are the modifications:
Gist by: anonymous
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
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Re: Hard Freya

Post by Driad »

CostyKiller wrote:I know there are more changes but still is better than nothing.
Here are the modifications:
Gist by: anonymous
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
Thank!
User avatar
UnAfraid
L2j Veteran
L2j Veteran
Posts: 4199
Joined: Mon Jul 23, 2007 4:25 pm
Location: Bulgaria
Contact:

Re: Hard Freya

Post by UnAfraid »

To highlight it the filename must have .diff as extension
like that:
Gist by: UnAfraid
Image
User avatar
CostyKiller
Posts: 220
Joined: Mon Aug 10, 2009 11:48 pm
Location: Romania

Re: Hard Freya

Post by CostyKiller »

I have selected from the language dropdown menu option diff.
I must put diff extension in the space where I write the file name too?
Sdw
L2j Veteran
L2j Veteran
Posts: 855
Joined: Mon May 03, 2010 8:38 am
Location: France

Re: Hard Freya

Post by Sdw »

Well the drop list usually fails, cause it's taking the default from the filename. If you put something.diff there, it choose diff automatically.
User avatar
UnAfraid
L2j Veteran
L2j Veteran
Posts: 4199
Joined: Mon Jul 23, 2007 4:25 pm
Location: Bulgaria
Contact:

Re: Hard Freya

Post by UnAfraid »

CostyKiller wrote:I have selected from the language dropdown menu option diff.
I must put diff extension in the space where I write the file name too?
That selection menu is just for the time you editing the file after that it will use filename to highlight it even if u selected diff it wont be used unless you set filename.diff
Image
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Re: Hard Freya

Post by Driad »

CostyKiller wrote:I know there are more changes but still is better than nothing.
Here are the modifications:
Gist by: anonymous
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
Hit "It's now or never." and no effect =/
User avatar
CostyKiller
Posts: 220
Joined: Mon Aug 10, 2009 11:48 pm
Location: Romania

Re: Hard Freya

Post by CostyKiller »

I think you forgot to add the instance in scripts.cfg
Driad
Posts: 366
Joined: Sat Jun 30, 2012 8:25 am
Contact:

Re: Hard Freya

Post by Driad »

CostyKiller wrote:I think you forgot to add the instance in scripts.cfg
Always forget about scripts.cfg :D, thanks!
Post Reply