Addition of Procella and Nebula instances.

Contributed by robikbobik.
This commit is contained in:
MobiusDevelopment
2019-10-29 14:33:00 +00:00
parent bbfcc14c50
commit 5a8c209e15
33 changed files with 1438 additions and 87 deletions

View File

@@ -0,0 +1,6 @@
<!-- Translated from Russian -->
<html><body>Iris:<br>
I went to study one place where the energy of the water was very strong. At that moment, when the radiation became incredibly powerful, I saw a beautiful maiden, over whose head I took off a huge silhouette from a water. It was the Queen Nebula. Somehow he managed to divide himself and gain two bodies.<br>
<font color="LEVEL">(You need a command channel of 18 or more characters.)</font>.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ResidenceOfQueenNebula ENTER">Move to the top level of Garden of Eva</Button>
</body></html>

View File

@@ -1,6 +1,7 @@
<html><body>Iris:<br>
This is the Garden of Eva. As a member of the Bronze Guild, I advertised for equipment to explore the area for relics, but I don't know where it's all disappeared to...<br>
And in a place I changed upon, <font color="LEVEL">I saw the Water Spirit Queen</font> who used to dwell here. I saw her from afar, but I still remember every detail. If you're curious, I'll tell you more.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_teleport OTHER 0">Move to Upper Terrace of Garden of Eva</Button>
<!--<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 0">I want to know more about the Water Spirit Queen</Button>-->
This is the Garden of Eva. The strongest monsters inhabit the top levels. bronze Key Guild appointed me to head a squad and to explore local ruins. But I have already lost all my squad somehow...<br>
But I managed to find out a couple of things. Though. If you came here with your companions, I would recommend to go the room in the end of the tunnel. Or you can go straight to the top level. If you are here for the first time I will be happy to show your around.<br>
By the way, I have seen the <font color="LEVEL">Water Spirit Queen</font> here not so long ago. She was passing by not far from here and I hgazed in admiration at here movements. If you are interested I can tell you more.<br><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_teleport OTHER 0">Teleport to the top level of Garden of Eva</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Learn more about the Water Spirit Queen</Button>
</body></html>

View File

@@ -3,6 +3,6 @@
I went to study one place where the energy of the fire was very strong. At that moment, when the radiation became incredibly powerful, I saw a beautiful maiden, over whose head I took off a huge silhouette woven from a burning flame. It was the King of Spirits <font color="LEVEL">Fire Ignis</font>. Somehow he managed to divide himself and gain two bodies.<br>
And you know, it's very strange, but in the same place I saw <font color="LEVEL">Ice Queen Freya</font>. What could Freya do where the energy of fire pulsates? King Ignis has not yet declared himself openly, but is hiding and accumulating strength. Perhaps, when he leaves the shelter, Aden will plunge into chaos. Therefore, it is necessary in whatever would prevent Ignis.<br>
But first you need to get <font color="LEVEL">a force that will help withstand the energy of fire</font>. Collect loyal supporters and come back !!! Alone you can not cope.<br>
<font color="LEVEL">(You need a command channel of 27 or more characters.)</font>.<br1>
<font color="LEVEL">(You need a command channel of 18 or more characters.)</font>.<br1>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ResidenceOfKingIgnis ENTER">Move to the lair of King Ignis</Button>
</body></html>

View File

@@ -3,6 +3,6 @@
Haha, I knew you were coming to find out more. Wind Kings are called <font color="LEVEL">Prochela</font>. One hero, who was lucky to return alive after meeting him, said that Procella commands the deadly <font color="LEVEL">whirlwinds</font>.<br>
Moreover, in battle, the King of Spirits creates <font color="LEVEL">multiple doubles</font>. Killing one makes the rest even meaner and more dangerous.<br>
At the mere thought of this, I have a cold skin. Maybe you want to challenge him? I know where the King of Spirits lives, and I can send you to him. If you are ready, then gather supporters and get ready for battle. I wonder what happens. But remember: Prochella is very strong and dangerous.<br1>
(<font color="LEVEL">You need a command channel of 27 or more characters.</font>)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 2">Move to the Wind King's Lair</Button>
(<font color="LEVEL">You need a command channel of 18 or more characters.</font>)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ResidenceOfKingProcella ENTER">Move to the Wind King's Lair</Button>
</body></html>

