Hard Freya
Forum rules
READ NOW: L2j Forums Rules of Conduct
READ NOW: L2j Forums Rules of Conduct
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Hard Freya
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?
-
- Posts: 55
- Joined: Thu Sep 11, 2014 10:05 am
- Location: Slovakia
Re: Hard Freya
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?
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Re: Hard Freya
And share no similar Hard Freya?
- CostyKiller
- Posts: 220
- Joined: Mon Aug 10, 2009 11:48 pm
- Location: Romania
Re: Hard Freya
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.
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Re: Hard Freya
And you don't want to share?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.

-
- Posts: 55
- Joined: Thu Sep 11, 2014 10:05 am
- Location: Slovakia
Re: Hard Freya
There are more differences between Easy and Hard freya than just npc IDs. 

All of time and space everything that ever happened or ever will - where do you want to start?
- CostyKiller
- Posts: 220
- Joined: Mon Aug 10, 2009 11:48 pm
- Location: Romania
Re: Hard Freya
I know there are more changes but still is better than nothing.
Here are the modifications:
Here are the modifications:
Gist by: anonymous
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Re: Hard Freya
Thank!CostyKiller wrote:I know there are more changes but still is better than nothing.
Here are the modifications:Gist by: anonymousThis file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
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
- UnAfraid
- L2j Veteran
- Posts: 4199
- Joined: Mon Jul 23, 2007 4:25 pm
- Location: Bulgaria
- Contact:
Re: Hard Freya
To highlight it the filename must have .diff as extension
like that:
like that:
Gist by: UnAfraid
- CostyKiller
- Posts: 220
- Joined: Mon Aug 10, 2009 11:48 pm
- Location: Romania
Re: Hard Freya
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?
I must put diff extension in the space where I write the file name too?
-
- L2j Veteran
- Posts: 855
- Joined: Mon May 03, 2010 8:38 am
- Location: France
Re: Hard Freya
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.
- UnAfraid
- L2j Veteran
- Posts: 4199
- Joined: Mon Jul 23, 2007 4:25 pm
- Location: Bulgaria
- Contact:
Re: Hard Freya
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.diffCostyKiller 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?
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Re: Hard Freya
Hit "It's now or never." and no effect =/CostyKiller wrote:I know there are more changes but still is better than nothing.
Here are the modifications:Gist by: anonymousThis file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
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
- CostyKiller
- Posts: 220
- Joined: Mon Aug 10, 2009 11:48 pm
- Location: Romania
Re: Hard Freya
I think you forgot to add the instance in scripts.cfg
-
- Posts: 366
- Joined: Sat Jun 30, 2012 8:25 am
- Contact:
Re: Hard Freya
Always forget about scripts.cfgCostyKiller wrote:I think you forgot to add the instance in scripts.cfg
