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

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(78012, 169922, -10467, 16383);
private static final Location DEFAULT_LOC = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(78012, 169922, -10467, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -1651,9 +1651,9 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
<vitals hp="13945521" hpRegen="1824.56140350877" mp="50920" mpRegen="1925.92592592593" />
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<vitals hp="20949082.10169" 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" />
<attribute>
<defence fire="300" water="300" wind="300" earth="300" holy="250" dark="370"/>
</attribute>
@ -1662,6 +1662,11 @@
<run ground="270" />
</speed>
</stats>
<status attackable="true" />
<collision>
<radius normal="30" />
<height normal="54" />
</collision>
<skillList>
<skill id="4416" level="6" /> <!-- Humanoids -->
<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 -->
</lucky>
</dropLists>
<collision>
<radius normal="30" />
<height normal="54" />
</collision>
</npc>
<npc id="26125" level="104" type="Monster" name="Giant Atelia">
<race>CONSTRUCT</race>
@ -1918,7 +1919,6 @@
</collision>
</npc>
<npc id="26131" level="101" type="RaidBoss" name="Isabella" title="Raid Boss">
<!-- Source: www.l2wiki.com -->
<parameters>
<minions name="Privates">
<npc id="26132" count="2" respawnTime="360" weightPoint="1" />
@ -1927,20 +1927,25 @@
</parameters>
<race>HUMANOID</race>
<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">
<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>
<walk ground="60" />
<run ground="180" />
</speed>
<attack physical="48095.2380952381" magical="8487.39495798319" critical="4" attackSpeed="253" range="40" />
<defence physical="3740.74074074074" magical="2172.04301075269" />
<attribute>
<defence fire="350" water="300" wind="350" earth="350" holy="350" dark="350" />
<attack type="WIND" value="430" />
</attribute>
</stats>
<status attackable="true" />
<collision>
<radius normal="24" />
<height normal="67.5" />
</collision>
<skillList>
<skill id="4416" level="6" /> <!-- Humanoids -->
<skill id="5464" level="1" /> <!-- Wind Attack -->
@ -2028,10 +2033,6 @@
<item id="39629" min="2" max="2" chance="100" /> <!-- Fortune Pocket - Stage 1 -->
</lucky>
</dropLists>
<collision>
<radius normal="24" />
<height normal="67.5" />
</collision>
</npc>
<npc id="26132" level="100" type="Monster" name="Croa" title="Raid Minion">
<!-- Source: www.l2wiki.com -->
@ -2258,7 +2259,15 @@
<height normal="28.25" />
</collision>
</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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2267,8 +2276,8 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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" />
@ -2279,6 +2288,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2290,8 +2302,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2300,14 +2321,22 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2320,20 +2349,34 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<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>
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="34243.68753" magical="16714.49407" />
<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>
</stats>
<skillList>
@ -2341,12 +2384,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
<clan>RAMONA</clan>
</clanList>
</ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists>
<drop>
<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 -->
</lucky>
</dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2460,6 +2516,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2472,6 +2530,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2494,6 +2558,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2506,6 +2572,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2528,6 +2600,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2540,6 +2614,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2562,6 +2642,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2601,8 +2683,12 @@
<walk ground="55" />
<run ground="180" />
</speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" />
<attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH;
@ -2410,6 +2415,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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
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
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
# ---------------------------------------------------------------------------

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(78012, 169922, -10467, 16383);
private static final Location DEFAULT_LOC = new Location(78023, 172262, -10604, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(78012, 169922, -10467, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -2497,7 +2497,15 @@
<height normal="47.5" />
</collision>
</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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2506,8 +2514,8 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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" />
@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2529,8 +2540,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2539,14 +2559,22 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2559,20 +2587,34 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<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>
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="34243.68753" magical="16714.49407" />
<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>
</stats>
<skillList>
@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
<clan>RAMONA</clan>
</clanList>
</ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists>
<drop>
<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 -->
</lucky>
</dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2711,6 +2768,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2745,6 +2810,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2779,6 +2852,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2840,8 +2921,12 @@
<walk ground="55" />
<run ground="180" />
</speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" />
<attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH;
@ -2384,6 +2389,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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
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
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
# ---------------------------------------------------------------------------

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383);
private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -2497,7 +2497,15 @@
<height normal="47.5" />
</collision>
</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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2506,8 +2514,8 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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" />
@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2529,8 +2540,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2539,14 +2559,22 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2559,20 +2587,34 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<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>
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="34243.68753" magical="16714.49407" />
<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>
</stats>
<skillList>
@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
<clan>RAMONA</clan>
</clanList>
</ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists>
<drop>
<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 -->
</lucky>
</dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2711,6 +2768,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2745,6 +2810,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2779,6 +2852,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2840,8 +2921,12 @@
<walk ground="55" />
<run ground="180" />
</speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" />
<attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH;
@ -2460,6 +2465,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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
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
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
# ---------------------------------------------------------------------------

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383);
private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -2497,7 +2497,15 @@
<height normal="47.5" />
</collision>
</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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2506,8 +2514,8 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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" />
@ -2518,6 +2526,9 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2529,8 +2540,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<stats str="164" int="188" dex="55" wit="78" con="111" men="149">
@ -2539,14 +2559,22 @@
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2559,20 +2587,34 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
<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>
<walk ground="40" />
<run ground="180" />
</speed>
<attack physical="49523.8095238095" magical="8739.49579831933" critical="4" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="3851.85185185185" magical="2236.55913978495" />
<attack physical="295358.4152" magical="211816.358" critical="4.75" accuracy="4.75" type="BLUNT" attackSpeed="253" range="40" />
<defence physical="34243.68753" magical="16714.49407" />
<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>
</stats>
<skillList>
@ -2580,12 +2622,23 @@
<skill id="4494" level="1" /> <!-- Raid Boss -->
<skill id="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
<clan>RAMONA</clan>
</clanList>
</ai>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
<dropLists>
<drop>
<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 -->
</lucky>
</dropLists>
<collision>
<radius normal="40" />
<height normal="82" />
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2699,6 +2754,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2711,6 +2768,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2733,6 +2796,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2745,6 +2810,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2767,6 +2838,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2779,6 +2852,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2801,6 +2880,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2840,8 +2921,12 @@
<walk ground="55" />
<run ground="180" />
</speed>
<attack physical="49047.619047619" magical="8655.46218487395" critical="4" attackSpeed="398" range="40" />
<defence physical="3814.81481481481" magical="2215.05376344086" />
<attack physical="256235.619047619" magical="43275.46218487395" critical="4.75" accuracy="4.75" attackSpeed="398" range="40" />
<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>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH;
@ -2460,6 +2465,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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
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
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
# ---------------------------------------------------------------------------

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383);
private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -2334,7 +2334,15 @@
<height normal="47.5" />
</collision>
</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>
<sex>FEMALE</sex>
<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="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2366,8 +2377,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<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="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2400,7 +2424,20 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
@ -2419,10 +2456,16 @@
</stats>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="5465" level="1" /> <!-- Earth Attack -->
<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="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>
<ai clanHelpRange="400">
<clanList>
@ -2506,6 +2549,12 @@
</dropLists>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2528,6 +2577,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2540,6 +2591,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2562,6 +2619,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2574,6 +2633,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2596,6 +2661,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2608,6 +2675,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2630,6 +2703,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Fafurion
public static int FAFURION_WAIT_TIME;
public static int FAFURION_SPAWN_INTERVAL;
@ -2488,6 +2493,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264);
FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72);