View File

@@ -3,6 +3,6 @@
Oh, I got you interested, right? As a child I read an old book about the King of Spirits <font color="LEVEL">Petrama</font>. True, I always thought of Petram as a mere fiction. And then the ships invaded the spirits, and I had to do research to find out the reason. Imagine my surprise when I realized that Peter really exists!<br>
He's just huge! His body is like a rock, and his fists are like huge boulders. What else to tell? Hmm ..... Oh, yes! In that old book it was written that <font color="LEVEL">the stones covering the body of the King of the Earth Spirits make it virtually invulnerable</font>.<br>
He is really incredibly strong and dangerous. Therefore, to meet with Peter must be prepared. You have to develop <font color="LEVEL">a force that will help resist earth energy</font>. When you are ready, come along with colleagues, and I will tell you where to find this giant.<br>
<font color="LEVEL">(You need a command channel of 27 or more characters.)</font><br>
<font color="LEVEL">(You need a command channel of 18 or more characters.)</font><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest ResidenceOfKingPetram ENTER">Move to Petram</Button>
</body></html>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance id="197" maxWorlds="80" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<time duration="120" empty="0" />
<removeBuffs type="ALL" />
<locations>
<enter type="FIXED">
<location x="212884" y="178847" z="-15485" />
</enter>
<exit type="ORIGIN" />
</locations>
<conditions>
<condition type="Party" />
<condition type="CommandChannel" />
<condition type="CommandChannelLeader" />
<condition type="GroupMin">
<param name="limit" value="18" /> <!-- The Kamael update -->
</condition>
<condition type="GroupMax">
<param name="limit" value="100" />
</condition>
<condition type="Level">
<param name="min" value="76" />
<param name="max" value="82" />
</condition>
<condition type="Distance" />
<condition type="Reenter" />
</conditions>
<reenter apply="ON_ENTER">
<reset day="WEDNESDAY" hour="6" minute="30" />
</reenter>
</instance>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<instance id="196" maxWorlds="80" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/instance.xsd">
<time duration="120" empty="0" />
<removeBuffs type="ALL" />
<locations>
<enter type="FIXED">
<location x="222149" y="168087" z="-15485" />
</enter>
<exit type="ORIGIN" />
</locations>
<conditions>
<condition type="Party" />
<condition type="CommandChannel" />
<condition type="CommandChannelLeader" />
<condition type="GroupMin">
<param name="limit" value="18" /> <!-- The Kamael update -->
</condition>
<condition type="GroupMax">
<param name="limit" value="100" />
</condition>
<condition type="Level">
<param name="min" value="76" />
<param name="max" value="82" />
</condition>
<condition type="Distance" />
<condition type="Reenter" />
</conditions>
<reenter apply="ON_ENTER">
<reset day="WEDNESDAY" hour="6" minute="30" />
</reenter>
<spawnlist>
<group>
<npc id="29106" x="222127" y="169057" z="-15486" heading="48730" /> <!-- Nebula -->
</group>
</spawnlist>
</instance>

View File

