Ramona AI rework.

Contributed by gigilo1968.
This commit is contained in:
MobiusDevelopment
2019-10-04 09:17:55 +00:00
parent 81a0e074e7
commit 823e36783c
44 changed files with 2310 additions and 1000 deletions

View File

@@ -172,6 +172,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(78023, 172262, -10604, 16383); private static final Location DEFAULT_LOC = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(78012, 169922, -10467, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(78012, 169922, -10467, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -1651,9 +1651,9 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="13945521" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" /> <vitals hp="20949082.10169" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="300" water="300" wind="300" earth="300" holy="250" dark="370"/> <defence fire="300" water="300" wind="300" earth="300" holy="250" dark="370"/>
</attribute> </attribute>
@@ -1662,6 +1662,11 @@
<run ground="270" /> <run ground="270" />
</speed> </speed>
</stats> </stats>
<status attackable="true" />
<collision>
<radius normal="30" />
<height normal="54" />
</collision>
<skillList> <skillList>
<skill id="4416" level="6" /> <!-- Humanoids --> <skill id="4416" level="6" /> <!-- Humanoids -->
<skill id="5467" level="1" /> <!-- Dark Attack --> <skill id="5467" level="1" /> <!-- Dark Attack -->
@@ -1779,10 +1784,6 @@
<item id="40198" min="1" max="1" chance="0.03" /> <!-- Disassembly Recipe Pouch: Armor --> <item id="40198" min="1" max="1" chance="0.03" /> <!-- Disassembly Recipe Pouch: Armor -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="30" />
<height normal="54" />
</collision>
</npc> </npc>
<npc id="26125" level="104" type="Monster" name="Giant Atelia"> <npc id="26125" level="104" type="Monster" name="Giant Atelia">
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
@@ -1918,7 +1919,6 @@
</collision> </collision>
</npc> </npc>
<npc id="26131" level="101" type="RaidBoss" name="Isabella" title="Raid Boss"> <npc id="26131" level="101" type="RaidBoss" name="Isabella" title="Raid Boss">
<!-- Source: www.l2wiki.com -->
<parameters> <parameters>
<minions name="Privates"> <minions name="Privates">
<npc id="26132" count="2" respawnTime="360" weightPoint="1" /> <npc id="26132" count="2" respawnTime="360" weightPoint="1" />
@@ -1927,20 +1927,25 @@
</parameters> </parameters>
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="54225186393" sp="130140121" raidPoints="30" /> <acquire exp="57494325657" sp="137986036" raidPoints="30" />
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="8161846" hpRegen="1771.9298245614" mp="48616" mpRegen="1870.37037037037" /> <vitals hp="27519758.98749" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<attack physical="295358.4152" magical="211816.358" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
<defence physical="34243.68753" magical="16714.49407" />
<speed> <speed>
<walk ground="60" /> <walk ground="60" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="48095.2380952381" magical="8487.39495798319" critical="4" attackSpeed="253" range="40" />
<defence physical="3740.74074074074" magical="2172.04301075269" />
<attribute> <attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" /> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="WIND" value="430" /> <attack type="WIND" value="430" />
</attribute> </attribute>
</stats> </stats>
<status attackable="true" />
<collision>
<radius normal="24" />
<height normal="67.5" />
</collision>
<skillList> <skillList>
<skill id="4416" level="6" /> <!-- Humanoids --> <skill id="4416" level="6" /> <!-- Humanoids -->
<skill id="5464" level="1" /> <!-- Wind Attack --> <skill id="5464" level="1" /> <!-- Wind Attack -->
@@ -2028,10 +2033,6 @@
<item id="39629" min="2" max="2" chance="100" /> <!-- Fortune Pocket - Stage 1 --> <item id="39629" min="2" max="2" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="24" />
<height normal="67.5" />
</collision>
</npc> </npc>
<npc id="26132" level="100" type="Monster" name="Croa" title="Raid Minion"> <npc id="26132" level="100" type="Monster" name="Croa" title="Raid Minion">
<!-- Source: www.l2wiki.com --> <!-- Source: www.l2wiki.com -->
@@ -2258,7 +2259,15 @@
<height normal="28.25" /> <height normal="28.25" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2267,8 +2276,8 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" /> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" /> <attack type="EARTH" value="450" />
@@ -2279,6 +2288,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2290,8 +2302,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2300,14 +2321,22 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2320,20 +2349,34 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="27188512" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" /> <vitals hp="40842816.910005" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<speed> <speed>
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="300" water="300" wind="250" earth="370" holy="300" dark="300"/> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute> </attribute>
</stats> </stats>
<skillList> <skillList>
@@ -2341,12 +2384,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="1" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
<clan>RAMONA</clan> <clan>RAMONA</clan>
</clanList> </clanList>
</ai> </ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists> <dropLists>
<drop> <drop>
<item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earrings --> <item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earrings -->
@@ -2432,12 +2486,14 @@
<item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor --> <item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2460,6 +2516,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2472,6 +2530,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2494,6 +2558,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2506,6 +2572,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2528,6 +2600,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2540,6 +2614,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2562,6 +2642,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2601,8 +2683,12 @@
<walk ground="55" /> <walk ground="55" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" /> <attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" /> <defence physical="19070.81481481481" magical="11075.05376344086" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

View File

@@ -0,0 +1,15 @@
2019.10.04 12:09:26,224 INFO 1 org.l2jmobius.commons.database.DatabaseFactory Database: Initialized.
2019.10.04 12:09:26,251 INFO 1 org.l2jmobius.loginserver.LoginController Loading LoginController...
2019.10.04 12:09:27,294 INFO 1 org.l2jmobius.loginserver.LoginController Cached 10 KeyPairs for RSA communication.
2019.10.04 12:09:27,402 INFO 1 org.l2jmobius.loginserver.GameServerTable Loaded 127 server names.
2019.10.04 12:09:27,412 INFO 1 org.l2jmobius.loginserver.GameServerTable Loaded 1 registered Game Servers.
2019.10.04 12:09:27,540 INFO 1 org.l2jmobius.loginserver.GameServerTable Cached 10 RSA keys for Game Server communication.
2019.10.04 12:09:27,549 INFO 1 org.l2jmobius.loginserver.LoginServer Loaded 2 IP Bans.
2019.10.04 12:09:27,550 INFO 1 org.l2jmobius.loginserver.LoginServer Listening for GameServers on 127.0.0.1:9014
2019.10.04 12:09:27,884 INFO 1 org.l2jmobius.loginserver.network.ClientNetworkManager ClientNetworkManager: Listening on 0.0.0.0:2106
2019.10.04 12:10:49,782 INFO 31 org.l2jmobius.loginserver.GameServerThread Updated Gameserver [2] Sieghardt IP's:
2019.10.04 12:10:49,784 INFO 31 org.l2jmobius.loginserver.GameServerThread 127.0.0.1/127.0.0.0/8
2019.10.04 12:10:49,785 INFO 31 org.l2jmobius.loginserver.GameServerThread 192.168.1.4/192.168.1.0/24
2019.10.04 12:10:49,785 INFO 31 org.l2jmobius.loginserver.GameServerThread 178.59.8.209/0.0.0.0/0
2019.10.04 12:11:09,001 INFO 31 org.l2jmobius.loginserver.GameServerThread GameServer [2] Sieghardt: Connection lost: Connection reset
2019.10.04 12:11:09,001 INFO 31 org.l2jmobius.loginserver.GameServerThread Server [2] Sieghardt is now set as disconnected.

View File

@@ -916,6 +916,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings // Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT; public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH; public static long SOD_STAGE_2_LENGTH;
@@ -2410,6 +2415,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
// Gracia Seeds // Gracia Seeds
final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE); final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);

