Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-01.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-01.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-01.html (working copy)
- @@ -0,0 +1,4 @@
- +<html><body>Blackbird Clan Lord Leona Blackbird:<br>
- +Let us defeat our enemies.<br>
- +Let's go to Etis van Etina, the Head of the Embryo, as fast as we can.
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-02.htm
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-02.htm (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-02.htm (working copy)
- @@ -0,0 +1,5 @@
- +<html><body>Blackbird Clan Lord Leona Blackbird:<br>
- +Thanks to you, we were able to come this far this time.<br>
- +But why is it so quiet? It can't be this empty...<br>
- +<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest EtisVanEtinaSolo startStage2">"I have a bad feeling about this."</Button>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-03.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-03.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-03.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Blackbird Clan Lord Leona Blackbird:<br>
- +You don't have to worry ab- Ah! Oh no! What's that?<br>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34471.htm
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34471.htm (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34471.htm (working copy)
- @@ -0,0 +1,5 @@
- +<html><body>Blackbird Clan Lord Leona Blackbird:<br>
- +This is <font color="GOLD"> the Great Etina Temple.</font> Setting foot in this place again reminds me of old memories. I used my new power to sneak in so the enemy should be unaware of our presence.<br>
- +Now, let's take down the Embryos and Etis van Etina before they even realize. Are you ready?<br>
- +<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest EtisVanEtinaSolo startStage1">"Yes, I'm ready."</Button>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34472.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34472.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34472.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Devianne:<br>
- +Behold the power of the Ivory Tower Wizards!<br>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34473.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34473.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34473.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Elikia:<br>
- +Let's take down the Embryos and Etis van Etina before they even realize.<br>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34474.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34474.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34474.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Sporcha:<br>
- +Are you ready to fight?<br>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/34475.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/34475.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/34475.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Aliber:<br>
- +Rage against all that stands in our way!<br>
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperAliber.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperAliber.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperAliber.java (working copy)
- @@ -0,0 +1,283 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.ai.CtrlIntention;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.geoengine.GeoEngine;
- +import org.l2jmobius.gameserver.model.Location;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.WorldObject;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpcInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked;
- +import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
- +import org.l2jmobius.gameserver.model.holders.SkillHolder;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
- +import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
- +
- +import ai.AbstractNpcAI;
- +
- +/**
- + * Etina Helper Aliber AI.
- + * @author CostyKiller
- + */
- +public class EtinaHelperAliber extends AbstractNpcAI
- +{
- + // NPCs
- + private static final int ETINA_HELPER_ALIBER = 34475;
- + // Corridor Mobs
- + //@formatter:off
- + private static final int[] CORRIDOR_MOBS_1 = {24173, 24174, 24175, 24176};
- + private static final int[] CORRIDOR_MOBS_2 = {24180, 24181, 24182, 24183};
- + private static final int[] CORRIDOR_MOBS_3 = {24184, 24185, 24186, 24187, 24188, 24189, 24190, 24191, 24192};
- + private static final int[] NOT_ATK_NPCS =
- + {
- + 33798, // Common Decoration - Barricade
- + 19677, // Seal of Gnosis
- + 19678, // Seal of Strife
- + 19679, // Seal of Avarice
- + 19680, // Seal of Punishment
- + 19681, // Seal of Awakening
- + 19682, // Seal of Calamity
- + 19683, // Seal of Destruction
- + };
- + private static final int[] ETINA_HELPERS =
- + {
- + 34471, // Leona Blackbird
- + 34472, // Devianne
- + 34473, // Elikia
- + 34474, // Sporcha
- + 34475, // Aliber
- + };
- + // Skill Cast Locations
- + private static final Location[] SKILL_CAST_LOCATIONS =
- + {
- + new Location(-245751, 182321, 2861, 16612), // First barricade line
- + new Location(-245751, 184001, 3025, 16612), // Second barricade line
- + new Location(-245751, 185298, 3031, 16612), // Third barricade line
- + new Location(-245751, 186612, 3038, 16612), // Fourth barricade line
- + };
- + // Support Npcs Skills
- + private static final SkillHolder BARRICADE_DESTRUCTION = new SkillHolder(32286, 1);
- + // Misc
- + private static final int[] ETINA_SOLO_INSTANCES =
- + {
- + 292, // Fall of Etina (Solo)
- + 293, // Fall of Etina (Solo)
- + };
- +
- + private EtinaHelperAliber()
- + {
- + setCreatureAttackedId(this::onCreatureAttacked, ETINA_HELPER_ALIBER);
- + addSpellFinishedId(ETINA_HELPER_ALIBER);
- + addSeeCreatureId(ETINA_HELPER_ALIBER);
- + setInstanceStatusChangeId(this::onInstanceStatusChange, ETINA_SOLO_INSTANCES);
- + }
- +
- + @Override
- + public void onTimerEvent(String event, StatSet params, Npc npc, PlayerInstance player)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if (instance != null)
- + {
- + switch (event)
- + {
- + case "CHECK_ACTION":
- + {
- + final StatSet npcVars = npc.getVariables();
- + final PlayerInstance plr = npcVars.getObject("PLAYER_OBJECT", PlayerInstance.class);
- + final MonsterInstance monster = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (plr != null)
- + {
- + final double distance = npc.calculateDistance2D(plr);
- + if (!npc.isAttackingNow() && !npc.isMoving() && (distance > 250))
- + {
- + final Location loc = new Location(plr.getX(), plr.getY(), plr.getZ() + 50);
- + final Location randLoc = new Location(loc.getX() + getRandom(-100, 100), loc.getY() + getRandom(-100, 100), loc.getZ());
- + if (distance > 600)
- + {
- + npc.teleToLocation(loc);
- + }
- + else
- + {
- + npc.setRunning();
- + }
- + addMoveToDesire(npc, randLoc, 23);
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + }
- + else if (!npc.isInCombat() || !npc.isAttackingNow() || (npc.getTarget() == null))
- + {
- + WorldObject target = npc.getTarget();
- + if (target == null)
- + {
- + npc.setTarget(monster);
- + }
- + if ((target != null) && !target.isInvul() && target.isTargetable() && GeoEngine.getInstance().canSeeTarget(npc, target) && !CommonUtil.contains(NOT_ATK_NPCS, target.getId()) && !CommonUtil.contains(ETINA_HELPERS, target.getId()))
- + {
- + npc.setInvul(true);
- + npc.setRunning();
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + addAttackDesire(npc, (Creature) target);
- + // addSkillCastDesire(npc, target, ALIBER_SPLASH, 23);
- + // npc.reduceCurrentHp(1, monster, null);
- + }
- + }
- + }
- + break;
- + }
- + case "DESTROY_BARRICADES":
- + {
- + final FriendlyNpcInstance _aliber = (FriendlyNpcInstance) instance.getNpc(ETINA_HELPER_ALIBER);
- + boolean BARRICADE_DESTROYED = instance.getParameters().getBoolean("BARRICADE_DESTROYED", false);
- + if (!instance.getNpcsOfGroup("BARRICADES_1").isEmpty())
- + {
- + _aliber.setRunning();
- + _aliber.setInvul(true);
- + _aliber.setCanReturnToSpawnPoint(false);
- + _aliber.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, SKILL_CAST_LOCATIONS[0]);
- + if (_aliber.getLocation().isIn2DRadius(SKILL_CAST_LOCATIONS[0], 200) && (BARRICADE_DESTROYED == false))
- + {
- + _aliber.broadcastPacket(new MagicSkillUse(_aliber, _aliber, BARRICADE_DESTRUCTION.getSkillId(), 1, 500, 0));
- + _aliber.broadcastPacket(new ExShowScreenMessage(NpcStringId.ALIBER_IS_CASTING_A_SPELL_TO_DESTROY_THE_BARRICADE, ExShowScreenMessage.TOP_CENTER, 7000, true));
- + instance.getNpcsOfGroup("BARRICADES_1").forEach(barricade ->
- + {
- + if (barricade != null)
- + {
- + barricade.decayMe();
- + }
- + });
- + instance.getParameters().set("BARRICADE_DESTROYED", true);
- + instance.despawnGroup("BARRICADES_1");
- + }
- + }
- + else if (!instance.getNpcsOfGroup("BARRICADES_2").isEmpty() && instance.getAliveNpcs(CORRIDOR_MOBS_1).isEmpty() && instance.getNpcsOfGroup("BARRICADES_1").isEmpty())
- + {
- + _aliber.setRunning();
- + _aliber.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, SKILL_CAST_LOCATIONS[1]);
- + if (_aliber.getLocation().isIn2DRadius(SKILL_CAST_LOCATIONS[1], 200) && (BARRICADE_DESTROYED == false))
- + {
- + _aliber.broadcastPacket(new MagicSkillUse(_aliber, _aliber, BARRICADE_DESTRUCTION.getSkillId(), 1, 500, 0));
- + _aliber.broadcastPacket(new ExShowScreenMessage(NpcStringId.ALIBER_IS_CASTING_A_SPELL_TO_DESTROY_THE_BARRICADE, ExShowScreenMessage.TOP_CENTER, 7000, true));
- + instance.getNpcsOfGroup("BARRICADES_2").forEach(barricade ->
- + {
- + if (barricade != null)
- + {
- + barricade.decayMe();
- + }
- + });
- + instance.getParameters().set("BARRICADE_DESTROYED", true);
- + instance.despawnGroup("BARRICADES_2");
- + }
- + }
- + else if (!instance.getNpcsOfGroup("BARRICADES_3").isEmpty() && instance.getAliveNpcs(CORRIDOR_MOBS_2).isEmpty() && instance.getNpcsOfGroup("BARRICADES_2").isEmpty())
- + {
- + _aliber.setRunning();
- + _aliber.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, SKILL_CAST_LOCATIONS[2]);
- + if (_aliber.getLocation().isIn2DRadius(SKILL_CAST_LOCATIONS[2], 200) && (BARRICADE_DESTROYED == false))
- + {
- + _aliber.broadcastPacket(new MagicSkillUse(_aliber, _aliber, BARRICADE_DESTRUCTION.getSkillId(), 1, 500, 0));
- + _aliber.broadcastPacket(new ExShowScreenMessage(NpcStringId.ALIBER_IS_CASTING_A_SPELL_TO_DESTROY_THE_BARRICADE, ExShowScreenMessage.TOP_CENTER, 7000, true));
- + instance.getNpcsOfGroup("BARRICADES_3").forEach(barricade ->
- + {
- + if (barricade != null)
- + {
- + barricade.decayMe();
- + }
- + });
- + instance.getParameters().set("BARRICADE_DESTROYED", true);
- + instance.despawnGroup("BARRICADES_3");
- + }
- + }
- + else if (!instance.getNpcsOfGroup("BARRICADES_4").isEmpty() && instance.getAliveNpcs(CORRIDOR_MOBS_3).isEmpty() && instance.getNpcsOfGroup("BARRICADES_3").isEmpty())
- + {
- + _aliber.setRunning();
- + _aliber.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, SKILL_CAST_LOCATIONS[3]);
- + if (_aliber.getLocation().isIn2DRadius(SKILL_CAST_LOCATIONS[3], 200) && (BARRICADE_DESTROYED == false))
- + {
- + _aliber.broadcastPacket(new MagicSkillUse(_aliber, _aliber, BARRICADE_DESTRUCTION.getSkillId(), 1, 500, 0));
- + _aliber.broadcastPacket(new ExShowScreenMessage(NpcStringId.ALIBER_IS_CASTING_A_SPELL_TO_DESTROY_THE_BARRICADE, ExShowScreenMessage.TOP_CENTER, 7000, true));
- + instance.getNpcsOfGroup("BARRICADES_4").forEach(barricade ->
- + {
- + if (barricade != null)
- + {
- + barricade.decayMe();
- + }
- + });
- + instance.getParameters().set("BARRICADE_DESTROYED", true);
- + instance.despawnGroup("BARRICADES_4");
- + }
- + }
- + }
- + break;
- + }
- + }
- + }
- +
- + public void onCreatureAttacked(OnCreatureAttacked event)
- + {
- + final FriendlyNpcInstance npc = (FriendlyNpcInstance) event.getTarget();
- + if (npc != null)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && !event.getAttacker().isPlayable() && !CommonUtil.contains(ETINA_HELPERS, event.getAttacker().getId()))
- + {
- + if (!npc.isInCombat())
- + {
- + if (getRandom(50) < 5)
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.RAGE_AGAINST_ALL_THAT_STANDS_IN_OUR_WAY);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onInstanceStatusChange(OnInstanceStatusChange event)
- + {
- + final Instance instance = event.getWorld();
- + final int status = event.getStatus();
- + if ((status == 1) || (status == 2) || (status == 3))
- + {
- + instance.getAliveNpcs(ETINA_HELPER_ALIBER).forEach(etinaHelperAliber -> getTimers().addRepeatingTimer("CHECK_ACTION", 3000, etinaHelperAliber, null));
- + instance.getAliveNpcs(ETINA_HELPER_ALIBER).forEach(etinaHelperAliber -> getTimers().addRepeatingTimer("USE_SKILL", 6000, etinaHelperAliber, null));
- + instance.getAliveNpcs(ETINA_HELPER_ALIBER).forEach(etinaHelperAliber -> getTimers().addRepeatingTimer("DESTROY_BARRICADES", 5000, etinaHelperAliber, null));
- + }
- + }
- +
- + @Override
- + public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
- + {
- + if (creature.isPlayer())
- + {
- + npc.getVariables().set("PLAYER_OBJECT", creature.getActingPlayer());
- + }
- + return super.onSeeCreature(npc, creature, isSummon);
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtinaHelperAliber();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperDevianne.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperDevianne.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperDevianne.java (working copy)
- @@ -0,0 +1,171 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.geoengine.GeoEngine;
- +import org.l2jmobius.gameserver.model.Location;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.WorldObject;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpcInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked;
- +import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +
- +import ai.AbstractNpcAI;
- +
- +/**
- + * Etina Helper Devianne AI.
- + * @author CostyKiller
- + */
- +public class EtinaHelperDevianne extends AbstractNpcAI
- +{
- + // NPCs
- + private static final int ETINA_HELPER_DEVIANNE = 34472;
- + private static final int[] NOT_ATK_NPCS =
- + {
- + 33798, // Common Decoration - Barricade
- + 19677, // Seal of Gnosis
- + 19678, // Seal of Strife
- + 19679, // Seal of Avarice
- + 19680, // Seal of Punishment
- + 19681, // Seal of Awakening
- + 19682, // Seal of Calamity
- + 19683, // Seal of Destruction
- + };
- + private static final int[] ETINA_HELPERS =
- + {
- + 34471, // Leona Blackbird
- + 34472, // Devianne
- + 34473, // Elikia
- + 34474, // Sporcha
- + 34475, // Aliber
- + };
- + // Misc
- + private static final int[] ETINA_SOLO_INSTANCES =
- + {
- + 292, // Fall of Etina (Solo)
- + 293, // Fall of Etina (Solo)
- + };
- +
- + private EtinaHelperDevianne()
- + {
- + setCreatureAttackedId(this::onCreatureAttacked, ETINA_HELPER_DEVIANNE);
- + addSpellFinishedId(ETINA_HELPER_DEVIANNE);
- + addSeeCreatureId(ETINA_HELPER_DEVIANNE);
- + setInstanceStatusChangeId(this::onInstanceStatusChange, ETINA_SOLO_INSTANCES);
- + }
- +
- + @Override
- + public void onTimerEvent(String event, StatSet params, Npc npc, PlayerInstance player)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && event.equals("CHECK_ACTION"))
- + {
- + final StatSet npcVars = npc.getVariables();
- + final PlayerInstance plr = npcVars.getObject("PLAYER_OBJECT", PlayerInstance.class);
- + final MonsterInstance monster = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (plr != null)
- + {
- + final double distance = npc.calculateDistance2D(plr);
- + if (!npc.isAttackingNow() && !npc.isMoving() && (distance > 250))
- + {
- + final Location loc = new Location(plr.getX(), plr.getY(), plr.getZ() + 50);
- + final Location randLoc = new Location(loc.getX() + getRandom(-100, 100), loc.getY() + getRandom(-100, 100), loc.getZ());
- + if (distance > 600)
- + {
- + npc.teleToLocation(loc);
- + }
- + else
- + {
- + npc.setRunning();
- + }
- + addMoveToDesire(npc, randLoc, 23);
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + }
- + else if (!npc.isInCombat() || !npc.isAttackingNow() || (npc.getTarget() == null))
- + {
- + WorldObject target = npc.getTarget();
- + if (target == null)
- + {
- + npc.setTarget(monster);
- + }
- + if ((target != null) && !target.isInvul() && target.isTargetable() && GeoEngine.getInstance().canSeeTarget(npc, target) && !CommonUtil.contains(NOT_ATK_NPCS, target.getId()) && !CommonUtil.contains(ETINA_HELPERS, target.getId()))
- + {
- + npc.setInvul(true);
- + npc.setRunning();
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + addAttackDesire(npc, (Creature) target);
- + // npc.reduceCurrentHp(1, monster, null);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onCreatureAttacked(OnCreatureAttacked event)
- + {
- + final FriendlyNpcInstance npc = (FriendlyNpcInstance) event.getTarget();
- + if (npc != null)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && !event.getAttacker().isPlayable() && !CommonUtil.contains(ETINA_HELPERS, event.getAttacker().getId()))
- + {
- + if (!npc.isInCombat())
- + {
- + if (getRandom(50) < 5)
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.BEHOLD_THE_POWER_OF_THE_IVORY_TOWER_WIZARDS);
- + }
- +
- + }
- + }
- + }
- + }
- +
- + public void onInstanceStatusChange(OnInstanceStatusChange event)
- + {
- + final Instance instance = event.getWorld();
- + final int status = event.getStatus();
- + if ((status == 1) || (status == 2) || (status == 3))
- + {
- + instance.getAliveNpcs(ETINA_HELPER_DEVIANNE).forEach(etinaHelperDevianne -> getTimers().addRepeatingTimer("CHECK_ACTION", 3000, etinaHelperDevianne, null));
- + }
- + }
- +
- + @Override
- + public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
- + {
- + if (creature.isPlayer())
- + {
- + npc.getVariables().set("PLAYER_OBJECT", creature.getActingPlayer());
- + }
- + return super.onSeeCreature(npc, creature, isSummon);
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtinaHelperDevianne();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperElikia.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperElikia.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperElikia.java (working copy)
- @@ -0,0 +1,170 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.geoengine.GeoEngine;
- +import org.l2jmobius.gameserver.model.Location;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.WorldObject;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpcInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked;
- +import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +
- +import ai.AbstractNpcAI;
- +
- +/**
- + * Etina Helper Elikia AI.
- + * @author CostyKiller
- + */
- +public class EtinaHelperElikia extends AbstractNpcAI
- +{
- + // NPCs
- + private static final int ETINA_HELPER_ELIKIA = 34473;
- + private static final int[] NOT_ATK_NPCS =
- + {
- + 33798, // Common Decoration - Barricade
- + 19677, // Seal of Gnosis
- + 19678, // Seal of Strife
- + 19679, // Seal of Avarice
- + 19680, // Seal of Punishment
- + 19681, // Seal of Awakening
- + 19682, // Seal of Calamity
- + 19683, // Seal of Destruction
- + };
- + private static final int[] ETINA_HELPERS =
- + {
- + 34471, // Leona Blackbird
- + 34472, // Devianne
- + 34473, // Elikia
- + 34474, // Sporcha
- + 34475, // Aliber
- + };
- + // Misc
- + private static final int[] ETINA_SOLO_INSTANCES =
- + {
- + 292, // Fall of Etina (Solo)
- + 293, // Fall of Etina (Solo)
- + };
- +
- + private EtinaHelperElikia()
- + {
- + setCreatureAttackedId(this::onCreatureAttacked, ETINA_HELPER_ELIKIA);
- + addSpellFinishedId(ETINA_HELPER_ELIKIA);
- + addSeeCreatureId(ETINA_HELPER_ELIKIA);
- + setInstanceStatusChangeId(this::onInstanceStatusChange, ETINA_SOLO_INSTANCES);
- + }
- +
- + @Override
- + public void onTimerEvent(String event, StatSet params, Npc npc, PlayerInstance player)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && event.equals("CHECK_ACTION"))
- + {
- + final StatSet npcVars = npc.getVariables();
- + final PlayerInstance plr = npcVars.getObject("PLAYER_OBJECT", PlayerInstance.class);
- + final MonsterInstance monster = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (plr != null)
- + {
- + final double distance = npc.calculateDistance2D(plr);
- + if (!npc.isAttackingNow() && !npc.isMoving() && (distance > 250))
- + {
- + final Location loc = new Location(plr.getX(), plr.getY(), plr.getZ() + 50);
- + final Location randLoc = new Location(loc.getX() + getRandom(-100, 100), loc.getY() + getRandom(-100, 100), loc.getZ());
- + if (distance > 600)
- + {
- + npc.teleToLocation(loc);
- + }
- + else
- + {
- + npc.setRunning();
- + }
- + addMoveToDesire(npc, randLoc, 23);
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + }
- + else if (!npc.isInCombat() || !npc.isAttackingNow() || (npc.getTarget() == null))
- + {
- + WorldObject target = npc.getTarget();
- + if (target == null)
- + {
- + npc.setTarget(monster);
- + }
- + if ((target != null) && !target.isInvul() && target.isTargetable() && GeoEngine.getInstance().canSeeTarget(npc, target) && !CommonUtil.contains(NOT_ATK_NPCS, target.getId()) && !CommonUtil.contains(ETINA_HELPERS, target.getId()))
- + {
- + npc.setInvul(true);
- + npc.setRunning();
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + addAttackDesire(npc, (Creature) target);
- + // npc.reduceCurrentHp(1, monster, null);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onCreatureAttacked(OnCreatureAttacked event)
- + {
- + final FriendlyNpcInstance npc = (FriendlyNpcInstance) event.getTarget();
- + if (npc != null)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && !event.getAttacker().isPlayable() && !CommonUtil.contains(ETINA_HELPERS, event.getAttacker().getId()))
- + {
- + if (!npc.isInCombat())
- + {
- + if (getRandom(50) < 5)
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.DON_T_GET_IN_MY_WAY);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onInstanceStatusChange(OnInstanceStatusChange event)
- + {
- + final Instance instance = event.getWorld();
- + final int status = event.getStatus();
- + if ((status == 1) || (status == 2) || (status == 3))
- + {
- + instance.getAliveNpcs(ETINA_HELPER_ELIKIA).forEach(etinaHelperElikia -> getTimers().addRepeatingTimer("CHECK_ACTION", 3000, etinaHelperElikia, null));
- + }
- + }
- +
- + @Override
- + public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
- + {
- + if (creature.isPlayer())
- + {
- + npc.getVariables().set("PLAYER_OBJECT", creature.getActingPlayer());
- + }
- + return super.onSeeCreature(npc, creature, isSummon);
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtinaHelperElikia();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperLeona.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperLeona.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperLeona.java (working copy)
- @@ -0,0 +1,203 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.geoengine.GeoEngine;
- +import org.l2jmobius.gameserver.model.Location;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.WorldObject;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpcInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked;
- +import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +
- +import ai.AbstractNpcAI;
- +
- +/**
- + * Etina Helper Leona AI.
- + * @author CostyKiller
- + */
- +public class EtinaHelperLeona extends AbstractNpcAI
- +{
- + // NPCs
- + private static final int ETINA_HELPER_LEONA = 34471;
- + private static final int[] NOT_ATK_NPCS =
- + {
- + 33798, // Common Decoration - Barricade
- + 19677, // Seal of Gnosis
- + 19678, // Seal of Strife
- + 19679, // Seal of Avarice
- + 19680, // Seal of Punishment
- + 19681, // Seal of Awakening
- + 19682, // Seal of Calamity
- + 19683, // Seal of Destruction
- + };
- + private static final int[] ETINA_HELPERS =
- + {
- + 34471, // Leona Blackbird
- + 34472, // Devianne
- + 34473, // Elikia
- + 34474, // Sporcha
- + 34475, // Aliber
- + };
- + // RB
- + private static final int ETIS_VAN_ETINA1 = 26321;
- + private static final int ETIS_VAN_ETINA2 = 26322;
- + private static final int KAIN_VAN_HALTER = 26235;
- + private static final int CAMILLE = 26236;
- + // Misc
- + private static final int[] ETINA_SOLO_INSTANCES =
- + {
- + 292, // Fall of Etina (Solo)
- + 293, // Fall of Etina (Solo)
- + };
- +
- + private EtinaHelperLeona()
- + {
- + setCreatureAttackedId(this::onCreatureAttacked, ETINA_HELPER_LEONA);
- + addSpellFinishedId(ETINA_HELPER_LEONA);
- + addSeeCreatureId(ETINA_HELPER_LEONA);
- + setInstanceStatusChangeId(this::onInstanceStatusChange, ETINA_SOLO_INSTANCES);
- + }
- +
- + @Override
- + public void onTimerEvent(String event, StatSet params, Npc npc, PlayerInstance player)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && event.equals("CHECK_ACTION"))
- + {
- + final StatSet npcVars = npc.getVariables();
- + final PlayerInstance plr = npcVars.getObject("PLAYER_OBJECT", PlayerInstance.class);
- + final MonsterInstance monster = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (plr != null)
- + {
- + final double distance = npc.calculateDistance2D(plr);
- + if (!npc.isAttackingNow() && !npc.isMoving() && (distance > 250))
- + {
- + final Location loc = new Location(plr.getX(), plr.getY(), plr.getZ() + 50);
- + final Location randLoc = new Location(loc.getX() + getRandom(-100, 100), loc.getY() + getRandom(-100, 100), loc.getZ());
- + if (distance > 600)
- + {
- + npc.teleToLocation(loc);
- + }
- + else
- + {
- + npc.setRunning();
- + }
- + addMoveToDesire(npc, randLoc, 23);
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + }
- + else if (!npc.isInCombat() || !npc.isAttackingNow() || (npc.getTarget() == null))
- + {
- + WorldObject target = npc.getTarget();
- + if (target == null)
- + {
- + npc.setTarget(monster);
- + }
- + if ((target != null) && !target.isInvul() && target.isTargetable() && GeoEngine.getInstance().canSeeTarget(npc, target) && !CommonUtil.contains(NOT_ATK_NPCS, target.getId()) && !CommonUtil.contains(ETINA_HELPERS, target.getId()))
- + {
- + npc.setInvul(true);
- + npc.setRunning();
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + addAttackDesire(npc, (Creature) target);
- + // npc.reduceCurrentHp(1, monster, null);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onCreatureAttacked(OnCreatureAttacked event)
- + {
- + final FriendlyNpcInstance npc = (FriendlyNpcInstance) event.getTarget();
- + final Npc attacker = (Npc) event.getAttacker();
- + if (npc != null)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && !event.getAttacker().isPlayable() && !CommonUtil.contains(ETINA_HELPERS, event.getAttacker().getId()))
- + {
- + if (!npc.isInCombat())
- + {
- + switch (attacker.getId())
- + {
- + default:
- + {
- + if (getRandom(50) < 5)
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.DON_T_GET_IN_MY_WAY);
- + }
- + break;
- + }
- + case CAMILLE:
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.GISELLE_NO_IS_SHE_CAMILLE_IN_THAT_STATE);
- + break;
- + }
- + case KAIN_VAN_HALTER:
- + {
- + break;
- + }
- + case ETIS_VAN_ETINA1:
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.EVEN_THE_MIGHTY_ETINA_SEEMS_TO_FEAR_US);
- + break;
- + }
- + case ETIS_VAN_ETINA2:
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ETIS_VAN_ETINA_WE_FINALLY_MEET);
- + break;
- + }
- + }
- + }
- + }
- + }
- + }
- +
- + public void onInstanceStatusChange(OnInstanceStatusChange event)
- + {
- + final Instance instance = event.getWorld();
- + final int status = event.getStatus();
- + if ((status == 1) || (status == 2) || (status == 3))
- + {
- + instance.getAliveNpcs(ETINA_HELPER_LEONA).forEach(etinaHelperLeona -> getTimers().addRepeatingTimer("CHECK_ACTION", 3000, etinaHelperLeona, null));
- + // instance.getAliveNpcs(ETINA_HELPER_LEONA).forEach(etinaHelperLeona -> getTimers().addRepeatingTimer("USE_SKILL", 6000, etinaHelperLeona, null));
- + }
- + }
- +
- + @Override
- + public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
- + {
- + if (creature.isPlayer())
- + {
- + npc.getVariables().set("PLAYER_OBJECT", creature.getActingPlayer());
- + }
- + return super.onSeeCreature(npc, creature, isSummon);
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtinaHelperLeona();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperSporcha.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperSporcha.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperSporcha.java (working copy)
- @@ -0,0 +1,170 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.geoengine.GeoEngine;
- +import org.l2jmobius.gameserver.model.Location;
- +import org.l2jmobius.gameserver.model.StatSet;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.WorldObject;
- +import org.l2jmobius.gameserver.model.actor.Creature;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.FriendlyNpcInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked;
- +import org.l2jmobius.gameserver.model.events.impl.instance.OnInstanceStatusChange;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +
- +import ai.AbstractNpcAI;
- +
- +/**
- + * Etina Helper Sporcha AI.
- + * @author CostyKiller
- + */
- +public class EtinaHelperSporcha extends AbstractNpcAI
- +{
- + // NPCs
- + private static final int ETINA_HELPER_SPORCHA = 34474;
- + private static final int[] NOT_ATK_NPCS =
- + {
- + 33798, // Common Decoration - Barricade
- + 19677, // Seal of Gnosis
- + 19678, // Seal of Strife
- + 19679, // Seal of Avarice
- + 19680, // Seal of Punishment
- + 19681, // Seal of Awakening
- + 19682, // Seal of Calamity
- + 19683, // Seal of Destruction
- + };
- + private static final int[] ETINA_HELPERS =
- + {
- + 34471, // Leona Blackbird
- + 34472, // Devianne
- + 34473, // Elikia
- + 34474, // Sporcha
- + 34475, // Aliber
- + };
- + // Misc
- + private static final int[] ETINA_SOLO_INSTANCES =
- + {
- + 292, // Fall of Etina (Solo)
- + 293, // Fall of Etina (Solo)
- + };
- +
- + private EtinaHelperSporcha()
- + {
- + setCreatureAttackedId(this::onCreatureAttacked, ETINA_HELPER_SPORCHA);
- + addSpellFinishedId(ETINA_HELPER_SPORCHA);
- + addSeeCreatureId(ETINA_HELPER_SPORCHA);
- + setInstanceStatusChangeId(this::onInstanceStatusChange, ETINA_SOLO_INSTANCES);
- + }
- +
- + @Override
- + public void onTimerEvent(String event, StatSet params, Npc npc, PlayerInstance player)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && event.equals("CHECK_ACTION"))
- + {
- + final StatSet npcVars = npc.getVariables();
- + final PlayerInstance plr = npcVars.getObject("PLAYER_OBJECT", PlayerInstance.class);
- + final MonsterInstance monster = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (plr != null)
- + {
- + final double distance = npc.calculateDistance2D(plr);
- + if (!npc.isAttackingNow() && !npc.isMoving() && (distance > 250))
- + {
- + final Location loc = new Location(plr.getX(), plr.getY(), plr.getZ() + 50);
- + final Location randLoc = new Location(loc.getX() + getRandom(-100, 100), loc.getY() + getRandom(-100, 100), loc.getZ());
- + if (distance > 600)
- + {
- + npc.teleToLocation(loc);
- + }
- + else
- + {
- + npc.setRunning();
- + }
- + addMoveToDesire(npc, randLoc, 23);
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + }
- + else if (!npc.isInCombat() || !npc.isAttackingNow() || (npc.getTarget() == null))
- + {
- + WorldObject target = npc.getTarget();
- + if (target == null)
- + {
- + npc.setTarget(monster);
- + }
- + if ((target != null) && !target.isInvul() && target.isTargetable() && GeoEngine.getInstance().canSeeTarget(npc, target) && !CommonUtil.contains(NOT_ATK_NPCS, target.getId()) && !CommonUtil.contains(ETINA_HELPERS, target.getId()))
- + {
- + npc.setInvul(true);
- + npc.setRunning();
- + ((FriendlyNpcInstance) npc).setCanReturnToSpawnPoint(false);
- + addAttackDesire(npc, (Creature) target);
- + // npc.reduceCurrentHp(1, monster, null);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onCreatureAttacked(OnCreatureAttacked event)
- + {
- + final FriendlyNpcInstance npc = (FriendlyNpcInstance) event.getTarget();
- + if (npc != null)
- + {
- + final Instance instance = npc.getInstanceWorld();
- + if ((instance != null) && !event.getAttacker().isPlayable() && !CommonUtil.contains(ETINA_HELPERS, event.getAttacker().getId()))
- + {
- + if (!npc.isInCombat())
- + {
- + if (getRandom(50) < 5)
- + {
- + npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.DON_T_GET_IN_MY_WAY);
- + }
- + }
- + }
- + }
- + }
- +
- + public void onInstanceStatusChange(OnInstanceStatusChange event)
- + {
- + final Instance instance = event.getWorld();
- + final int status = event.getStatus();
- + if ((status == 1) || (status == 2) || (status == 3))
- + {
- + instance.getAliveNpcs(ETINA_HELPER_SPORCHA).forEach(etinaHelperSporcha -> getTimers().addRepeatingTimer("CHECK_ACTION", 3000, etinaHelperSporcha, null));
- + }
- + }
- +
- + @Override
- + public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
- + {
- + if (creature.isPlayer())
- + {
- + npc.getVariables().set("PLAYER_OBJECT", creature.getActingPlayer());
- + }
- + return super.onSeeCreature(npc, creature, isSummon);
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtinaHelperSporcha();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/EtisVanEtinaSolo.java
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/EtisVanEtinaSolo.java (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/EtisVanEtinaSolo.java (working copy)
- @@ -0,0 +1,723 @@
- +/*
- + * This file is part of the L2J Mobius project.
- + *
- + * This program 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.
- + *
- + * This program 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.EtisVanEtinaSolo;
- +
- +import org.l2jmobius.commons.util.CommonUtil;
- +import org.l2jmobius.gameserver.enums.ChatType;
- +import org.l2jmobius.gameserver.enums.Movie;
- +import org.l2jmobius.gameserver.model.World;
- +import org.l2jmobius.gameserver.model.actor.Attackable;
- +import org.l2jmobius.gameserver.model.actor.Npc;
- +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
- +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
- +import org.l2jmobius.gameserver.model.holders.SkillHolder;
- +import org.l2jmobius.gameserver.model.instancezone.Instance;
- +import org.l2jmobius.gameserver.model.skills.AbnormalVisualEffect;
- +import org.l2jmobius.gameserver.network.NpcStringId;
- +import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
- +import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
- +
- +import instances.AbstractInstance;
- +
- +/**
- + * @author CostyKiller
- + * @URL: https://l2wiki.com/Fall_of_Etina_(Solo)
- + * @URL: https://youtu.be/3flFpg0KGcA
- + * @TODO: Add helper npcs skills
- + * @TODO: Add instance buff Elikia Emblem
- + */
- +public class EtisVanEtinaSolo extends AbstractInstance
- +{
- + // NPC
- + private static final int LEONA_OUTLET = 34426;
- + private static final int LEONA_BLACKBIRD = 34471;
- + private static final int DEVIANNE = 34472;
- + private static final int ELIKIA = 34473;
- + private static final int SPORCHA = 34474;
- + private static final int ALIBER = 34475;
- + // RB
- + private static final int ETIS_VAN_ETINA1 = 26321;
- + private static final int ETIS_VAN_ETINA2 = 26322;
- + private static final int KAIN_VAN_HALTER = 26235;
- + private static final int CAMILLE = 26236;
- + // Corridor Mobs
- + //@formatter:off
- + private static final int[] CORRIDOR_MOBS_1 = {24173, 24174, 24175, 24176};
- + private static final int[] CORRIDOR_MOBS_2 = {24180, 24181, 24182, 24183};
- + private static final int[] CORRIDOR_MOBS_3 = {24184, 24185, 24186, 24187, 24188, 24189, 24190, 24191, 24192};
- + private static final int[] CORRIDOR_MOBS_4 = {24189, 24190, 24191, 24192};
- + //@formatter:on
- + private static final int PARAGON = 24193;
- + // Seals
- + private static final int SEAL_OF_GNOSIS = 19677;
- + private static final int SEAL_OF_STRIFE = 19678;
- + private static final int SEAL_OF_AVARICE = 19679;
- + private static final int SEAL_OF_PUNISHMENT = 19680;
- + private static final int SEAL_OF_AWAKENING = 19681;
- + private static final int SEAL_OF_CALAMITY = 19682;
- + private static final int SEAL_OF_DESTRUCTION = 19683;
- + // Others
- + private static final int DOOR1 = 12230702;
- + private static final int DOOR2 = 12230704;
- + private static final int DOOR3 = 12230802;
- + private static final int DOOR4 = 12230804;
- + // Skills
- + private static final SkillHolder CALL_OF_SEVEN_SIGNS = new SkillHolder(32317, 1);
- + private static final SkillHolder CALL_OF_SEVEN_SIGNS_SEAL_N = new SkillHolder(32004, 1);
- + private static final SkillHolder ETINA_REVELATION = new SkillHolder(32014, 2);
- + private static final SkillHolder STIGMA_OF_REVELATION = new SkillHolder(32015, 1);
- + private static final SkillHolder CRY_OF_HOLY_WAR = new SkillHolder(32017, 2);
- + private static final SkillHolder STIGMA_OF_MARTYR = new SkillHolder(32018, 1);
- + private static final SkillHolder UNDEAD_CREATURE = new SkillHolder(32020, 2);
- + private static final SkillHolder ETINA_DIVINE_PUNISHMENT = new SkillHolder(32023, 2);
- + private static final SkillHolder ETINA_OBSERVATION = new SkillHolder(32024, 2);
- + private static final SkillHolder RAGE_OF_THE_OPEN_EYE = new SkillHolder(32026, 2);
- +
- + // Camille -> Horseshoe Trampling, Horizon Bash, Joust Lunge, Call of Etina (summon minions?)
- + // Misc
- + private static final int TEMPLATE_ID = 293;
- +
- + public EtisVanEtinaSolo()
- + {
- + super(TEMPLATE_ID);
- + addInstanceCreatedId(TEMPLATE_ID);
- + addStartNpc(LEONA_OUTLET);
- + addTalkId(LEONA_OUTLET, LEONA_BLACKBIRD);
- + addFirstTalkId(LEONA_BLACKBIRD, DEVIANNE, ELIKIA, SPORCHA, ALIBER);
- + addAttackId(CORRIDOR_MOBS_1);
- + addAttackId(CORRIDOR_MOBS_2);
- + addAttackId(CORRIDOR_MOBS_3);
- + addAttackId(CORRIDOR_MOBS_4);
- + addAttackId(CAMILLE, KAIN_VAN_HALTER, ETIS_VAN_ETINA1, ETIS_VAN_ETINA2);
- + addKillId(CORRIDOR_MOBS_1);
- + addKillId(CORRIDOR_MOBS_2);
- + addKillId(CORRIDOR_MOBS_3);
- + addKillId(CORRIDOR_MOBS_4);
- + addKillId(PARAGON, CAMILLE, KAIN_VAN_HALTER, ETIS_VAN_ETINA1, ETIS_VAN_ETINA2);
- + }
- +
- + @Override
- + public void onInstanceCreated(Instance world, PlayerInstance player)
- + {
- + world.setStatus(0);
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + world.getParameters().set("CORRIDOR_MOBS_1_SPAWNED", false);
- + world.getParameters().set("CORRIDOR_MOBS_2_SPAWNED", false);
- + world.getParameters().set("CORRIDOR_MOBS_3_SPAWNED", false);
- + world.getParameters().set("CORRIDOR_MOBS_4_SPAWNED", false);
- + world.getParameters().set("CAMILLE_30", false);
- + world.getParameters().set("CAMILLE_60", false);
- + world.getParameters().set("KAIN_30", false);
- + world.getParameters().set("KAIN_60", false);
- + world.getParameters().set("ETINA_80", false);
- + world.getParameters().set("ETINA_15", false);
- + }
- +
- + @Override
- + public String onAdvEvent(String event, Npc npc, PlayerInstance player)
- + {
- + switch (event)
- + {
- + case "enterInstance":
- + {
- + playMovie(player, Movie.EP5_ETINA_QST_START_A);
- + startQuestTimer("enterEtina", 20000, npc, player);
- + startQuestTimer("intro_movie", 20000, npc, player);
- + startQuestTimer("talkLeona", 25000, npc, player);
- + break;
- + }
- + case "enterEtina":
- + {
- + enterInstance(player, npc, TEMPLATE_ID);
- + break;
- + }
- + case "intro_movie":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + playMovie(world.getPlayers(), Movie.EP5_ETINA_QST_START_B);
- + }
- + break;
- + }
- + case "talkLeona":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + showOnScreenMsg(world, NpcStringId.TALK_TO_LEONA_BLACKBIRD_13, ExShowScreenMessage.TOP_CENTER, 10000, true);
- + }
- + break;
- + }
- + case "startStage1":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + showOnScreenMsg(world, NpcStringId.ALRIGHT_LET_S_GO_DEFEAT_ETIS_VAN_ETINA, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + startQuestTimer("checkProgress", 5000, npc, player, true);
- + world.setStatus(1);
- + return "34471-01.html";
- + }
- + break;
- + }
- + case "checkProgress":
- + {
- + final Instance world = player.getInstanceWorld();
- + boolean CORRIDOR_MOBS_1_SPAWNED = world.getParameters().getBoolean("CORRIDOR_MOBS_1_SPAWNED", false);
- + boolean CORRIDOR_MOBS_2_SPAWNED = world.getParameters().getBoolean("CORRIDOR_MOBS_2_SPAWNED", false);
- + boolean CORRIDOR_MOBS_3_SPAWNED = world.getParameters().getBoolean("CORRIDOR_MOBS_3_SPAWNED", false);
- + boolean CORRIDOR_MOBS_4_SPAWNED = world.getParameters().getBoolean("CORRIDOR_MOBS_4_SPAWNED", false);
- + if (isInInstance(world))
- + {
- + final MonsterInstance monsterCheck = getRandomEntry(World.getInstance().getVisibleObjectsInRange(npc, MonsterInstance.class, 2500));
- + if (monsterCheck == null)
- + {
- + if (!world.getNpcsOfGroup("BARRICADES_2").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_1).isEmpty() && world.getNpcsOfGroup("BARRICADES_1").isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + else if (!world.getNpcsOfGroup("BARRICADES_3").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_2).isEmpty() && world.getNpcsOfGroup("BARRICADES_2").isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + else if (!world.getNpcsOfGroup("BARRICADES_4").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_3).isEmpty() && world.getNpcsOfGroup("BARRICADES_3").isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + }
- + if (!CORRIDOR_MOBS_1_SPAWNED && world.getNpcsOfGroup("BARRICADES_1").isEmpty() && !world.getNpcsOfGroup("BARRICADES_2").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_1).isEmpty())
- + {
- + world.spawnGroup("CORRIDOR_MOBS_1");
- + world.getNpcsOfGroup("CORRIDOR_MOBS_1").forEach(mob ->
- + {
- + if (mob != null)
- + {
- + mob.setRandomWalking(false);
- + }
- + });
- + world.getParameters().set("CORRIDOR_MOBS_1_SPAWNED", true);
- + }
- + if (!CORRIDOR_MOBS_2_SPAWNED && world.getNpcsOfGroup("BARRICADES_2").isEmpty() && !world.getNpcsOfGroup("BARRICADES_3").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_2).isEmpty())
- + {
- + world.spawnGroup("CORRIDOR_MOBS_2");
- + world.getNpcsOfGroup("CORRIDOR_MOBS_2").forEach(mob ->
- + {
- + if (mob != null)
- + {
- + mob.setRandomWalking(false);
- + }
- + });
- + world.getParameters().set("CORRIDOR_MOBS_2_SPAWNED", true);
- + }
- + if (!CORRIDOR_MOBS_3_SPAWNED && world.getNpcsOfGroup("BARRICADES_3").isEmpty() && !world.getNpcsOfGroup("BARRICADES_4").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_3).isEmpty())
- + {
- + world.spawnGroup("CORRIDOR_MOBS_3");
- + world.getNpcsOfGroup("CORRIDOR_MOBS_3").forEach(mob ->
- + {
- + if (mob != null)
- + {
- + mob.setRandomWalking(false);
- + }
- + });
- + world.getParameters().set("CORRIDOR_MOBS_3_SPAWNED", true);
- + }
- + if (!CORRIDOR_MOBS_4_SPAWNED && world.getNpcsOfGroup("BARRICADES_4").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_4).isEmpty())
- + {
- + world.spawnGroup("CORRIDOR_MOBS_4");
- + world.spawnGroup("PARAGON");
- + world.getParameters().set("CORRIDOR_MOBS_4_SPAWNED", true);
- + world.getNpcsOfGroup("CORRIDOR_MOBS_4").forEach(mob ->
- + {
- + if (mob != null)
- + {
- + mob.setRandomWalking(false);
- + }
- + });
- + if (world.getNpc(PARAGON) != null)
- + {
- + world.getNpc(PARAGON).setInvul(true);
- + world.getNpc(PARAGON).getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
- + }
- + npc.broadcastPacket(new ExShowScreenMessage(NpcStringId.YOU_CAN_T_DEFEAT_PARAGON_WHILE_PARAGON_S_MINIONS_ARE_ALIVE, ExShowScreenMessage.TOP_CENTER, 7000, true));
- + }
- + if (world.getNpcsOfGroup("BARRICADES_4").isEmpty() && world.getAliveNpcs(CORRIDOR_MOBS_4).isEmpty())
- + {
- + if ((world.getNpc(PARAGON) != null) && world.getNpc(PARAGON).isInvul())
- + {
- + world.getNpc(PARAGON).setInvul(false);
- + world.getNpc(PARAGON).getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
- + showOnScreenMsg(world, NpcStringId.PARAGON_IS_NO_LONGER_INVINCIBLE, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.TODAY_IS_THE_DAY_THAT_I_WILL_ENTER);
- + }
- + }
- + if ((world.getStatus() == 1) && world.getNpcsOfGroup("BARRICADES_4").isEmpty() && (world.getAliveNpcs(PARAGON).isEmpty()))
- + {
- + startQuestTimer("openInnerDoors", 5000, null, player);
- + cancelQuestTimer("checkProgress", npc, player);
- + }
- + }
- + break;
- + }
- + case "openInnerDoors":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + openDoor(DOOR1, world.getId());
- + openDoor(DOOR2, world.getId());
- + openDoor(DOOR3, world.getId());
- + openDoor(DOOR4, world.getId());
- + world.setStatus(2);
- + startQuestTimer("talkLeona", 5000, null, player);
- + }
- + break;
- + }
- + case "startStage2":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + startQuestTimer("show_intro_movie_camille", 5000, null, player);
- + return "34471-03.html";
- + }
- + break;
- + }
- + case "show_intro_movie_camille":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + playMovie(world.getPlayers(), Movie.SC_INZONE_CAMILLE_INTRO);
- + startQuestTimer("spawn_camille", 5000, null, player);
- + }
- + break;
- + }
- + case "spawn_camille":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + closeDoor(DOOR1, world.getId());
- + closeDoor(DOOR2, world.getId());
- + closeDoor(DOOR3, world.getId());
- + closeDoor(DOOR4, world.getId());
- + world.setStatus(3);
- + world.spawnGroup("CAMILLE");
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.GISELLE_NO_IS_SHE_CAMILLE_IN_THAT_STATE);
- + }
- + break;
- + }
- + case "spawn_kain":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + world.spawnGroup("KAIN");
- + world.spawnGroup("ETINA_1");
- + world.getNpc(ETIS_VAN_ETINA1).setInvul(true);
- + world.getNpc(ETIS_VAN_ETINA1).setTargetable(false);
- + world.getNpc(ETIS_VAN_ETINA1).setImmobilized(true);
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_AND_HIS_APOSTLES_HAVE_APPEARED, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.EVEN_THE_MIGHTY_ETINA_SEEMS_TO_FEAR_US);
- + }
- + break;
- + }
- + case "spawnTransformedEtina":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + world.spawnGroup("ETINA_2");
- + world.spawnGroup("ETINA_MINIONS");
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ETIS_VAN_ETINA_WE_FINALLY_MEET);
- + }
- + break;
- + }
- + case "gnosisCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfGnosis = world.getNpc(SEAL_OF_GNOSIS);
- + _sealOfGnosis.setDisplayEffect(3);
- + _sealOfGnosis.broadcastPacket(new MagicSkillUse(_sealOfGnosis, _sealOfGnosis, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 1, 10000, 0));
- + PlayerInstance member = world.getPlayers().stream().findAny().get();
- + STIGMA_OF_REVELATION.getSkill().applyEffects(member, member);
- + world.getNpcsOfGroup("ETINA_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + ETINA_REVELATION.getSkill().applyEffects(minion, minion);
- + ((Attackable) minion).addDamageHate(member, 0, 999999999);
- + }
- + });
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_GNOSIS_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "strifeCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfStrife = world.getNpc(SEAL_OF_STRIFE);
- + _sealOfStrife.setDisplayEffect(3);
- + _sealOfStrife.broadcastPacket(new MagicSkillUse(_sealOfStrife, _sealOfStrife, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 2, 10000, 0));
- + world.getNpcsOfGroup("ETINA_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + CRY_OF_HOLY_WAR.getSkill().applyEffects(minion, minion);
- + }
- + });
- + world.getPlayers().forEach(plr -> STIGMA_OF_MARTYR.getSkill().applyEffects(player, player));
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_STRIFE_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "avariceCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfAvarice = world.getNpc(SEAL_OF_AVARICE);
- + _sealOfAvarice.setDisplayEffect(3);
- + _sealOfAvarice.broadcastPacket(new MagicSkillUse(_sealOfAvarice, _sealOfAvarice, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 3, 10000, 0));
- + world.getNpcsOfGroup("ETINA_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + UNDEAD_CREATURE.getSkill().applyEffects(minion, minion);
- + }
- + });
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_AVARICE_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "punishmentCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfPunishment = world.getNpc(SEAL_OF_PUNISHMENT);
- + _sealOfPunishment.setDisplayEffect(3);
- + _sealOfPunishment.broadcastPacket(new MagicSkillUse(_sealOfPunishment, _sealOfPunishment, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 4, 10000, 0));
- + world.getNpcsOfGroup("ETINA_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + ETINA_DIVINE_PUNISHMENT.getSkill().applyEffects(minion, minion);
- + }
- + });
- + world.getPlayers().forEach(plr -> ETINA_OBSERVATION.getSkill().applyEffects(player, player));
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_PUNISHMENT_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "awakeningCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfAwakening = world.getNpc(SEAL_OF_AWAKENING);
- + _sealOfAwakening.setDisplayEffect(3);
- + _sealOfAwakening.broadcastPacket(new MagicSkillUse(_sealOfAwakening, _sealOfAwakening, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 5, 10000, 0));
- + world.getNpcsOfGroup("ETINA_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + RAGE_OF_THE_OPEN_EYE.getSkill().applyEffects(minion, minion);
- + }
- + });
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_AWAKENING_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "calamityCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfCalamity = world.getNpc(SEAL_OF_CALAMITY);
- + _sealOfCalamity.setDisplayEffect(3);
- + _sealOfCalamity.broadcastPacket(new MagicSkillUse(_sealOfCalamity, _sealOfCalamity, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 6, 10000, 0));
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_CALAMITY_ACTIVATES_AND_ENORMOUS_POWER_BEGINS_TO_FLOW_OUT, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + case "destructionCastTimer":
- + {
- + final Instance world = player.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final Npc _sealOfDestruction = world.getNpc(SEAL_OF_DESTRUCTION);
- + _sealOfDestruction.setDisplayEffect(3);
- + _sealOfDestruction.broadcastPacket(new MagicSkillUse(_sealOfDestruction, _sealOfDestruction, CALL_OF_SEVEN_SIGNS_SEAL_N.getSkillId(), 7, 10000, 0));
- + showOnScreenMsg(world, NpcStringId.THE_SEAL_OF_DESTRUCTION_IS_ACTIVATED_AND_ETINA_S_GRAND_TEMPLE_IS_NOW_UNDER_ITS_INFLUENCE, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + break;
- + }
- + }
- + return super.onAdvEvent(event, npc, player);
- + }
- +
- + @Override
- + public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
- + {
- + final Instance world = attacker.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + final boolean CAMILLE_30 = world.getParameters().getBoolean("CAMILLE_30", false);
- + final boolean CAMILLE_60 = world.getParameters().getBoolean("CAMILLE_60", false);
- + final boolean KAIN_30 = world.getParameters().getBoolean("KAIN_30", false);
- + final boolean KAIN_60 = world.getParameters().getBoolean("KAIN_60", false);
- + final boolean ETINA_80 = world.getParameters().getBoolean("ETINA_80", false);
- + final boolean ETINA_15 = world.getParameters().getBoolean("ETINA_15", false);
- + if (npc.getId() == CAMILLE)
- + {
- + if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.3)) && !CAMILLE_30)
- + {
- + world.getParameters().set("CAMILLE_30", true);
- + world.spawnGroup("CAMILLE_MINIONS");
- + }
- + else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.6)) && !CAMILLE_60)
- + {
- + world.getParameters().set("CAMILLE_60", true);
- + world.spawnGroup("CAMILLE_MINIONS");
- + }
- + }
- + else if (npc.getId() == KAIN_VAN_HALTER)
- + {
- + if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.3)) && !KAIN_30)
- + {
- + world.getParameters().set("KAIN_30", true);
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_SUMMONS_HIS_APOSTLES_MINIONS, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.spawnGroup("KAIN_MINIONS");
- + }
- + else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.6)) && !KAIN_60)
- + {
- + world.getParameters().set("KAIN_60", true);
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_SUMMONS_HIS_APOSTLES_MINIONS, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.spawnGroup("KAIN_MINIONS");
- + }
- + }
- + else if ((npc.getId() == ETIS_VAN_ETINA1))
- + {
- + if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)) && !ETINA_80)
- + {
- + final Npc _etina1 = world.getNpc(ETIS_VAN_ETINA1);
- + world.getParameters().set("ETINA_80", true);
- + world.spawnGroup("ETINA_MINIONS");
- + _etina1.abortCast();
- + _etina1.broadcastPacket(new MagicSkillUse(_etina1, _etina1, CALL_OF_SEVEN_SIGNS.getSkillId(), CALL_OF_SEVEN_SIGNS.getSkillLevel(), 3000, 0));
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_USES_THE_POWER_OF_THE_SEVEN_SIGNS_TO_SUMMON_ALL_7_SEALS_INSIDE_THE_TEMPLE, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.spawnGroup("SEALS");
- + startQuestTimer("gnosisCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("strifeCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("avariceCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("punishmentCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("awakeningCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("calamityCastTimer", 120000, npc, attacker, true);
- + startQuestTimer("destructionCastTimer", 120000, npc, attacker, true);
- + }
- + else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.15)) && !ETINA_15)
- + {
- + world.getParameters().set("ETINA_15", true);
- + world.spawnGroup("ETINA_MINIONS");
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_AND_THE_POWER_OF_SIX_SEALS_ARE_WEAKENING, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + }
- + }
- + }
- + return super.onAttack(npc, attacker, damage, isSummon);
- + }
- +
- + @Override
- + public String onKill(Npc npc, PlayerInstance killer, boolean isPet)
- + {
- + final Instance world = npc.getInstanceWorld();
- + if (isInInstance(world))
- + {
- + if (npc.getId() == ETIS_VAN_ETINA1)
- + {
- + playMovie(world.getPlayers(), Movie.SC_ETIS_VAN_ETINA_TRANS);
- + startQuestTimer("spawnTransformedEtina", 15000, null, killer);
- + }
- + else if (npc.getId() == ETIS_VAN_ETINA2)
- + {
- + playMovie(world.getPlayers(), Movie.SC_ETIS_VAN_ETINA_ENDING);
- + world.getAliveNpcs().forEach(mob ->
- + {
- + mob.deleteMe();
- + });
- + if (getQuestTimer("gnosisCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("gnosisCastTimer", npc, killer);
- + }
- + if (getQuestTimer("trifeCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("strifeCastTimer", npc, killer);
- + }
- + if (getQuestTimer("avariceCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("avariceCastTimer", npc, killer);
- + }
- + if (getQuestTimer("punishmentCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("punishmentCastTimer", npc, killer);
- + }
- + if (getQuestTimer("awakeningCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("awakeningCastTimer", npc, killer);
- + }
- + if (getQuestTimer("calamityCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("calamityCastTimer", npc, killer);
- + }
- + if (getQuestTimer("destructionCastTimer", npc, killer) != null)
- + {
- + cancelQuestTimer("destructionCastTimer", npc, killer);
- + }
- + closeDoor(DOOR1, world.getId());
- + closeDoor(DOOR2, world.getId());
- + closeDoor(DOOR3, world.getId());
- + closeDoor(DOOR4, world.getId());
- + world.finishInstance(2);
- + }
- + else if (CommonUtil.contains(CORRIDOR_MOBS_1, npc.getId()))
- + {
- + if (world.getAliveNpcs(CORRIDOR_MOBS_1).isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + }
- + else if (CommonUtil.contains(CORRIDOR_MOBS_2, npc.getId()))
- + {
- + if (world.getAliveNpcs(CORRIDOR_MOBS_2).isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + }
- + else if (CommonUtil.contains(CORRIDOR_MOBS_3, npc.getId()))
- + {
- + if (world.getAliveNpcs(CORRIDOR_MOBS_3).isEmpty())
- + {
- + world.getParameters().set("BARRICADE_DESTROYED", false);
- + }
- + }
- + else if (CommonUtil.contains(CORRIDOR_MOBS_4, npc.getId()))
- + {
- + if (world.getAliveNpcs(CORRIDOR_MOBS_4).isEmpty())
- + {
- + world.getNpc(PARAGON).setInvul(false);
- + world.getNpc(PARAGON).getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
- + showOnScreenMsg(world, NpcStringId.PARAGON_IS_NO_LONGER_INVINCIBLE, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.TODAY_IS_THE_DAY_THAT_I_WILL_ENTER);
- + }
- + }
- + else if (npc.getId() == PARAGON)
- + {
- + startQuestTimer("openInnerDoors", 5000, null, killer);
- + }
- + else if (npc.getId() == CAMILLE)
- + {
- + world.getNpcsOfGroup("CAMILLE_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + minion.doDie(null);
- + }
- + });
- + world.getNpc(CAMILLE).deleteMe();
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.KAIN_IS_OUR_ENEMY_NOW_BE_ON_GUARD);
- + playMovie(world.getPlayers(), Movie.SC_INZONE_KAIN_INTRO);
- + startQuestTimer("spawn_kain", 5000, null, killer);
- + }
- + else if (npc.getId() == KAIN_VAN_HALTER)
- + {
- + world.getNpcsOfGroup("KAIN_MINIONS").forEach(minion ->
- + {
- + if (minion != null)
- + {
- + minion.doDie(null);
- + }
- + });
- + world.getNpc(ETIS_VAN_ETINA1).setInvul(false);
- + world.getNpc(ETIS_VAN_ETINA1).setImmobilized(false);
- + world.getNpc(ETIS_VAN_ETINA1).setTargetable(true);
- + showOnScreenMsg(world, NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true);
- + world.getNpc(KAIN_VAN_HALTER).deleteMe();
- + playMovie(world.getPlayers(), Movie.SC_KAIN_BOSS_ENDING);
- + world.getNpc(LEONA_BLACKBIRD).broadcastSay(ChatType.NPC_GENERAL, NpcStringId.KAIN_I_WON_T_FEEL_GUILTY_ABOUT_THIS);
- + }
- + }
- + return super.onKill(npc, killer, isPet);
- + }
- +
- + @Override
- + public String onFirstTalk(Npc npc, PlayerInstance player)
- + {
- + final Instance world = player.getInstanceWorld();
- + String htmltext = null;
- + if (isInInstance(world))
- + {
- + switch (npc.getId())
- + {
- + case DEVIANNE:
- + case ELIKIA:
- + case SPORCHA:
- + case ALIBER:
- + {
- + htmltext = npc.getId() + ".html";
- + break;
- + }
- + case LEONA_BLACKBIRD:
- + {
- + switch (world.getStatus())
- + {
- + case 0:
- + {
- + htmltext = "34471.htm";
- + break;
- + }
- + case 1:
- + {
- + htmltext = "34471-01.html";
- + break;
- + }
- + case 2:
- + {
- + htmltext = "34471-02.htm";
- + break;
- + }
- + case 3:
- + {
- + htmltext = "34471-03.html";
- + break;
- + }
- + }
- + }
- + }
- + }
- + return htmltext;
- + }
- +
- + public static void main(String[] args)
- + {
- + new EtisVanEtinaSolo();
- + }
- +}
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoGroup.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoGroup.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoGroup.html (working copy)
- @@ -0,0 +1,3 @@
- +<html><body>Leona Blackbird:<br>
- +You can enter only solo.
- +</body></html>
- \ No newline at end of file
- Index: dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoLevel.html
- ===================================================================
- --- dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoLevel.html (nonexistent)
- +++ dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoLevel.html (working copy)
- @@ -0,0 +1,4 @@
- +<html><body>Leona Blackbird:<br>
- +I won't let you enter.<br>
- +(Only players between levels 104-130 may participate.)
- +</body></html>
- \ No newline at end of file
Add Comment
Please, Sign In to add comment