@@ -0,0 +1,163 @@
/*
* 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.ResidenceOfKingProcella;
import org.l2jmobius.gameserver.enums.ChatType;
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.actor.instance.RaidBossInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import instances.AbstractInstance;
/**
* @author RobikBobik
* @NOTE: Retail like working
* @TODO: Rewrite code to modern style.
*/
public class ResidenceOfKingProcella extends AbstractInstance
{
// NPCs
private static final int WIRI = 34048;
private static final int PROCELLA = 29107;
private static final int PROCELLA_GUARDIAN_1 = 29112;
private static final int PROCELLA_GUARDIAN_2 = 29113;
private static final int PROCELLA_GUARDIAN_3 = 29114;
private static final int PROCELLA_STORM = 29115;
// Skills
private static final SkillHolder HURRICANE_SUMMON = new SkillHolder(50042, 1); // When spawn Minion
private static final SkillHolder HURRICANE_BOLT = new SkillHolder(50043, 1); // When player in Radius + para
// Misc
private static final int TEMPLATE_ID = 197;
private static int STORM_MAX_COUNT = 16; // TODO: Max is limit ?
private int _procellaStormCount;
private RaidBossInstance _procella;
private MonsterInstance _minion1;
private MonsterInstance _minion2;
private MonsterInstance _minion3;
public ResidenceOfKingProcella()
{
super(TEMPLATE_ID);
addStartNpc(WIRI);
addKillId(PROCELLA, PROCELLA_GUARDIAN_1, PROCELLA_GUARDIAN_2, PROCELLA_GUARDIAN_3);
addInstanceEnterId(TEMPLATE_ID);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "ENTER":
{
enterInstance(player, npc, TEMPLATE_ID);
_procella = (RaidBossInstance) addSpawn(PROCELLA, 212862, 179828, -15489, 49151, false, 0, true, player.getInstanceId());
startQuestTimer("SPAWN_MINION", 20000, _procella, player);
startQuestTimer("SPAWN_STORM", 5000, _procella, player);
_procellaStormCount = 0;
break;
}
case "SPAWN_MINION":
{
if (npc.getId() == PROCELLA)
{
_minion1 = (MonsterInstance) addSpawn(PROCELLA_GUARDIAN_1, 212663, 179421, -15486, 31011, true, 0, true, npc.getInstanceId());
_minion2 = (MonsterInstance) addSpawn(PROCELLA_GUARDIAN_2, 213258, 179822, -15486, 12001, true, 0, true, npc.getInstanceId());
_minion3 = (MonsterInstance) addSpawn(PROCELLA_GUARDIAN_3, 212558, 179974, -15486, 12311, true, 0, true, npc.getInstanceId());
startQuestTimer("HIDE_PROCELLA", 3000, _procella, null);
}
break;
}
case "SPAWN_STORM":
{
if (_procellaStormCount < STORM_MAX_COUNT)
{
_procella.useMagic(HURRICANE_SUMMON.getSkill());
final Npc procellaStorm = addSpawn(PROCELLA_STORM, _procella.getX() + getRandom(-500, 500), _procella.getY() + getRandom(-500, 500), _procella.getZ(), 31011, true, 0, true, npc.getInstanceId());
procellaStorm.setRandomWalking(true);
_procellaStormCount++;
startQuestTimer("SPAWN_STORM", 300000, _procella, null);
startQuestTimer("CHECK_CHAR_INSIDE_RADIUS_NPC", 1000, procellaStorm, player);
}
break;
}
case "HIDE_PROCELLA":
{
if (_procella.isInvisible())
{
_procella.setInvisible(false);
_procella.broadcastSay(ChatType.NPC_SHOUT, "Im invisible");
}
else
{
_procella.setInvisible(true);
_procella.broadcastSay(ChatType.NPC_SHOUT, "Im visible");
startQuestTimer("SPAWN_MINION", 300000, _procella, player);
}
break;
}
case "CHECK_CHAR_INSIDE_RADIUS_NPC":
{
if ((player != null) && (player.isInsideRadius3D(npc, 200)))
{
npc.abortAttack();
npc.abortCast();
npc.setTarget(player);
if (SkillCaster.checkUseConditions(npc, HURRICANE_BOLT.getSkill()))
{
npc.doCast(HURRICANE_BOLT.getSkill());
}
startQuestTimer("CHECK_CHAR_INSIDE_RADIUS_NPC", 10000, npc, player);
}
else
{
startQuestTimer("CHECK_CHAR_INSIDE_RADIUS_NPC", 10000, npc, player);
}
break;
}
}
return null;
}
@Override
public String onKill(Npc npc, PlayerInstance player, boolean isSummon)
{
if (npc.getId() == PROCELLA)
{
final Instance world = npc.getInstanceWorld();
if (world != null)
{
world.finishInstance();
}
}
else if ((_minion1.isDead()) && (_minion2.isDead()) && (_minion3.isDead()))
{
startQuestTimer("HIDE_PROCELLA", 1000, _procella, null);
}
return super.onKill(npc, player, isSummon);
}
public static void main(String[] args)
{
new ResidenceOfKingProcella();
}
}