View File

@@ -172,6 +172,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(78023, 172262, -10604, 16383); private static final Location DEFAULT_LOC = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(78012, 169922, -10467, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(78012, 169922, -10467, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -2497,7 +2497,15 @@
<height normal="47.5" /> <height normal="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2506,8 +2514,8 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" /> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" /> <attack type="EARTH" value="450" />
@@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2529,8 +2540,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2539,14 +2559,22 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2559,20 +2587,34 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="27188512" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" /> <vitals hp="40842816.910005" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<speed> <speed>
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="300" water="300" wind="250" earth="370" holy="300" dark="300"/> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute> </attribute>
</stats> </stats>
<skillList> <skillList>
@@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
<clan>RAMONA</clan> <clan>RAMONA</clan>
</clanList> </clanList>
</ai> </ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists> <dropLists>
<drop> <drop>
<item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earrings --> <item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earrings -->
@@ -2671,12 +2724,14 @@
<item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor --> <item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2711,6 +2768,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2745,6 +2810,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2779,6 +2852,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2840,8 +2921,12 @@
<walk ground="55" /> <walk ground="55" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" /> <attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" /> <defence physical="19070.81481481481" magical="11075.05376344086" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

@@ -903,6 +903,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings // Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT; public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH; public static long SOD_STAGE_2_LENGTH;
@@ -2384,6 +2389,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
// Gracia Seeds // Gracia Seeds
final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE); final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);