View File

@ -166,6 +166,19 @@ LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 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
# ---------------------------------------------------------------------------

View File

@ -18,9 +18,11 @@ package ai.bosses.Ramona;
import java.util.ArrayList;
import org.l2jmobius.Config;
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.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
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.PlayerInstance;
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.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
import ai.AbstractNpcAI;
@ -44,9 +48,16 @@ import ai.AbstractNpcAI;
*/
public class Ramona extends AbstractNpcAI
{
// Status
private static enum Status
{
ALIVE,
IN_FIGHT,
DEAD
}
// NPC
private static final int ROOM_CONTROL = 19642;
private static final int INVISIBLE = 19643;
private static final int MP_CONTROL = 19642;
private static final int RAMONA = 19648;
private static final int RAMONA_1 = 26141;
private static final int RAMONA_2 = 26142;
@ -58,58 +69,48 @@ public class Ramona extends AbstractNpcAI
26146, // Shooter of the Queen
26147 // Wizard of the Queen
};
// skill
private static final Skill HYPER_MEGA_PLASMA_SHOT = SkillData.getInstance().getSkill(16641, 1);
private static final Skill HYPER_MEGA_PLASMA_BRUST = SkillData.getInstance().getSkill(16642, 1);
private static final Skill HIPER_MEGA_TELEKINESS = SkillData.getInstance().getSkill(16643, 1);
private static final Skill RIDE_THE_LIGHTING = SkillData.getInstance().getSkill(16644, 1);
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
};
// Trigers
private static final int FIRST_GENERATOR = 22230702;
private static final int SECOND_GENERATOR = 22230704;
private static final int THRID_GENERATOR = 22230706;
private static final int FOURTH_GENERATOR = 22230708;
// Locations
private static final Location RAMONA_SPAWN_LOC_1 = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC_2 = new Location(86327, 169759, -10465, 16383);
private static final Location DEFAULT_LOC = new Location(86338, 172099, -10602, 16383);
private static final Location RAMONA_SPAWN_LOC = new Location(86327, 169759, -10465, 16383);
// Other
private static final int ROOM_CONTROL_DOOR = 22230711;
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
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 int _bossStage;
private static long _lastAction;
private static Npc _invisible;
private static Npc _ramona1;
private static Npc _ramona2;
private static Npc _ramona3;
private Ramona()
{
addStartNpc(ROOM_CONTROL);
addKillId(ROOM_CONTROL, RAMONA_3);
addSeeCreatureId(INVISIBLE);
addAttackId(RAMONA_1, RAMONA_2, RAMONA_3);
addStartNpc(MP_CONTROL);
addKillId(MP_CONTROL, RAMONA_3);
addSeeCreatureId(MP_CONTROL);
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
@ -117,16 +118,25 @@ public class Ramona extends AbstractNpcAI
{
switch (event)
{
case "RAMONA_UNLOCK":
{
_boss = Status.ALIVE;
addSpawn(MP_CONTROL, RAMONA_SPAWN_LOC, false, 0, false);
break;
}
case "SPAWN_MS":
{
addSpawn(ROOM_CONTROL, RAMONA_SPAWN_LOC_1, false, 600000, false);
addSpawn(RAMONA, RAMONA_SPAWN_LOC_2, false, 600000, false);
_lastAction = System.currentTimeMillis();
if (ZONE.getCharactersInside().size() >= Config.RAMONA_MIN_PLAYER)
{
npc.setIsInvul(false);
cancelQuestTimers("SPAWN_MS");
startQuestTimer("CHECK_ACTIVITY_TASK", 5000, null, null);
_lastAction = System.currentTimeMillis();
}
break;
}
case "SPAWN_RAMONA_1":
{
_bossStage = 1;
World.getInstance().forEachVisibleObjectInRange(npc, Npc.class, 3000, ramona ->
{
if (ramona.getId() == RAMONA)
@ -134,91 +144,53 @@ public class Ramona extends AbstractNpcAI
ramona.deleteMe();
}
});
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC_1, false, 1200000, true);
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null, true);
startQuestTimer("RAMONA1_SKILL", 6000, _ramona1, null);
_ramona1 = addSpawn(RAMONA_1, RAMONA_SPAWN_LOC, false, 1200000, true);
startQuestTimer("GENERATOR_1", getRandom(300000, 600000), null, 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;
}
case "RAMONA1_SKILL":
case "GENERATOR_1":
{
if ((_bossStage == 1) && _ramona1.isInCombat())
{
Skill randomAttackSkill = RAMONA1_SKILLS[Rnd.get(RAMONA1_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona1.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FIRST_GENERATOR, true));
ZONE_ATTACK.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS":
case "GENERATOR_2":
{
_bossStage = 2;
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.setRunning();
((Attackable) minion).setIsRaidMinion(true);
addAttackPlayerDesire(minion, player);
_minions.add(minion);
}
startQuestTimer("RAMONA2_SKILL", 6000, _ramona2, null);
ZONE.broadcastPacket(new OnEventTrigger(SECOND_GENERATOR, true));
ZONE_DEFENCE.setEnabled(true);
break;
}
case "RAMONA2_SKILL":
case "GENERATOR_3":
{
if ((_bossStage == 2) && _ramona2.isInCombat())
{
Skill randomAttackSkill = RAMONA2_SKILLS[Rnd.get(RAMONA2_SKILLS.length)];
if (getRandom(100) > 20)
{
_ramona2.doCast(randomAttackSkill);
}
}
ZONE.broadcastPacket(new OnEventTrigger(THRID_GENERATOR, true));
ZONE_HP.setEnabled(true);
break;
}
case "SPAWN_RAMONA_MINIONS_1":
case "GENERATOR_4":
{
_bossStage = 3;
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.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);
}
}
ZONE.broadcastPacket(new OnEventTrigger(FOURTH_GENERATOR, true));
ZONE_ERADICATION.setEnabled(true);
break;
}
case "CHECK_ACTIVITY_TASK":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
// GrandBossManager.getInstance().setBossStatus(RAMONA, ALIVE);
for (Creature creature : ZONE.getCharactersInside())
for (Creature charInside : 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
{
startQuestTimer("CHECK_ACTIVITY_TASK", 60000, null, null);
}
break;
}
case "CANCEL_TIMERS":
{
QuestTimer activityTimer = getQuestTimer("CHECK_ACTIVITY_TASK", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
startQuestTimer("CHECK_ACTIVITY_TASK", 30000, null, null);
}
break;
}
case "END_RAMONA":
{
_bossStage = 0;
ZONE.oustAllPlayers();
if (_ramona1 != null)
{
@ -266,9 +228,29 @@ public class Ramona extends AbstractNpcAI
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();
_invisible.setScriptValue(0);
_door.setTargetable(true);
break;
}
}
@ -278,38 +260,61 @@ public class Ramona extends AbstractNpcAI
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
{
double currentHp = (npc.getCurrentHp() / npc.getMaxHp()) * 100;
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:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 75)
if (npc.getCurrentHpPercent() < 75)
{
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());
_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;
}
case RAMONA_2:
{
_lastAction = System.currentTimeMillis();
if (currentHp < 50)
if (npc.getCurrentHpPercent() < 50)
{
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());
_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;
}
case RAMONA_3:
{
_lastAction = System.currentTimeMillis();
if ((npc.getCurrentHpPercent() < 25) && npc.isScriptValue(2))
{
_lastAction = System.currentTimeMillis();
npc.setScriptValue(1);
}
break;
}
}
@ -321,24 +326,25 @@ public class Ramona extends AbstractNpcAI
{
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.setTargetable(false);
_door = Door;
door.closeMe();
}
});
startQuestTimer("SPAWN_RAMONA_1", 5000, npc, null);
startQuestTimer("SPAWN_RAMONA_1", 10000, npc, null);
break;
}
case RAMONA_3:
{
notifyEvent("CANCEL_TIMERS", null, null);
startQuestTimer("END_RAMONA", 300000, null, null);
_boss = Status.DEAD;
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;
}
}
@ -348,15 +354,35 @@ public class Ramona extends AbstractNpcAI
@Override
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);
npc.setScriptValue(1);
_invisible = npc;
startQuestTimer("SPAWN_MS", 10000, npc, null, true);
}
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)
{
new Ramona();

View File

@ -2334,7 +2334,15 @@
<height normal="47.5" />
</collision>
</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>
<sex>FEMALE</sex>
<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="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2366,8 +2377,17 @@
<height normal="87" />
</collision>
</npc>
<npc id="26142" level="104" type="RaidBoss" name="Ramona" title="Queen">
<!-- Source: www.l2wiki.com -->
<npc id="26142" 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" />
<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>
<sex>FEMALE</sex>
<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="5465" level="1"/> <!-- Earth Attack -->
<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>
<ai clanHelpRange="400">
<clanList>
@ -2400,7 +2424,20 @@
</collision>
</npc>
<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>
<sex>FEMALE</sex>
<acquire exp="576969277248" sp="1153938597" raidPoints="300" />
@ -2419,10 +2456,16 @@
</stats>
<skillList>
<skill id="4416" level="11" /> <!-- Giants -->
<skill id="5465" level="1" /> <!-- Earth Attack -->
<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="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>
<ai clanHelpRange="400">
<clanList>
@ -2506,6 +2549,12 @@
</dropLists>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2528,6 +2577,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16681" level="1" /> <!-- For the Queen -->
<skill id="16677" level="1" /> <!-- Hyper Power -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2540,6 +2591,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2562,6 +2619,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16682" level="1" /> <!-- Doom Hammer -->
<skill id="16680" level="1" /> <!-- Commander Aggression Aura -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2574,6 +2633,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2596,6 +2661,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<skill id="4071" level="1" /> <!-- Bow/Crossbow Resistance -->
<skill id="16683" level="1" /> <!-- Stun Shot -->
<skill id="16684" level="1" /> <!-- Multi Shot -->
</skillList>
<ai clanHelpRange="400">
<clanList>
@ -2608,6 +2675,12 @@
</collision>
</npc>
<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>
<sex>MALE</sex>
<acquire exp="0" sp="0" />
@ -2630,6 +2703,8 @@
<skill id="4461" level="1" /> <!-- Dagger/Rapier Vulnerability -->
<skill id="16608" level="1" /> <!-- Servitor Attack Weakness -->
<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>
<ai clanHelpRange="400">
<clanList>

View File

@ -461,30 +461,76 @@
<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. -->
<icon>icon.skill1059</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1478</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<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 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. -->
<icon>icon.skill1044</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<targetType>SELF</targetType>
<effectPoint>100</effectPoint>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="HpRegen">
<amount>3</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<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. -->
<icon>icon.skill1108</icon>
<abnormalLvl>5</abnormalLvl>
<abnormalTime>60</abnormalTime>
<operateType>A2</operateType>
<effectPoint>-100</effectPoint>
<isDebuff>true</isDebuff>
<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 id="16735" toLevel="10" name="Inherent Abilities - Blackbird Clan Talisman">
<!-- Damage received from Demons -$s1. -->

View File

@ -2261,4 +2261,44 @@
<node X="-14188" Y="254493" />
<node X="-14650" Y="254393" />
</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>

View File

@ -187,7 +187,7 @@
<zone name="Heart_Trasken_Zone" id="12109" type="NoSummonFriendZone" shape="Cylinder" minZ="-16000" maxZ="16000" rad="2500">
<node X="88110" Y="-173795" />
</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" />
</zone>
<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_LVL;
// Ramona
public static int RAMONA_SPAWN_INTERVAL;
public static int RAMONA_SPAWN_RANDOM;
public static int RAMONA_MIN_PLAYER;
// Fafurion
public static int FAFURION_WAIT_TIME;
public static int FAFURION_SPAWN_INTERVAL;
@ -2486,6 +2491,10 @@ public class Config
HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
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_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264);
FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72);