View File

@@ -0,0 +1,168 @@
/*
* 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.ResidenceOfQueenNebula;
import org.l2jmobius.gameserver.model.actor.Npc;
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.SkillCaster;
import instances.AbstractInstance;
/**
* @author RobikBobik
* @NOTE: Retail like working
* @TODO: Rewrite code to modern style.
* @TODO: Nebula uses attacks on a surface, summons minions (Water Slime) and casts
* @TODO: The less Nebula's HP, the more damage she deals.
*/
public class ResidenceOfQueenNebula extends AbstractInstance
{
// NPCs
private static final int IRIS = 34046;
private static final int NEBULA = 29106;
private static final int WATER_SLIME = 29111;
// Misc
private static final int TEMPLATE_ID = 196;
// Skills
// Debuffs which reduces Speed and increases the damage received (the effect stacks up to 5 times). When it's stacked to 5 times, the character becomes unable to move or make any actions.
private static SkillHolder AQUA_RAGE_1 = new SkillHolder(50036, 1);
private static SkillHolder AQUA_RAGE_2 = new SkillHolder(50036, 2);
private static SkillHolder AQUA_RAGE_3 = new SkillHolder(50036, 3);
private static SkillHolder AQUA_RAGE_4 = new SkillHolder(50036, 4);
private static SkillHolder AQUA_RAGE_5 = new SkillHolder(50036, 5);
public ResidenceOfQueenNebula()
{
super(TEMPLATE_ID);
addStartNpc(IRIS);
addKillId(NEBULA);
addSpawnId(NEBULA);
addInstanceLeaveId(TEMPLATE_ID);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "ENTER":
{
enterInstance(player, npc, TEMPLATE_ID);
break;
}
case "SPAWN_WATER_SLIME":
{
startQuestTimer("CAST_AQUA_RAGE", 5000, npc, player);
if (npc.getId() == NEBULA)
{
for (int i = 0; i < getRandom(4, 6); i++)
{
addSpawn(npc, WATER_SLIME, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), true, -1, true, npc.getInstanceId());
startQuestTimer("SPAWN_WATER_SLIME", 300000, npc, null);
}
}
break;
}
case "PLAYER_PARA":
{
player.setIsImmobilized(true);
startQuestTimer("PLAYER_UNPARA", 30000, npc, player);
break;
}
case "PLAYER_UNPARA":
{
player.getEffectList().stopSkillEffects(true, AQUA_RAGE_5.getSkill());
player.setIsImmobilized(false);
break;
}
case "CAST_AQUA_RAGE":
{
startQuestTimer("CAST_AQUA_RAGE", 10000, npc, player);
if (!player.isAffectedBySkill(AQUA_RAGE_1))
{
if (SkillCaster.checkUseConditions(npc, AQUA_RAGE_1.getSkill()))
{
npc.doCast(AQUA_RAGE_1.getSkill());
}
}
else if (player.isAffectedBySkill(AQUA_RAGE_1))
{
if (SkillCaster.checkUseConditions(npc, AQUA_RAGE_2.getSkill()))
{
player.getEffectList().stopSkillEffects(true, AQUA_RAGE_1.getSkill());
npc.doCast(AQUA_RAGE_2.getSkill());
}
}
else if (player.isAffectedBySkill(AQUA_RAGE_2))
{
if (SkillCaster.checkUseConditions(npc, AQUA_RAGE_3.getSkill()))
{
player.getEffectList().stopSkillEffects(true, AQUA_RAGE_2.getSkill());
npc.doCast(AQUA_RAGE_3.getSkill());
}
}
else if (player.isAffectedBySkill(AQUA_RAGE_3))
{
if (SkillCaster.checkUseConditions(npc, AQUA_RAGE_4.getSkill()))
{
player.getEffectList().stopSkillEffects(true, AQUA_RAGE_3.getSkill());
npc.doCast(AQUA_RAGE_4.getSkill());
}
}
else if (player.isAffectedBySkill(AQUA_RAGE_4))
{
if (SkillCaster.checkUseConditions(npc, AQUA_RAGE_5.getSkill()))
{
player.getEffectList().stopSkillEffects(true, AQUA_RAGE_4.getSkill());
npc.doCast(AQUA_RAGE_5.getSkill());
startQuestTimer("PLAYER_PARA", 1000, npc, player);
}
}
break;
}
}
return null;
}
@Override
public String onSpawn(Npc npc)
{
startQuestTimer("SPAWN_WATER_SLIME", 12000, npc, null);
return super.onSpawn(npc);
}
@Override
public String onKill(Npc npc, PlayerInstance player, boolean isSummon)
{
if (npc.getId() == NEBULA)
{
final Instance world = npc.getInstanceWorld();
if (world != null)
{
world.finishInstance();
}
}
return super.onKill(npc, player, isSummon);
}
public static void main(String[] args)
{
new ResidenceOfQueenNebula();
}
}