View File

@@ -172,6 +172,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383); private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -2497,7 +2497,15 @@
<height normal="47.5" /> <height normal="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2506,8 +2514,8 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" /> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" /> <attack type="EARTH" value="450" />
@@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2529,8 +2540,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2539,14 +2559,22 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2559,20 +2587,34 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="27188512" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" /> <vitals hp="40842816.910005" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<speed> <speed>
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="300" water="300" wind="250" earth="370" holy="300" dark="300"/> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute> </attribute>
</stats> </stats>
<skillList> <skillList>
@@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
<clan>RAMONA</clan> <clan>RAMONA</clan>
</clanList> </clanList>
</ai> </ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists> <dropLists>
<drop> <drop>
<item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earring --> <item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earring -->
@@ -2671,12 +2724,14 @@
<item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor --> <item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2711,6 +2768,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2745,6 +2810,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2779,6 +2852,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2840,8 +2921,12 @@
<walk ground="55" /> <walk ground="55" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" /> <attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" /> <defence physical="19070.81481481481" magical="11075.05376344086" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

@@ -899,6 +899,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings // Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT; public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH; public static long SOD_STAGE_2_LENGTH;
@@ -2460,6 +2465,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
// Gracia Seeds // Gracia Seeds
final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE); final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);

View File

@@ -172,6 +172,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383); private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -2497,7 +2497,15 @@
<height normal="47.5" /> <height normal="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2506,8 +2514,8 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" /> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" /> <attack type="EARTH" value="450" />
@@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2529,8 +2540,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2539,14 +2559,22 @@
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2559,20 +2587,34 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="27188512" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" /> <vitals hp="40842816.910005" hpRegen="436.263366" mp="83501.371" mpRegen="3.3" />
<speed> <speed>
<walk ground="40" /> <walk ground="40" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" /> <attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" /> <defence physical="34243.68753" magical="16714.49407" />
<attribute> <attribute>
<defence fire="300" water="300" wind="250" earth="370" holy="300" dark="300"/> <defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute> </attribute>
</stats> </stats>
<skillList> <skillList>
@@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
<clan>RAMONA</clan> <clan>RAMONA</clan>
</clanList> </clanList>
</ai> </ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists> <dropLists>
<drop> <drop>
<item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earring --> <item id="47244" min="1" max="1" chance="50.91" /> <!-- Ramona's Fancy Earring -->
@@ -2671,12 +2724,14 @@
<item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor --> <item id="40198" min="1" max="1" chance="2.568" /> <!-- Disassembly Recipe Pouch: Armor -->
</lucky> </lucky>
</dropLists> </dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2711,6 +2768,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2745,6 +2810,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2779,6 +2852,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2840,8 +2921,12 @@
<walk ground="55" /> <walk ground="55" />
<run ground="180" /> <run ground="180" />
</speed> </speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" /> <attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" /> <defence physical="19070.81481481481" magical="11075.05376344086" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="EARTH" value="450" />
</attribute>
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

@@ -899,6 +899,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings // Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT; public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH; public static long SOD_STAGE_2_LENGTH;
@@ -2460,6 +2465,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
// Gracia Seeds // Gracia Seeds
final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE); final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);

View File

@@ -166,6 +166,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383); private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -2334,7 +2334,15 @@
<height normal="47.5" /> <height normal="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2355,6 +2363,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2366,8 +2377,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2388,6 +2408,10 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2400,7 +2424,20 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
@@ -2419,10 +2456,16 @@
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="5465" level="1" /> <!-- Earth Attack -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="16746" level="1" /> <!-- Ramona --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance --> <skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2506,6 +2549,12 @@
</dropLists> </dropLists>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2528,6 +2577,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2540,6 +2591,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2562,6 +2619,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2574,6 +2633,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2596,6 +2661,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2608,6 +2675,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2630,6 +2703,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

