Addition of Etis Van Etina solo instance.

Contributed by CostyKiller.
This commit is contained in:
MobiusDevelopment
2021-05-11 21:41:50 +00:00
parent 3055162b89
commit 822621c70e
38 changed files with 4322 additions and 48 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -0,0 +1,3 @@
<html><body>Devianne:<br>
Behold the power of the Ivory Tower Wizards!<br>
</body></html>

View File

@@ -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>

View File

@@ -0,0 +1,3 @@
<html><body>Sporcha:<br>
Are you ready to fight?<br>
</body></html>

View File

@@ -0,0 +1,3 @@
<html><body>Aliber:<br>
Rage against all that stands in our way!<br>
</body></html>

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -0,0 +1,3 @@
<html><body>Leona Blackbird:<br>
You can enter only solo.
</body></html>

View File

@@ -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>