View File

@@ -541,7 +541,7 @@
<height normal="0.001" />
</collision>
</npc>
<npc id="29111" level="80" type="Npc" name="Water Slime">
<npc id="29111" level="80" type="Monster" name="Water Slime">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
@@ -560,7 +560,7 @@
<height normal="39" />
</collision>
</npc>
<npc id="29112" level="80" type="Npc" name="Procella's Guardian">
<npc id="29112" level="80" type="Monster" name="Procella's Guardian">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
@@ -579,7 +579,7 @@
<height normal="133" />
</collision>
</npc>
<npc id="29113" level="80" type="Npc" name="Procella's Guardian">
<npc id="29113" level="80" type="Monster" name="Procella's Guardian">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
@@ -598,7 +598,7 @@
<height normal="133" />
</collision>
</npc>
<npc id="29114" level="80" type="Npc" name="Procella's Guardian">
<npc id="29114" level="80" type="Monster" name="Procella's Guardian">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
@@ -617,11 +617,11 @@
<height normal="133" />
</collision>
</npc>
<npc id="29115" level="80" type="Npc" name="Procella's Storm">
<npc id="29115" level="80" type="Monster" name="Procella's Storm">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ETC</race>
<sex>FEMALE</sex>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<stats str="88" int="79" dex="55" wit="20" con="82" men="78">
<vitals hp="8446" hpRegen="10.5" mp="18000" mpRegen="3.6" />
<speed>
<walk ground="50" />

View File

@@ -373,12 +373,34 @@
<skill id="50043" toLevel="2" name="Hurricane Bolt">
<!-- Bolt of lightning attacks with 138 Power added to M. Atk., paralyses for 5 sec. -->
<icon>icon.skill1170</icon>
<operateType>A1</operateType>
<isDebuff>true</isDebuff>
<castRange>600</castRange>
<hitTime>2500</hitTime>
<coolTime>500</coolTime>
<abnormalTime>5</abnormalTime>
<activateRate>80</activateRate>
<basicProperty>MAGIC</basicProperty>
<castRange>900</castRange>
<effectPoint>-100</effectPoint>
<effectRange>1400</effectRange>
<hitTime>2500</hitTime>
<isDebuff>true</isDebuff>
<isMagic>1</isMagic> <!-- Magic Skill -->
<lvlBonusRate>1</lvlBonusRate>
<magicLvl>85</magicLvl>
<mpConsume>69</mpConsume>
<operateType>A2</operateType>
<abnormalType>PARALYZE</abnormalType>
<magicCriticalRate>-5</magicCriticalRate>
<abnormalLvl>1</abnormalLvl>
<trait>PARALYZE</trait>
<attributeType>DARK</attributeType>
<attributeValue>120</attributeValue>
<abnormalVisualEffect>PARALYZE</abnormalVisualEffect>
<targetType>ENEMY</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="BlockActions" />
<effect name="MagicalAttack">
<power>138</power>
</effect>
</effects>
</skill>
<skill id="50044" toLevel="2" name="Hurricane Destruction">
<!-- Strong whirlwind attacks with 170 Power added to M. Atk. and knocks down nereby enemies. -->