@@ -898,6 +898,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Fafurion // Fafurion
public static int FAFURION_WAIT_TIME; public static int FAFURION_WAIT_TIME;
public static int FAFURION_SPAWN_INTERVAL; public static int FAFURION_SPAWN_INTERVAL;
@@ -2488,6 +2493,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
FAFURION_WAIT_TIME = GrandBossSettings.getInt("FafurionWaitTime", 10); FAFURION_WAIT_TIME = GrandBossSettings.getInt("FafurionWaitTime", 10);
FAFURION_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264); FAFURION_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264);
FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72); FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72);

View File

@@ -166,6 +166,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99 # Minimum players Level for enter to Lindvior. Retail: 99
LindviorMinPlayerLvl = 99 LindviorMinPlayerLvl = 99
# ---------------------------------------------------------------------------
# Ramona
# ---------------------------------------------------------------------------
# Interval time of Ramona. Value is hour. Range 1-480
IntervalOfRamonaSpawn = 72
# Random interval. Range 1-192
RandomOfRamonaSpawn = 48
# Minimal count of players for enter to Ramona. Retail: 7
RamonaMinPlayers = 7
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Helios # Helios
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList; import java.util.ArrayList;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.impl.SkillData; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.Movie; import org.l2jmobius.gameserver.enums.Movie;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
@@ -32,8 +34,10 @@ import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.quest.QuestTimer; import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.zone.type.EffectZone;
import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone; import org.l2jmobius.gameserver.model.zone.type.NoSummonFriendZone;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI; import ai.AbstractNpcAI;
@@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/ */
public class Ramona extends AbstractNpcAI public class Ramona extends AbstractNpcAI
{ {
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC // NPC
private static final int ROOM_CONTROL = 19642; private static final int MP_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int RAMONA = 19648; private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141; private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142; private static final int RAMONA_2 = 26142;
@@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen 26146, // Shooter of the Queen
26147 // Wizard of the Queen 26147 // Wizard of the Queen
}; };
// skill // Trigers
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1); private static final int FIRST_GENERATOR = 22230702;
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1); private static final int SECOND_GENERATOR = 22230704;
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1); private static final int THRID_GENERATOR = 22230706;
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1); private static final int FOURTH_GENERATOR = 22230708;
private static final Skill RIDE_THE_LIGHTING_MEGA_BRUST = SkillData.getInstance().getSkill(16645, 1);
private static final Skill ULTRA_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16647, 1);
private static final Skill[] RAMONA1_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING
};
private static final Skill[] RAMONA2_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST
};
private static final Skill[] RAMONA3_SKILLS =
{
HYPER_MEGA_PLASMA_BRUST,
HYPER_MEGA_PLASMA_SHOT,
RIDE_THE_LIGHTING,
RIDE_THE_LIGHTING_MEGA_BRUST,
HIPER_MEGA_TELEKINESS,
ULTRA_MEGA_TELEKINESS
};
// Locations // Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383); private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383); private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other // Other
private static final int ROOM_CONTROL_DOOR = 22230711; private static final int ROOM_CONTROL_DOOR = 22230711;
private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class); private static final NoSummonFriendZone ZONE = ZoneManager.getInstance().getZoneById(210108, NoSummonFriendZone.class);
private static final int MIN_PLAYER_COUNT = 14; private static final EffectZone ZONE_ATTACK = ZoneManager.getInstance().getZoneById(200109, EffectZone.class);
private static final EffectZone ZONE_DEFENCE = ZoneManager.getInstance().getZoneById(200110, EffectZone.class);
private static final EffectZone ZONE_HP = ZoneManager.getInstance().getZoneById(200111, EffectZone.class);
private static final EffectZone ZONE_ERADICATION = ZoneManager.getInstance().getZoneById(200112, EffectZone.class);
// Vars // Vars
private static DoorInstance _door; private static final String RAMONA_RESPAWN_VAR = "RamonaRespawn";
private static Status _boss = Status.ALIVE;
private static ArrayList<Npc> _minions = new ArrayList<>(); private static ArrayList<Npc> _minions = new ArrayList<>();
private static int _bossStage;
private static long _lastAction; private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1; private static Npc _ramona1;
private static Npc _ramona2; private static Npc _ramona2;
private static Npc _ramona3; private static Npc _ramona3;
private Ramona() private Ramona()
{ {
addStartNpc(ROOM_CONTROL); addStartNpc(MP_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3); addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE); addSeeCreatureId(MP_CONTROL);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3); addAttackId(MP_CONTROL, RAMONA_1, RAMONA_2, RAMONA_3);
addSpawnId(RAMONA_1, RAMONA_2, RAMONA_3);
final long temp = GlobalVariablesManager.getInstance().getLong(RAMONA_RESPAWN_VAR, 0) - System.currentTimeMillis();
if (temp > 0)
{
_boss = Status.DEAD;
startQuestTimer("RAMONA_UNLOCK", temp, null, null);
}
else
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
} }
@Override @Override
@@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS": case "SPAWN_MS":
{ {
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false); if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false); {
_lastAction = System.currentTimeMillis(); npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break; break;
} }
case "SPAWN_RAMONA_1": case "SPAWN_RAMONA_1":
{ {
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona -> World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{ {
if (ramona.getId() == RAMONA) if (ramona.getId() == RAMONA)
@@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe(); ramona.deleteMe();
} }
}); });
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true); _ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true); startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, null);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null); startQuestTimer("GENERATOR_2", getRandom(900000, 1200000), null, null);
startQuestTimer("GENERATOR_3", getRandom(1500000, 1800000), null, null);
startQuestTimer("GENERATOR_4", getRandom(2100000, 2400000), null, null);
_lastAction = System.currentTimeMillis();
break; break;
} }
case "RAMONA1_SKILL": case "GENERATOR_1":
{ {
if ((_bossStage == 1) && _ramona1.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
{ ZONE_ATTACK.setEnabled(true);
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS": case "GENERATOR_2":
{ {
_bossStage = 2; ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_DEFENCE.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
break; break;
} }
case "RAMONA2_SKILL": case "GENERATOR_3":
{ {
if ((_bossStage == 2) && _ramona2.isInCombat()) ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
{ ZONE_HP.setEnabled(true);
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
break; break;
} }
case "SPAWN_RAMONA_MINIONS_1": case "GENERATOR_4":
{ {
_bossStage = 3; ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
for (int i = 0; i < 7; i++) ZONE_ERADICATION.setEnabled(true);
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA3_SKILL", 6000, _ramona3, null);
break;
}
case "RAMONA3_SKILL":
{
if ((_bossStage == 3) && _ramona3.isInCombat())
{
Skill randomAttackSkill = RAMONA3_SKILLS[Rnd.get(RAMONA3_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona3.doCast(randomAttackSkill);
}
}
break; break;
} }
case "CHECK_ACTIVITY_TASK": case "CHECK_ACTIVITY_TASK":
{ {
if ((_lastAction + 900000) < System.currentTimeMillis()) if ((_lastAction + 900000) < System.currentTimeMillis())
{ {
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE); for (Creature charInside : ZONE.getCharactersInside())
for (Creature creature : ZONE.getCharactersInside())
{ {
if (creature != null) if (charInside != null)
{ {
if (creature.isNpc()) if (charInside.isNpc())
{ {
creature.deleteMe(); charInside.deleteMe();
} }
else if (creature.isPlayer()) else if (charInside.isPlayer())
{ {
creature.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(creature, TeleportWhereType.TOWN)); charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
} }
} }
} }
@@ -226,22 +198,12 @@ public class Ramona extends AbstractNpcAI
} }
else else
{ {
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null); startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
} }
break; break;
} }
case "END_RAMONA": case "END_RAMONA":
{ {
_bossStage = 0;
ZONE.oustAllPlayers(); ZONE.oustAllPlayers();
if (_ramona1 != null) if (_ramona1 != null)
{ {
@@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
minion.deleteMe(); minion.deleteMe();
} }
} }
if ((_boss == Status.ALIVE) || (_boss == Status.IN_FIGHT))
{
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
}
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
for (int i = FIRST_GENERATOR; i <= FOURTH_GENERATOR; i++)
{
ZONE.broadcastPacket(new OnEventTrigger(i, false));
}
ZONE_ATTACK.setEnabled(false);
ZONE_DEFENCE.setEnabled(false);
ZONE_HP.setEnabled(false);
ZONE_ERADICATION.setEnabled(false);
cancelQuestTimers("GENERATOR_1");
cancelQuestTimers("GENERATOR_2");
cancelQuestTimers("GENERATOR_3");
cancelQuestTimers("GENERATOR_4");
addSpawn(RAMONA, DEFAULT_LOC, false, 0, false);
_minions.clear(); _minions.clear();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break; break;
} }
} }
@@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon) public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{ {
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
switch (npc.getId()) switch (npc.getId())
{ {
case MP_CONTROL:
{
if (ZONE.getCharactersInside().size() < Config.RAMONA_MIN_PLAYER)
{
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.WHAT_S_UP_WITH_YOUR_EYES_YOU_NEED_MORE_ENERGY);
}
break;
}
case RAMONA_1: case RAMONA_1:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 75)
if (currentHp < 75)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_A);
_ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona2 = addSpawn(RAMONA_2, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona2.setCurrentHp(_ramona1.getCurrentHp()); _ramona2.setCurrentHp(_ramona1.getCurrentHp());
_ramona1.deleteMe(); _ramona1.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS", 6000, _ramona2, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_2: case RAMONA_2:
{ {
_lastAction = System.currentTimeMillis(); if (npc.getCurrentHpPercent() < 50)
if (currentHp < 50)
{ {
playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B); playMovie(ZONE.getPlayersInside(), Movie.SC_RAMONA_TRANS_B);
_ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC_1, false, 1200000, false); _ramona3 = addSpawn(RAMONA_3, RAMONA_SPAWN_LOC, false, 1200000, false);
_ramona3.setCurrentHp(_ramona2.getCurrentHp()); _ramona3.setCurrentHp(_ramona2.getCurrentHp());
_ramona2.deleteMe(); _ramona2.deleteMe();
startQuestTimer("SPAWN_RAMONA_MINIONS_1", 6000, _ramona3, null); for (int i = 0; i < 7; i++)
{
final Npc minion = addSpawn(MINION_LIST[Rnd.get(MINION_LIST.length)], npc.getX() + getRandom(-200, 200), npc.getY() + getRandom(-200, 200), npc.getZ(), npc.getHeading(), false, 600000);
minion.isRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, attacker);
_minions.add(minion);
}
} }
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
_lastAction = System.currentTimeMillis(); if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break; break;
} }
} }
@@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{ {
switch (npc.getId()) switch (npc.getId())
{ {
case ROOM_CONTROL: case MP_CONTROL:
{ {
World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, Door -> World.getInstance().forEachVisibleObjectInRange(npc, DoorInstance.class, 8000, door ->
{ {
if (Door.getId() == ROOM_CONTROL_DOOR) if (door.getId() == ROOM_CONTROL_DOOR)
{ {
Door.closeMe(); door.closeMe();
Door.setTargetable(false);
_door = Door;
} }
}); });
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null); startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break; break;
} }
case RAMONA_3: case RAMONA_3:
{ {
notifyEvent("CANCEL_TIMERS", null, null); _boss = Status.DEAD;
startQuestTimer("END_RAMONA", 300000, null, null); long respawnTime = (Config.RAMONA_SPAWN_INTERVAL + getRandom(-Config.RAMONA_SPAWN_RANDOM, Config.RAMONA_SPAWN_RANDOM)) * 3600000;
GlobalVariablesManager.getInstance().set(RAMONA_RESPAWN_VAR, System.currentTimeMillis() + respawnTime);
startQuestTimer("RAMONA_UNLOCK", respawnTime, null, null);
startQuestTimer("END_RAMONA", 90000, null, null);
break; break;
} }
} }
@@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override @Override
public String onSeeCreature(Npc npc, Creature creature, boolean isSummon) public String onSeeCreature(Npc npc, Creature creature, boolean isSummon)
{ {
if (creature.isPlayer() && npc.isScriptValue(0) && (ZONE.getCharactersInside().size() >= MIN_PLAYER_COUNT)) npc.setIsInvul(true);
if (creature.isPlayer())
{ {
startQuestTimer("SPAWN_MS", 10000, npc, null); startQuestTimer("SPAWN_MS", 10000, npc, null, true);
npc.setScriptValue(1);
_invisible = npc;
} }
return super.onSeeCreature(npc, creature, isSummon); return super.onSeeCreature(npc, creature, isSummon);
} }
@Override
public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case RAMONA_1:
{
_boss = Status.IN_FIGHT;
_lastAction = System.currentTimeMillis();
break;
}
case RAMONA_2:
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
break;
}
}
return super.onSpawn(npc);
}
public static void main(String[] args) public static void main(String[] args)
{ {
new Ramona(); new Ramona();

View File

@@ -2334,7 +2334,15 @@
<height normal="47.5" /> <height normal="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="26141" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26141" level="104" type="Monster" name="Ramona" title="Queen">
<parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2355,6 +2363,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2366,8 +2377,17 @@
<height normal="87" /> <height normal="87" />
</collision> </collision>
</npc> </npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26142" level="104" type="Monster" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
<param name="Skill03_Probablity" value="500" />
<param name="Skill04_Probablity" value="300" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149"> <stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@@ -2388,6 +2408,10 @@
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona --> <skill id="16746" level="1"/> <!-- Ramona -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2400,7 +2424,20 @@
</collision> </collision>
</npc> </npc>
<npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen"> <npc id="26143" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com --> <parameters>
<skill name="Skill01_ID" id="16641" level="1" />
<skill name="Skill02_ID" id="16642" level="1" />
<skill name="Skill03_ID" id="16644" level="1" />
<skill name="Skill04_ID" id="16645" level="1" />
<skill name="Skill04_ID" id="16646" level="1" />
<skill name="Skill04_ID" id="16647" level="1" />
<param name="Skill01_Probablity" value="300" />
<param name="Skill02_Probablity" value="300" />
<param name="Skill03_Probablity" value="300" />
<param name="Skill04_Probablity" value="300" />
<param name="Skill05_Probablity" value="500" />
<param name="Skill06_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" /> <acquire exp="576969277248" sp="1153938597" raidPoints="300" />
@@ -2419,10 +2456,16 @@
</stats> </stats>
<skillList> <skillList>
<skill id="4416" level="11" /> <!-- Giants --> <skill id="4416" level="11" /> <!-- Giants -->
<skill id="5465" level="1" /> <!-- Earth Attack -->
<skill id="4494" level="1" /> <!-- Raid Boss --> <skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="16746" level="1" /> <!-- Ramona --> <skill id="5465" level="1"/> <!-- Earth Attack -->
<skill id="16746" level="1"/> <!-- Ramona -->
<skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance --> <skill id="14804" level="10" /> <!-- Damage Reflection Attack Resistance -->
<skill id="16642" level="1"/> <!-- Hyper Mega Plasma Burst -->
<skill id="16641" level="1"/> <!-- Hyper Mega Plasma Shot -->
<skill id="16644" level="1"/> <!-- Ride the Lightning -->
<skill id="16645" level="1"/> <!-- Ride the Lightning Mega Burst -->
<skill id="16646" level="1"/> <!-- Hyper Mega Telekinesis -->
<skill id="16647" level="1"/> <!-- Ultra Mega Telekinesis -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2506,6 +2549,12 @@
</dropLists> </dropLists>
</npc> </npc>
<npc id="26144" level="104" type="Monster" name="Dancer of the Queen"> <npc id="26144" level="104" type="Monster" name="Dancer of the Queen">
<parameters>
<skill name="Skill01_ID" id="16681" level="1" />
<skill name="Skill02_ID" id="16677" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2528,6 +2577,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2540,6 +2591,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26145" level="104" type="Monster" name="Commander of the Queen"> <npc id="26145" level="104" type="Monster" name="Commander of the Queen">
<parameters>
<skill name="Skill01_ID" id="16682" level="1" />
<skill name="Skill02_ID" id="16680" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2562,6 +2619,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2574,6 +2633,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26146" level="104" type="Monster" name="Shooter of the Queen"> <npc id="26146" level="104" type="Monster" name="Shooter of the Queen">
<parameters>
<skill name="Skill01_ID" id="16683" level="1" />
<skill name="Skill02_ID" id="16684" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2596,6 +2661,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>
@@ -2608,6 +2675,12 @@
</collision> </collision>
</npc> </npc>
<npc id="26147" level="104" type="Monster" name="Wizard of the Queen"> <npc id="26147" level="104" type="Monster" name="Wizard of the Queen">
<parameters>
<skill name="Skill01_ID" id="16685" level="1" />
<skill name="Skill02_ID" id="16686" level="1" />
<param name="Skill01_Probablity" value="500" />
<param name="Skill02_Probablity" value="500" />
</parameters>
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="0" sp="0" /> <acquire exp="0" sp="0" />
@@ -2630,6 +2703,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability --> <skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness --> <skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance --> <skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16685" level="1" /> <!-- Ultra Plasma Ball -->
<skill id="16686" level="1" /> <!-- Ultra Plasma Wave -->
</skillList> </skillList>
<ai clanHelpRange="400"> <ai clanHelpRange="400">
<clanList> <clanList>

View File

@@ -461,30 +461,76 @@
<skill id="16731" toLevel="1" name="Leaking Magic - Attack"> <skill id="16731" toLevel="1" name="Leaking Magic - Attack">
<!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical attack and magic attack of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1059</icon> <icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MAtk">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16732" toLevel="1" name="Leaking Magic - Defense"> <skill id="16732" toLevel="1" name="Leaking Magic - Defense">
<!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The physical defense and magic defense of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1478</icon> <icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="PhysicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
<effect name="MagicalDefence">
<amount>10</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16733" toLevel="1" name="Leaking Magic - HP"> <skill id="16733" toLevel="1" name="Leaking Magic - HP">
<!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. --> <!-- The HP regen of the Queen and her minions are boosted greatly by the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1044</icon> <icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<effectPoint>100</effectPoint> <affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill> </skill>
<skill id="16734" toLevel="1" name="Leaking Magic - Eradication"> <skill id="16734" toLevel="1" name="Leaking Magic - Eradication">
<!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. --> <!-- The Queen and her minions continuously receive massive damage fur to the magic leaking out of the disintegrating MP Control Unit. -->
<icon>icon.skill1108</icon> <icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType> <operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<targetType>SELF</targetType> <targetType>SELF</targetType>
<isDebuff>1</isDebuff> <affectScope>SINGLE</affectScope>
<conditions>
<condition name="OpTargetPc" /> <!-- TODO -->
<condition name="OpResurrection" /> <!-- TODO -->
</conditions>
<effects>
<effect name="BlockResurrection" /> <!-- TODO -->
</effects>
</skill> </skill>
<skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman"> <skill id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. --> <!-- Damage received from Demons -$s1. -->

View File

@@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" /> <node X="-14188" Y="254493" />
<node X="-14650" Y="254393" /> <node X="-14650" Y="254393" />
</zone> </zone>
<!-- Ramona -->
<zone name="ramona_magic_attack" id="200109" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16731-1;" /> <!-- Leaking Magic - Attack -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_defence" id="200110" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16732-1;" /> <!-- Leaking Magic - Defense -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200111" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="targetClass" val="Npc" />
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="false"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16733-1;" /> <!-- Leaking Magic - HP -->
<node X="78023" Y="172262" />
</zone>
<zone name="ramona_magic_hp" id="200112" type="EffectZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<stat name="chance" val="100" />
<stat name="default_enabled" val="false" />
<stat name="showDangerIcon" val="true"/>
<stat name="initialDelay" val="3000" />
<!-- <stat name="unitTick" val="20" /> -->
<stat name="skillIdLvl" val="16734-1;" /> <!-- eaking Magic - Eradication -->
<node X="78023" Y="172262" />
</zone>
</list> </list>

View File

@@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500"> <zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" /> <node X="88110" Y="-173795" />
</zone> </zone>
<zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10050" rad="3000"> <zone name="Ramona_Room" id="210108" type="NoSummonFriendZone" shape="Cylinder" minZ="-10610" maxZ="-10150" rad="4000" >
<node X="78023" Y="172262" /> <node X="78023" Y="172262" />
</zone> </zone>
<zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100"> <zone name="Helios_Zone" id="210109" type="NoSummonFriendZone" shape="Cylinder" minZ="3400" maxZ="3600" rad="3100">

View File

@@ -897,6 +897,11 @@ public class Config
public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER;
public static int HELIOS_MIN_PLAYER_LVL; public static int HELIOS_MIN_PLAYER_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Fafurion // Fafurion
public static int FAFURION_WAIT_TIME; public static int FAFURION_WAIT_TIME;
public static int FAFURION_SPAWN_INTERVAL; public static int FAFURION_SPAWN_INTERVAL;
@@ -2486,6 +2491,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
RAMONA_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfRamonaSpawn", 72);
RAMONA_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfRamonaSpawn", 48);
RAMONA_MIN_PLAYER = GrandBossSettings.getInt("RamonaMinPlayers", 7);
FAFURION_WAIT_TIME = GrandBossSettings.getInt("FafurionWaitTime", 10); FAFURION_WAIT_TIME = GrandBossSettings.getInt("FafurionWaitTime", 10);
FAFURION_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264); FAFURION_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264);
FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72); FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72);