Addition of Etis Van Etina solo instance.
Contributed by CostyKiller.
This commit is contained in:
196
L2J_Mobius_8.0_Homunculus/dist/game/data/instances/EtisVanEtinaSolo.xml
vendored
Normal file
196
L2J_Mobius_8.0_Homunculus/dist/game/data/instances/EtisVanEtinaSolo.xml
vendored
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Etis Van Etina Solo -->
|
||||||
|
<instance id="293" maxWorlds="100" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
|
||||||
|
<time duration="120" empty="1" />
|
||||||
|
<locations>
|
||||||
|
<enter type="FIXED">
|
||||||
|
<location x="-245778" y="181088" z="2860" heading="0" /> <!-- enter location -->
|
||||||
|
</enter>
|
||||||
|
<exit type="ORIGIN" />
|
||||||
|
</locations>
|
||||||
|
<conditions>
|
||||||
|
<condition type="NoParty" showMessageAndHtml="true">
|
||||||
|
<param name="html" value="condNoGroup.html" />
|
||||||
|
</condition>
|
||||||
|
<condition type="Level" showMessageAndHtml="true">
|
||||||
|
<param name="html" value="condNoLevel.html" />
|
||||||
|
<param name="min" value="104" />
|
||||||
|
<param name="max" value="130" />
|
||||||
|
</condition>
|
||||||
|
<condition type="Reenter" />
|
||||||
|
</conditions>
|
||||||
|
<reenter apply="ON_FINISH">
|
||||||
|
<reset day="MONDAY" hour="6" minute="30" />
|
||||||
|
<reset day="WEDNESDAY" hour="6" minute="30" />
|
||||||
|
<reset day="SATURDAY" hour="6" minute="30" />
|
||||||
|
</reenter>
|
||||||
|
<doorlist>
|
||||||
|
<door id="12230702">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230704">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230802">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230804">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
</doorlist>
|
||||||
|
<spawnlist>
|
||||||
|
<group name="SUPPORT_NPCS" spawnByDefault="true">
|
||||||
|
<npc id="34471" x="-245492" y="181349" z="2860" heading="0" /> <!-- Leona Blackbird -->
|
||||||
|
<npc id="34472" x="-245597" y="181284" z="2861" heading="0" /> <!-- Devianne -->
|
||||||
|
<npc id="34473" x="-245756" y="181299" z="2861" heading="0" /> <!-- Elikia -->
|
||||||
|
<npc id="34474" x="-245858" y="181353" z="2861" heading="0" /> <!-- Sporcha -->
|
||||||
|
<npc id="34475" x="-245955" y="181399" z="2861" heading="0" /> <!-- Aliber -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_1" spawnByDefault="true"> <!-- First Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_2" spawnByDefault="true"> <!-- Second Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_3" spawnByDefault="true"> <!-- Third Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_4" spawnByDefault="true"> <!-- Fourth Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_1" spawnByDefault="false">
|
||||||
|
<npc id="24173" x="-245763" y="183750" z="2985" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245761" y="183861" z="2986" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245679" y="183761" z="2986" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245837" y="183761" z="2986" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_2" spawnByDefault="false">
|
||||||
|
<npc id="24164" x="-245440" y="185170" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245513" y="185170" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245440" y="185110" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245513" y="185110" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245725" y="185265" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245799" y="185265" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245725" y="185205" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245799" y="185205" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245993" y="185170" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-246079" y="185170" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245993" y="185110" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-246079" y="185110" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245440" y="184870" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245513" y="184870" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245440" y="184810" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245513" y="184810" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245725" y="184965" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245799" y="184965" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245725" y="184905" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245799" y="184905" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245993" y="184870" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-246079" y="184870" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245993" y="184810" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-246079" y="184810" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_3" spawnByDefault="false">
|
||||||
|
<npc id="24168" x="-245760" y="186319" z="3037" heading="49493" /> <!-- Creed Protector -->
|
||||||
|
<npc id="24169" x="-245654" y="186334" z="3037" heading="49493" /> <!-- Soul Reaper -->
|
||||||
|
<npc id="24170" x="-245859" y="186334" z="3037" heading="49493" /> <!-- Zealous Berserker -->
|
||||||
|
<npc id="24171" x="-245700" y="186406" z="3037" heading="49493" /> <!-- Soul Destroyer -->
|
||||||
|
<npc id="24172" x="-245820" y="186406" z="3037" heading="49493" /> <!-- Heretic Inquisitor -->
|
||||||
|
<npc id="24173" x="-245754" y="186463" z="3037" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245751" y="186550" z="3037" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245652" y="186481" z="3037" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245863" y="186481" z="3037" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_4" spawnByDefault="false">
|
||||||
|
<npc id="24173" x="-245985" y="187478" z="3042" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24173" x="-245530" y="187478" z="3042" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245647" y="187443" z="3042" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245761" y="187393" z="3042" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245860" y="187443" z="3042" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="PARAGON" spawnByDefault="false">
|
||||||
|
<npc id="24177" x="-245757" y="187778" z="3042" heading="49493" /> <!-- Paragon -->
|
||||||
|
</group>
|
||||||
|
<group name="CAMILLE" spawnByDefault="false">
|
||||||
|
<npc id="24178" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Camille -->
|
||||||
|
</group>
|
||||||
|
<group name="CAMILLE_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="24196" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Temple Dark Wizard -->
|
||||||
|
<npc id="24197" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Temple Flame Master -->
|
||||||
|
<npc id="24198" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Temple Archon -->
|
||||||
|
<npc id="24199" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Temple High Priest -->
|
||||||
|
</group>
|
||||||
|
<group name="KAIN" spawnByDefault="false">
|
||||||
|
<npc id="24179" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Kain van Halter -->
|
||||||
|
</group>
|
||||||
|
<group name="KAIN_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="24168" x="-245773" y="191704" z="3045" heading="49493" /> <!-- Creed Protector -->
|
||||||
|
<npc id="24169" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Soul Reaper -->
|
||||||
|
<npc id="24170" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Zealous Berserker -->
|
||||||
|
<npc id="24171" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Soul Destroyer -->
|
||||||
|
<npc id="24172" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Heretic Inquisitor -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_1" spawnByDefault="false">
|
||||||
|
<npc id="26321" x="-245765" y="194229" z="3200" heading="49493" /> <!-- Etis van Etina 1 -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_2" spawnByDefault="false">
|
||||||
|
<npc id="26322" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Etis van Etina 2 -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="26323" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Martyr of Avarice -->
|
||||||
|
<npc id="26324" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Guide of Arrogance -->
|
||||||
|
<npc id="26325" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Seeker of Despair -->
|
||||||
|
<npc id="26326" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Liberator of Lust -->
|
||||||
|
</group>
|
||||||
|
<group name="SEALS" spawnByDefault="false">
|
||||||
|
<npc id="19677" x="-246859" y="193321" z="3045" heading="0" /> <!-- Seal of Gnosis -->
|
||||||
|
<npc id="19678" x="-246888" y="192729" z="3045" heading="0" /> <!-- Seal of Strife -->
|
||||||
|
<npc id="19679" x="-246896" y="192148" z="3045" heading="0" /> <!-- Seal of Avarice -->
|
||||||
|
<npc id="19680" x="-244640" y="193331" z="3044" heading="0" /> <!-- Seal of Punishment -->
|
||||||
|
<npc id="19681" x="-244647" y="192739" z="3045" heading="0" /> <!-- Seal of Awakening -->
|
||||||
|
<npc id="19682" x="-244641" y="192155" z="3045" heading="0" /> <!-- Seal of Calamity -->
|
||||||
|
<npc id="19683" x="-244640" y="191566" z="3045" heading="0" /> <!-- Seal of Destruction -->
|
||||||
|
</group>
|
||||||
|
</spawnlist>
|
||||||
|
</instance>
|
4
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-01.html
vendored
Normal file
4
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-01.html
vendored
Normal 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>
|
5
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-02.htm
vendored
Normal file
5
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-02.htm
vendored
Normal 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>
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-03.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471-03.html
vendored
Normal 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>
|
5
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471.htm
vendored
Normal file
5
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34471.htm
vendored
Normal 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>
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34472.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34472.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Devianne:<br>
|
||||||
|
Behold the power of the Ivory Tower Wizards!<br>
|
||||||
|
</body></html>
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34473.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34473.html
vendored
Normal 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>
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34474.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34474.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Sporcha:<br>
|
||||||
|
Are you ready to fight?<br>
|
||||||
|
</body></html>
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34475.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/34475.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Aliber:<br>
|
||||||
|
Rage against all that stands in our way!<br>
|
||||||
|
</body></html>
|
283
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperAliber.java
vendored
Normal file
283
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperAliber.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
171
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperDevianne.java
vendored
Normal file
171
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperDevianne.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
170
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperElikia.java
vendored
Normal file
170
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperElikia.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
203
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperLeona.java
vendored
Normal file
203
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperLeona.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
170
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperSporcha.java
vendored
Normal file
170
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtinaHelperSporcha.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
723
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtisVanEtinaSolo.java
vendored
Normal file
723
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/EtisVanEtinaSolo.java
vendored
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoGroup.html
vendored
Normal file
3
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoGroup.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Leona Blackbird:<br>
|
||||||
|
You can enter only solo.
|
||||||
|
</body></html>
|
4
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoLevel.html
vendored
Normal file
4
L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/instances/EtisVanEtinaSolo/condNoLevel.html
vendored
Normal 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>
|
@@ -2270,6 +2270,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="15" />
|
<radius normal="15" />
|
||||||
<height normal="30" />
|
<height normal="30" />
|
||||||
@@ -2296,6 +2301,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="15" />
|
<radius normal="15" />
|
||||||
<height normal="30" />
|
<height normal="30" />
|
||||||
@@ -2322,6 +2332,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="35.5" />
|
<height normal="35.5" />
|
||||||
@@ -2348,6 +2363,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="35.5" />
|
<height normal="35.5" />
|
||||||
@@ -2373,6 +2393,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="32.5" />
|
<height normal="32.5" />
|
||||||
@@ -2398,6 +2423,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="41" />
|
<height normal="41" />
|
||||||
@@ -2423,6 +2453,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="28" />
|
<height normal="28" />
|
||||||
@@ -2448,6 +2483,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2473,6 +2513,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2498,6 +2543,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="35" />
|
<radius normal="35" />
|
||||||
<height normal="47" />
|
<height normal="47" />
|
||||||
@@ -2523,6 +2573,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2548,6 +2603,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="32.5" />
|
<height normal="32.5" />
|
||||||
@@ -2573,6 +2633,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="28" />
|
<height normal="28" />
|
||||||
@@ -2598,6 +2663,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="32" />
|
<radius normal="32" />
|
||||||
<height normal="51" />
|
<height normal="51" />
|
||||||
@@ -2609,7 +2679,7 @@
|
|||||||
<skill id="16758" level="1" /> <!-- Embryo -->
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24178" level="107" type="Monster" name="Camille" title="Final Apostle">
|
<npc id="24178" level="107" type="RaidBoss" name="Camille" title="Final Apostle">
|
||||||
<race>HUMANOID</race>
|
<race>HUMANOID</race>
|
||||||
<sex>FEMALE</sex>
|
<sex>FEMALE</sex>
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
@@ -2622,6 +2692,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="30" />
|
<radius normal="30" />
|
||||||
<height normal="40" />
|
<height normal="40" />
|
||||||
@@ -2634,7 +2709,7 @@
|
|||||||
<skill id="16899" level="2" /> <!-- Camille -->
|
<skill id="16899" level="2" /> <!-- Camille -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24179" level="107" type="Monster" name="Kain van Halter" title="Void Apostle">
|
<npc id="24179" level="107" type="RaidBoss" name="Kain van Halter" title="Void Apostle">
|
||||||
<race>DEMONIC</race>
|
<race>DEMONIC</race>
|
||||||
<sex>MALE</sex>
|
<sex>MALE</sex>
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
@@ -2647,6 +2722,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="36" />
|
<radius normal="36" />
|
||||||
<height normal="87" />
|
<height normal="87" />
|
||||||
@@ -3102,6 +3182,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="11" />
|
<radius normal="11" />
|
||||||
<height normal="25.5" />
|
<height normal="25.5" />
|
||||||
@@ -3127,6 +3212,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="11" />
|
<radius normal="11" />
|
||||||
<height normal="25.5" />
|
<height normal="25.5" />
|
||||||
@@ -3152,6 +3242,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="29" />
|
<height normal="29" />
|
||||||
@@ -3163,24 +3258,34 @@
|
|||||||
<skill id="16758" level="1" /> <!-- Embryo -->
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24199" level="85" type="Npc" name="Temple High Priest">
|
<npc id="24199" level="107" type="Monster" name="Temple High Priest">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
|
||||||
<race>ETC</race>
|
<race>ETC</race>
|
||||||
<sex>FEMALE</sex>
|
<sex>FEMALE</sex>
|
||||||
<equipment rhand="17426" />
|
<equipment rhand="17426" />
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="480642.196531792" hpRegen="9.5" mp="26106.2706270627" mpRegen="3.3" />
|
||||||
|
<attack physical="62498" magical="53196" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="5913" magical="3434" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="50" />
|
<walk ground="50" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="29" />
|
<height normal="29" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14823" level="1" /> <!-- Instant Kill Attack Resistance -->
|
||||||
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
</list>
|
</list>
|
||||||
|
@@ -509,43 +509,103 @@
|
|||||||
<height normal="81" />
|
<height normal="81" />
|
||||||
</collision>
|
</collision>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26321" level="85" type="Npc" name="Etis van Etina" title="Overlord">
|
<npc id="26321" level="108" type="RaidBoss" name="Etis van Etina" title="Overlord">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
<race>HUMANOID</race>
|
||||||
<race>ETC</race>
|
<sex>MALE</sex>
|
||||||
<sex>FEMALE</sex>
|
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="7209629.47976879" hpRegen="9.5" mp="72062.7062706271" mpRegen="3.3" />
|
||||||
|
<attack physical="65855" magical="56801" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="6269" magical="3641" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="60" />
|
<walk ground="60" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="30" />
|
<radius normal="30" />
|
||||||
<height normal="78.6" />
|
<height normal="78.6" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
|
||||||
|
<skill id="32416" level="1" /> <!-- Etis van Etina -->
|
||||||
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26322" level="85" type="Npc" name="Etis van Etina" title="Overlord">
|
<npc id="26322" level="108" type="RaidBoss" name="Etis van Etina" title="Overlord">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
<race>HUMANOID</race>
|
||||||
<race>ETC</race>
|
<sex>MALE</sex>
|
||||||
<sex>FEMALE</sex>
|
<acquire exp="57856472640" sp="52068096" />
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="7209629.47976879" hpRegen="9.5" mp="72062.7062706271" mpRegen="3.3" />
|
||||||
|
<attack physical="65855" magical="56801" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="6269" magical="3641" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="60" />
|
<walk ground="60" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="42" />
|
<radius normal="42" />
|
||||||
<height normal="136.2" />
|
<height normal="136.2" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
|
||||||
|
<skill id="32416" level="1" /> <!-- Etis van Etina -->
|
||||||
|
</skillList>
|
||||||
|
<dropLists>
|
||||||
|
<drop>
|
||||||
|
<item id="17446" min="1" max="1" chance="0.03" /> <!-- Eternal Sigil -->
|
||||||
|
<item id="17433" min="1" max="1" chance="0.03" /> <!-- Eternal Gauntlets - Heavy armor -->
|
||||||
|
<item id="17434" min="1" max="1" chance="0.03" /> <!-- Eternal Boots - Heavy armor -->
|
||||||
|
<item id="17435" min="1" max="1" chance="0.03" /> <!-- Eternal Shield -->
|
||||||
|
<item id="17436" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Helmet - Light armor -->
|
||||||
|
<item id="17437" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Armor - Light armor -->
|
||||||
|
<item id="17438" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Leggings - Light armor -->
|
||||||
|
<item id="17439" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Gloves - Light armor -->
|
||||||
|
<item id="17440" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Boots - Light armor -->
|
||||||
|
<item id="17441" min="1" max="1" chance="0.03" /> <!-- Eternal Circlet - Robe -->
|
||||||
|
<item id="17442" min="1" max="1" chance="0.03" /> <!-- Eternal Tunic - Robe -->
|
||||||
|
<item id="17443" min="1" max="1" chance="0.03" /> <!-- Eternal Stockings - Robe -->
|
||||||
|
<item id="17444" min="1" max="1" chance="0.03" /> <!-- Eternal Gloves - Robe -->
|
||||||
|
<item id="17445" min="1" max="1" chance="0.03" /> <!-- Eternal Shoes - Robe -->
|
||||||
|
<item id="17432" min="1" max="1" chance="0.03" /> <!-- Eternal Gaiters - Heavy armor -->
|
||||||
|
<item id="17431" min="1" max="1" chance="0.03" /> <!-- Eternal Breastplate - Heavy armor -->
|
||||||
|
<item id="17430" min="1" max="1" chance="0.03" /> <!-- Eternal Helmet - Heavy armor -->
|
||||||
|
<item id="17417" min="1" max="1" chance="0.003" /> <!-- Helios Cutter -->
|
||||||
|
<item id="17418" min="1" max="1" chance="0.003" /> <!-- Helios Slasher -->
|
||||||
|
<item id="17419" min="1" max="1" chance="0.003" /> <!-- Helios Avenger -->
|
||||||
|
<item id="17420" min="1" max="1" chance="0.003" /> <!-- Helios Fighter -->
|
||||||
|
<item id="17421" min="1" max="1" chance="0.003" /> <!-- Helios Stormer -->
|
||||||
|
<item id="17422" min="1" max="1" chance="0.003" /> <!-- Helios Thrower -->
|
||||||
|
<item id="17423" min="1" max="1" chance="0.003" /> <!-- Helios Shooter -->
|
||||||
|
<item id="17424" min="1" max="1" chance="0.003" /> <!-- Helios Buster -->
|
||||||
|
<item id="17425" min="1" max="1" chance="0.003" /> <!-- Helios Caster -->
|
||||||
|
<item id="17426" min="1" max="1" chance="0.003" /> <!-- Helios Retributer -->
|
||||||
|
<item id="17427" min="1" max="1" chance="0.003" /> <!-- Helios Dual Swords -->
|
||||||
|
<item id="17428" min="1" max="1" chance="0.003" /> <!-- Helios Dual Daggers -->
|
||||||
|
<item id="17429" min="1" max="1" chance="0.003" /> <!-- Helios Dual Blunt Weapons -->
|
||||||
|
<item id="17416" min="1" max="1" chance="0.003" /> <!-- Helios Shaper -->
|
||||||
|
<item id="17527" min="1" max="1" chance="61.08" /> <!-- Scroll: Enchant R-grade Armor -->
|
||||||
|
<item id="17526" min="1" max="1" chance="42" /> <!-- Scroll: Enchant R-grade Weapon -->
|
||||||
|
<item id="19448" min="1" max="1" chance="8.736" /> <!-- Blessed Scroll: Enchant R-grade Armor -->
|
||||||
|
<item id="19447" min="1" max="1" chance="6.035" /> <!-- Blessed Scroll: Enchant R-grade Weapon -->
|
||||||
|
</drop>
|
||||||
|
</dropLists>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26323" level="107" type="Monster" name="Martyr of Avarice">
|
<npc id="26323" level="107" type="Monster" name="Martyr of Avarice">
|
||||||
<race>DEMONIC</race>
|
<race>DEMONIC</race>
|
||||||
@@ -560,6 +620,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="65" />
|
<height normal="65" />
|
||||||
@@ -585,6 +650,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="65" />
|
<height normal="65" />
|
||||||
@@ -610,6 +680,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="60" />
|
<height normal="60" />
|
||||||
@@ -635,6 +710,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="60" />
|
<height normal="60" />
|
||||||
|
196
L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/instances/EtisVanEtinaSolo.xml
vendored
Normal file
196
L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/instances/EtisVanEtinaSolo.xml
vendored
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Etis Van Etina Solo -->
|
||||||
|
<instance id="293" maxWorlds="100" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
|
||||||
|
<time duration="120" empty="1" />
|
||||||
|
<locations>
|
||||||
|
<enter type="FIXED">
|
||||||
|
<location x="-245778" y="181088" z="2860" heading="0" /> <!-- enter location -->
|
||||||
|
</enter>
|
||||||
|
<exit type="ORIGIN" />
|
||||||
|
</locations>
|
||||||
|
<conditions>
|
||||||
|
<condition type="NoParty" showMessageAndHtml="true">
|
||||||
|
<param name="html" value="condNoGroup.html" />
|
||||||
|
</condition>
|
||||||
|
<condition type="Level" showMessageAndHtml="true">
|
||||||
|
<param name="html" value="condNoLevel.html" />
|
||||||
|
<param name="min" value="104" />
|
||||||
|
<param name="max" value="130" />
|
||||||
|
</condition>
|
||||||
|
<condition type="Reenter" />
|
||||||
|
</conditions>
|
||||||
|
<reenter apply="ON_FINISH">
|
||||||
|
<reset day="MONDAY" hour="6" minute="30" />
|
||||||
|
<reset day="WEDNESDAY" hour="6" minute="30" />
|
||||||
|
<reset day="SATURDAY" hour="6" minute="30" />
|
||||||
|
</reenter>
|
||||||
|
<doorlist>
|
||||||
|
<door id="12230702">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230704">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230802">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
<door id="12230804">
|
||||||
|
<openStatus default="close" />
|
||||||
|
</door>
|
||||||
|
</doorlist>
|
||||||
|
<spawnlist>
|
||||||
|
<group name="SUPPORT_NPCS" spawnByDefault="true">
|
||||||
|
<npc id="34471" x="-245492" y="181349" z="2860" heading="0" /> <!-- Leona Blackbird -->
|
||||||
|
<npc id="34472" x="-245597" y="181284" z="2861" heading="0" /> <!-- Devianne -->
|
||||||
|
<npc id="34473" x="-245756" y="181299" z="2861" heading="0" /> <!-- Elikia -->
|
||||||
|
<npc id="34474" x="-245858" y="181353" z="2861" heading="0" /> <!-- Sporcha -->
|
||||||
|
<npc id="34475" x="-245955" y="181399" z="2861" heading="0" /> <!-- Aliber -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_1" spawnByDefault="true"> <!-- First Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="182361" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="182415" z="2861" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_2" spawnByDefault="true"> <!-- Second Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="184038" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="184092" z="3025" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_3" spawnByDefault="true"> <!-- Third Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="185409" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="185355" z="3031" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="BARRICADES_4" spawnByDefault="true"> <!-- Fourth Barricades Line -->
|
||||||
|
<npc id="19724" x="-246235" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246121" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-246016" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245911" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245806" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245701" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245596" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245491" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245386" y="186732" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
<npc id="19724" x="-245281" y="186678" z="3039" heading="16493" /> <!-- Common Decoration - Barricade -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_1" spawnByDefault="false">
|
||||||
|
<npc id="24173" x="-245763" y="183750" z="2985" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245761" y="183861" z="2986" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245679" y="183761" z="2986" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245837" y="183761" z="2986" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_2" spawnByDefault="false">
|
||||||
|
<npc id="24164" x="-245440" y="185170" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245513" y="185170" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245440" y="185110" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245513" y="185110" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245725" y="185265" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245799" y="185265" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245725" y="185205" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245799" y="185205" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245993" y="185170" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-246079" y="185170" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245993" y="185110" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-246079" y="185110" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245440" y="184870" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245513" y="184870" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245440" y="184810" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245513" y="184810" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245725" y="184965" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-245799" y="184965" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245725" y="184905" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-245799" y="184905" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
|
||||||
|
<npc id="24164" x="-245993" y="184870" z="3031" heading="49493" /> <!-- Temple Raider -->
|
||||||
|
<npc id="24165" x="-246079" y="184870" z="3031" heading="49493" /> <!-- Temple Passionate Soldier -->
|
||||||
|
<npc id="24166" x="-245993" y="184810" z="3031" heading="49493" /> <!-- Temple Guard Captain -->
|
||||||
|
<npc id="24167" x="-246079" y="184810" z="3031" heading="49493" /> <!-- Temple Elite Captain -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_3" spawnByDefault="false">
|
||||||
|
<npc id="24168" x="-245760" y="186319" z="3037" heading="49493" /> <!-- Creed Protector -->
|
||||||
|
<npc id="24169" x="-245654" y="186334" z="3037" heading="49493" /> <!-- Soul Reaper -->
|
||||||
|
<npc id="24170" x="-245859" y="186334" z="3037" heading="49493" /> <!-- Zealous Berserker -->
|
||||||
|
<npc id="24171" x="-245700" y="186406" z="3037" heading="49493" /> <!-- Soul Destroyer -->
|
||||||
|
<npc id="24172" x="-245820" y="186406" z="3037" heading="49493" /> <!-- Heretic Inquisitor -->
|
||||||
|
<npc id="24173" x="-245754" y="186463" z="3037" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245751" y="186550" z="3037" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245652" y="186481" z="3037" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245863" y="186481" z="3037" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="CORRIDOR_MOBS_4" spawnByDefault="false">
|
||||||
|
<npc id="24173" x="-245985" y="187478" z="3042" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24173" x="-245530" y="187478" z="3042" heading="49493" /> <!-- Great Temple Siege Ram -->
|
||||||
|
<npc id="24174" x="-245647" y="187443" z="3042" heading="49493" /> <!-- Great Temple Dark Judge -->
|
||||||
|
<npc id="24175" x="-245761" y="187393" z="3042" heading="49493" /> <!-- Great Temple Decurion -->
|
||||||
|
<npc id="24176" x="-245860" y="187443" z="3042" heading="49493" /> <!-- Great Temple Slayer -->
|
||||||
|
</group>
|
||||||
|
<group name="PARAGON" spawnByDefault="false">
|
||||||
|
<npc id="24177" x="-245757" y="187778" z="3042" heading="49493" /> <!-- Paragon -->
|
||||||
|
</group>
|
||||||
|
<group name="CAMILLE" spawnByDefault="false">
|
||||||
|
<npc id="24178" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Camille -->
|
||||||
|
</group>
|
||||||
|
<group name="CAMILLE_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="24196" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Temple Dark Wizard -->
|
||||||
|
<npc id="24197" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Temple Flame Master -->
|
||||||
|
<npc id="24198" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Temple Archon -->
|
||||||
|
<npc id="24199" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Temple High Priest -->
|
||||||
|
</group>
|
||||||
|
<group name="KAIN" spawnByDefault="false">
|
||||||
|
<npc id="24179" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Kain van Halter -->
|
||||||
|
</group>
|
||||||
|
<group name="KAIN_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="24168" x="-245773" y="191704" z="3045" heading="49493" /> <!-- Creed Protector -->
|
||||||
|
<npc id="24169" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Soul Reaper -->
|
||||||
|
<npc id="24170" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Zealous Berserker -->
|
||||||
|
<npc id="24171" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Soul Destroyer -->
|
||||||
|
<npc id="24172" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Heretic Inquisitor -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_1" spawnByDefault="false">
|
||||||
|
<npc id="26321" x="-245765" y="194229" z="3200" heading="49493" /> <!-- Etis van Etina 1 -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_2" spawnByDefault="false">
|
||||||
|
<npc id="26322" x="-245766" y="192148" z="3054" heading="49493" /> <!-- Etis van Etina 2 -->
|
||||||
|
</group>
|
||||||
|
<group name="ETINA_MINIONS" spawnByDefault="false">
|
||||||
|
<npc id="26323" x="-245420" y="191795" z="3045" heading="49493" /> <!-- Martyr of Avarice -->
|
||||||
|
<npc id="26324" x="-245394" y="192477" z="3045" heading="49493" /> <!-- Guide of Arrogance -->
|
||||||
|
<npc id="26325" x="-246147" y="192497" z="3045" heading="49493" /> <!-- Seeker of Despair -->
|
||||||
|
<npc id="26326" x="-246132" y="191819" z="3045" heading="49493" /> <!-- Liberator of Lust -->
|
||||||
|
</group>
|
||||||
|
<group name="SEALS" spawnByDefault="false">
|
||||||
|
<npc id="19677" x="-246859" y="193321" z="3045" heading="0" /> <!-- Seal of Gnosis -->
|
||||||
|
<npc id="19678" x="-246888" y="192729" z="3045" heading="0" /> <!-- Seal of Strife -->
|
||||||
|
<npc id="19679" x="-246896" y="192148" z="3045" heading="0" /> <!-- Seal of Avarice -->
|
||||||
|
<npc id="19680" x="-244640" y="193331" z="3044" heading="0" /> <!-- Seal of Punishment -->
|
||||||
|
<npc id="19681" x="-244647" y="192739" z="3045" heading="0" /> <!-- Seal of Awakening -->
|
||||||
|
<npc id="19682" x="-244641" y="192155" z="3045" heading="0" /> <!-- Seal of Calamity -->
|
||||||
|
<npc id="19683" x="-244640" y="191566" z="3045" heading="0" /> <!-- Seal of Destruction -->
|
||||||
|
</group>
|
||||||
|
</spawnlist>
|
||||||
|
</instance>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -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>
|
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Devianne:<br>
|
||||||
|
Behold the power of the Ivory Tower Wizards!<br>
|
||||||
|
</body></html>
|
@@ -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>
|
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Sporcha:<br>
|
||||||
|
Are you ready to fight?<br>
|
||||||
|
</body></html>
|
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Aliber:<br>
|
||||||
|
Rage against all that stands in our way!<br>
|
||||||
|
</body></html>
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,3 @@
|
|||||||
|
<html><body>Leona Blackbird:<br>
|
||||||
|
You can enter only solo.
|
||||||
|
</body></html>
|
@@ -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>
|
@@ -2270,6 +2270,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="15" />
|
<radius normal="15" />
|
||||||
<height normal="30" />
|
<height normal="30" />
|
||||||
@@ -2296,6 +2301,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="15" />
|
<radius normal="15" />
|
||||||
<height normal="30" />
|
<height normal="30" />
|
||||||
@@ -2322,6 +2332,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="35.5" />
|
<height normal="35.5" />
|
||||||
@@ -2348,6 +2363,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="35.5" />
|
<height normal="35.5" />
|
||||||
@@ -2373,6 +2393,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="32.5" />
|
<height normal="32.5" />
|
||||||
@@ -2398,6 +2423,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="41" />
|
<height normal="41" />
|
||||||
@@ -2423,6 +2453,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="28" />
|
<height normal="28" />
|
||||||
@@ -2448,6 +2483,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2473,6 +2513,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2498,6 +2543,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="35" />
|
<radius normal="35" />
|
||||||
<height normal="47" />
|
<height normal="47" />
|
||||||
@@ -2523,6 +2573,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="34.5" />
|
<height normal="34.5" />
|
||||||
@@ -2548,6 +2603,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="16" />
|
<radius normal="16" />
|
||||||
<height normal="32.5" />
|
<height normal="32.5" />
|
||||||
@@ -2573,6 +2633,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="28" />
|
<height normal="28" />
|
||||||
@@ -2598,6 +2663,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="32" />
|
<radius normal="32" />
|
||||||
<height normal="51" />
|
<height normal="51" />
|
||||||
@@ -2609,7 +2679,7 @@
|
|||||||
<skill id="16758" level="1" /> <!-- Embryo -->
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24178" level="107" type="Monster" name="Camille" title="Final Apostle">
|
<npc id="24178" level="107" type="RaidBoss" name="Camille" title="Final Apostle">
|
||||||
<race>HUMANOID</race>
|
<race>HUMANOID</race>
|
||||||
<sex>FEMALE</sex>
|
<sex>FEMALE</sex>
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
@@ -2622,6 +2692,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="30" />
|
<radius normal="30" />
|
||||||
<height normal="40" />
|
<height normal="40" />
|
||||||
@@ -2634,7 +2709,7 @@
|
|||||||
<skill id="16899" level="2" /> <!-- Camille -->
|
<skill id="16899" level="2" /> <!-- Camille -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24179" level="107" type="Monster" name="Kain van Halter" title="Void Apostle">
|
<npc id="24179" level="107" type="RaidBoss" name="Kain van Halter" title="Void Apostle">
|
||||||
<race>DEMONIC</race>
|
<race>DEMONIC</race>
|
||||||
<sex>MALE</sex>
|
<sex>MALE</sex>
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
@@ -2647,6 +2722,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="36" />
|
<radius normal="36" />
|
||||||
<height normal="87" />
|
<height normal="87" />
|
||||||
@@ -3102,6 +3182,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="11" />
|
<radius normal="11" />
|
||||||
<height normal="25.5" />
|
<height normal="25.5" />
|
||||||
@@ -3127,6 +3212,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="11" />
|
<radius normal="11" />
|
||||||
<height normal="25.5" />
|
<height normal="25.5" />
|
||||||
@@ -3152,6 +3242,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="29" />
|
<height normal="29" />
|
||||||
@@ -3163,24 +3258,34 @@
|
|||||||
<skill id="16758" level="1" /> <!-- Embryo -->
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
</skillList>
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="24199" level="85" type="Npc" name="Temple High Priest">
|
<npc id="24199" level="107" type="Monster" name="Temple High Priest">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
|
||||||
<race>ETC</race>
|
<race>ETC</race>
|
||||||
<sex>FEMALE</sex>
|
<sex>FEMALE</sex>
|
||||||
<equipment rhand="17426" />
|
<equipment rhand="17426" />
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="480642.196531792" hpRegen="9.5" mp="26106.2706270627" mpRegen="3.3" />
|
||||||
|
<attack physical="62498" magical="53196" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="5913" magical="3434" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="50" />
|
<walk ground="50" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="14" />
|
<radius normal="14" />
|
||||||
<height normal="29" />
|
<height normal="29" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14823" level="1" /> <!-- Instant Kill Attack Resistance -->
|
||||||
|
<skill id="16758" level="1" /> <!-- Embryo -->
|
||||||
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
</list>
|
</list>
|
||||||
|
@@ -509,43 +509,103 @@
|
|||||||
<height normal="81" />
|
<height normal="81" />
|
||||||
</collision>
|
</collision>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26321" level="85" type="Npc" name="Etis van Etina" title="Overlord">
|
<npc id="26321" level="108" type="RaidBoss" name="Etis van Etina" title="Overlord">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
<race>HUMANOID</race>
|
||||||
<race>ETC</race>
|
<sex>MALE</sex>
|
||||||
<sex>FEMALE</sex>
|
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="7209629.47976879" hpRegen="9.5" mp="72062.7062706271" mpRegen="3.3" />
|
||||||
|
<attack physical="65855" magical="56801" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="6269" magical="3641" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="60" />
|
<walk ground="60" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="30" />
|
<radius normal="30" />
|
||||||
<height normal="78.6" />
|
<height normal="78.6" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
|
||||||
|
<skill id="32416" level="1" /> <!-- Etis van Etina -->
|
||||||
|
</skillList>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26322" level="85" type="Npc" name="Etis van Etina" title="Overlord">
|
<npc id="26322" level="108" type="RaidBoss" name="Etis van Etina" title="Overlord">
|
||||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
<race>HUMANOID</race>
|
||||||
<race>ETC</race>
|
<sex>MALE</sex>
|
||||||
<sex>FEMALE</sex>
|
<acquire exp="57856472640" sp="52068096" />
|
||||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||||
<vitals hp="8446" hpRegen="10.5" mp="2355" mpRegen="3.6" />
|
<vitals hp="7209629.47976879" hpRegen="9.5" mp="72062.7062706271" mpRegen="3.3" />
|
||||||
|
<attack physical="65855" magical="56801" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||||
|
<defence physical="6269" magical="3641" />
|
||||||
<speed>
|
<speed>
|
||||||
<walk ground="60" />
|
<walk ground="60" />
|
||||||
<run ground="180" />
|
<run ground="180" />
|
||||||
</speed>
|
</speed>
|
||||||
<attack physical="1950.2231755595" magical="1331.5869440987" critical="4" attackSpeed="253" range="40" />
|
|
||||||
<defence physical="405.85106382979" magical="297.0297029703" />
|
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="false" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="42" />
|
<radius normal="42" />
|
||||||
<height normal="136.2" />
|
<height normal="136.2" />
|
||||||
</collision>
|
</collision>
|
||||||
|
<skillList>
|
||||||
|
<skill id="4416" level="6" /> <!-- Humanoids -->
|
||||||
|
<skill id="5467" level="1" /> <!-- Dark Attack -->
|
||||||
|
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
|
||||||
|
<skill id="32416" level="1" /> <!-- Etis van Etina -->
|
||||||
|
</skillList>
|
||||||
|
<dropLists>
|
||||||
|
<drop>
|
||||||
|
<item id="17446" min="1" max="1" chance="0.03" /> <!-- Eternal Sigil -->
|
||||||
|
<item id="17433" min="1" max="1" chance="0.03" /> <!-- Eternal Gauntlets - Heavy armor -->
|
||||||
|
<item id="17434" min="1" max="1" chance="0.03" /> <!-- Eternal Boots - Heavy armor -->
|
||||||
|
<item id="17435" min="1" max="1" chance="0.03" /> <!-- Eternal Shield -->
|
||||||
|
<item id="17436" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Helmet - Light armor -->
|
||||||
|
<item id="17437" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Armor - Light armor -->
|
||||||
|
<item id="17438" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Leggings - Light armor -->
|
||||||
|
<item id="17439" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Gloves - Light armor -->
|
||||||
|
<item id="17440" min="1" max="1" chance="0.03" /> <!-- Eternal Leather Boots - Light armor -->
|
||||||
|
<item id="17441" min="1" max="1" chance="0.03" /> <!-- Eternal Circlet - Robe -->
|
||||||
|
<item id="17442" min="1" max="1" chance="0.03" /> <!-- Eternal Tunic - Robe -->
|
||||||
|
<item id="17443" min="1" max="1" chance="0.03" /> <!-- Eternal Stockings - Robe -->
|
||||||
|
<item id="17444" min="1" max="1" chance="0.03" /> <!-- Eternal Gloves - Robe -->
|
||||||
|
<item id="17445" min="1" max="1" chance="0.03" /> <!-- Eternal Shoes - Robe -->
|
||||||
|
<item id="17432" min="1" max="1" chance="0.03" /> <!-- Eternal Gaiters - Heavy armor -->
|
||||||
|
<item id="17431" min="1" max="1" chance="0.03" /> <!-- Eternal Breastplate - Heavy armor -->
|
||||||
|
<item id="17430" min="1" max="1" chance="0.03" /> <!-- Eternal Helmet - Heavy armor -->
|
||||||
|
<item id="17417" min="1" max="1" chance="0.003" /> <!-- Helios Cutter -->
|
||||||
|
<item id="17418" min="1" max="1" chance="0.003" /> <!-- Helios Slasher -->
|
||||||
|
<item id="17419" min="1" max="1" chance="0.003" /> <!-- Helios Avenger -->
|
||||||
|
<item id="17420" min="1" max="1" chance="0.003" /> <!-- Helios Fighter -->
|
||||||
|
<item id="17421" min="1" max="1" chance="0.003" /> <!-- Helios Stormer -->
|
||||||
|
<item id="17422" min="1" max="1" chance="0.003" /> <!-- Helios Thrower -->
|
||||||
|
<item id="17423" min="1" max="1" chance="0.003" /> <!-- Helios Shooter -->
|
||||||
|
<item id="17424" min="1" max="1" chance="0.003" /> <!-- Helios Buster -->
|
||||||
|
<item id="17425" min="1" max="1" chance="0.003" /> <!-- Helios Caster -->
|
||||||
|
<item id="17426" min="1" max="1" chance="0.003" /> <!-- Helios Retributer -->
|
||||||
|
<item id="17427" min="1" max="1" chance="0.003" /> <!-- Helios Dual Swords -->
|
||||||
|
<item id="17428" min="1" max="1" chance="0.003" /> <!-- Helios Dual Daggers -->
|
||||||
|
<item id="17429" min="1" max="1" chance="0.003" /> <!-- Helios Dual Blunt Weapons -->
|
||||||
|
<item id="17416" min="1" max="1" chance="0.003" /> <!-- Helios Shaper -->
|
||||||
|
<item id="17527" min="1" max="1" chance="61.08" /> <!-- Scroll: Enchant R-grade Armor -->
|
||||||
|
<item id="17526" min="1" max="1" chance="42" /> <!-- Scroll: Enchant R-grade Weapon -->
|
||||||
|
<item id="19448" min="1" max="1" chance="8.736" /> <!-- Blessed Scroll: Enchant R-grade Armor -->
|
||||||
|
<item id="19447" min="1" max="1" chance="6.035" /> <!-- Blessed Scroll: Enchant R-grade Weapon -->
|
||||||
|
</drop>
|
||||||
|
</dropLists>
|
||||||
</npc>
|
</npc>
|
||||||
<npc id="26323" level="107" type="Monster" name="Martyr of Avarice">
|
<npc id="26323" level="107" type="Monster" name="Martyr of Avarice">
|
||||||
<race>DEMONIC</race>
|
<race>DEMONIC</race>
|
||||||
@@ -560,6 +620,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="65" />
|
<height normal="65" />
|
||||||
@@ -585,6 +650,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="65" />
|
<height normal="65" />
|
||||||
@@ -610,6 +680,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="60" />
|
<height normal="60" />
|
||||||
@@ -635,6 +710,11 @@
|
|||||||
</speed>
|
</speed>
|
||||||
</stats>
|
</stats>
|
||||||
<status attackable="true" />
|
<status attackable="true" />
|
||||||
|
<ai type="BALANCED" clanHelpRange="4500" aggroRange="450">
|
||||||
|
<clanList>
|
||||||
|
<clan>ETINA_SOLO</clan>
|
||||||
|
</clanList>
|
||||||
|
</ai>
|
||||||
<collision>
|
<collision>
|
||||||
<radius normal="22" />
|
<radius normal="22" />
|
||||||
<height normal="60" />
|
<height normal="60" />
|
||||||
|
Reference in New Issue
Block a user