From 823e36783c482c06be16bac399218477863da0b5 Mon Sep 17 00:00:00 2001
From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Fri, 4 Oct 2019 09:17:55 +0000
Subject: [PATCH] Ramona AI rework. Contributed by gigilo1968.
---
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 154 +++++++--
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../dist/login/log/error0.log | 0
.../dist/login/log/java0.log | 15 +
.../java/org/l2jmobius/Config.java | 9 +
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 121 ++++++-
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../java/org/l2jmobius/Config.java | 9 +
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 121 ++++++-
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../java/org/l2jmobius/Config.java | 9 +
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 121 ++++++-
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../java/org/l2jmobius/Config.java | 9 +
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 87 ++++-
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../java/org/l2jmobius/Config.java | 9 +
.../dist/game/config/GrandBoss.ini | 13 +
.../data/scripts/ai/bosses/Ramona/Ramona.java | 316 ++++++++++--------
.../dist/game/data/stats/npcs/26100-26199.xml | 87 ++++-
.../game/data/stats/skills/16700-16799.xml | 54 ++-
.../dist/game/data/zones/effect.xml | 40 +++
.../dist/game/data/zones/no_summon_friend.xml | 2 +-
.../java/org/l2jmobius/Config.java | 9 +
44 files changed, 2310 insertions(+), 1000 deletions(-)
create mode 100644 L2J_Mobius_3.0_Helios/dist/login/log/error0.log
create mode 100644 L2J_Mobius_3.0_Helios/dist/login/log/java0.log
diff --git a/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini b/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini
index 662ca03ecd..6b8366025d 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index b19b88b2c7..47acee69cf 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/26100-26199.xml
index 18f1049236..6e607250b3 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/26100-26199.xml
@@ -1651,9 +1651,9 @@
HUMANOID
MALE
-
-
-
+
+
+
@@ -1662,6 +1662,11 @@
+
+
+
+
+
@@ -1779,10 +1784,6 @@
-
-
-
-
CONSTRUCT
@@ -1918,7 +1919,6 @@
-
@@ -1927,20 +1927,25 @@
HUMANOID
FEMALE
-
+
-
+
+
+
-
-
+
+
+
+
+
@@ -2028,10 +2033,6 @@
-
-
-
-
@@ -2258,7 +2259,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2267,8 +2276,8 @@
-
-
+
+
@@ -2279,6 +2288,9 @@
+
+
+
@@ -2290,8 +2302,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2300,14 +2321,22 @@
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2320,20 +2349,34 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
-
+
-
-
+
+
-
+
+
@@ -2341,12 +2384,23 @@
+
+
+
+
+
+
+
RAMONA
+
+
+
+
@@ -2432,12 +2486,14 @@
-
-
-
-
+
+
+
+
+
+
GIANT
MALE
@@ -2460,6 +2516,8 @@
+
+
@@ -2472,6 +2530,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2494,6 +2558,8 @@
+
+
@@ -2506,6 +2572,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2528,6 +2600,8 @@
+
+
@@ -2540,6 +2614,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2562,6 +2642,8 @@
+
+
@@ -2601,8 +2683,12 @@
-
-
+
+
+
+
+
+
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/16700-16799.xml
index 92eded7952..5fc0d7dd4e 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/zones/effect.xml b/L2J_Mobius_3.0_Helios/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_3.0_Helios/dist/game/data/zones/no_summon_friend.xml
index 6d397771c9..10013e576b 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_3.0_Helios/dist/login/log/error0.log b/L2J_Mobius_3.0_Helios/dist/login/log/error0.log
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/L2J_Mobius_3.0_Helios/dist/login/log/java0.log b/L2J_Mobius_3.0_Helios/dist/login/log/java0.log
new file mode 100644
index 0000000000..e7d7b78d79
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/dist/login/log/java0.log
@@ -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.
diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
index 61afac6e41..3cd7c06487 100644
--- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java
@@ -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);
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/GrandBoss.ini b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/GrandBoss.ini
index 662ca03ecd..6b8366025d 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index b19b88b2c7..47acee69cf 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/npcs/26100-26199.xml
index 6f2a39f4d4..97dd800449 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/npcs/26100-26199.xml
@@ -2497,7 +2497,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2506,8 +2514,8 @@
-
-
+
+
@@ -2518,6 +2526,9 @@
+
+
+
@@ -2529,8 +2540,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2539,14 +2559,22 @@
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2559,20 +2587,34 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
-
+
-
-
+
+
-
+
+
@@ -2580,12 +2622,23 @@
+
+
+
+
+
+
+
RAMONA
+
+
+
+
@@ -2671,12 +2724,14 @@
-
-
-
-
+
+
+
+
+
+
GIANT
MALE
@@ -2699,6 +2754,8 @@
+
+
@@ -2711,6 +2768,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2733,6 +2796,8 @@
+
+
@@ -2745,6 +2810,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2767,6 +2838,8 @@
+
+
@@ -2779,6 +2852,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2801,6 +2880,8 @@
+
+
@@ -2840,8 +2921,12 @@
-
-
+
+
+
+
+
+
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/16700-16799.xml
index 02f454d05f..137e502042 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/effect.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/no_summon_friend.xml
index 6d397771c9..10013e576b 100644
--- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
index 0271edeb44..5fcdc46a81 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java
@@ -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);
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/config/GrandBoss.ini b/L2J_Mobius_5.0_Salvation/dist/game/config/GrandBoss.ini
index 662ca03ecd..6b8366025d 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_5.0_Salvation/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index 60fe478a1c..97a701deb6 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/npcs/26100-26199.xml
index cc11afbc4c..b668fafc98 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/npcs/26100-26199.xml
@@ -2497,7 +2497,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2506,8 +2514,8 @@
-
-
+
+
@@ -2518,6 +2526,9 @@
+
+
+
@@ -2529,8 +2540,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2539,14 +2559,22 @@
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2559,20 +2587,34 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
-
+
-
-
+
+
-
+
+
@@ -2580,12 +2622,23 @@
+
+
+
+
+
+
+
RAMONA
+
+
+
+
@@ -2671,12 +2724,14 @@
-
-
-
-
+
+
+
+
+
+
GIANT
MALE
@@ -2699,6 +2754,8 @@
+
+
@@ -2711,6 +2768,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2733,6 +2796,8 @@
+
+
@@ -2745,6 +2810,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2767,6 +2838,8 @@
+
+
@@ -2779,6 +2852,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2801,6 +2880,8 @@
+
+
@@ -2840,8 +2921,12 @@
-
-
+
+
+
+
+
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/16700-16799.xml
index 5c2a34c7e8..bb44367ddc 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/zones/effect.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_5.0_Salvation/dist/game/data/zones/no_summon_friend.xml
index 6d397771c9..10013e576b 100644
--- a/L2J_Mobius_5.0_Salvation/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_5.0_Salvation/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
index 0245ea8f38..c17a26f599 100644
--- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java
@@ -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);
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/config/GrandBoss.ini b/L2J_Mobius_5.5_EtinasFate/dist/game/config/GrandBoss.ini
index 662ca03ecd..6b8366025d 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index 60fe478a1c..97a701deb6 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/npcs/26100-26199.xml
index ab8b039cfc..e916b2b9fd 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/npcs/26100-26199.xml
@@ -2497,7 +2497,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2506,8 +2514,8 @@
-
-
+
+
@@ -2518,6 +2526,9 @@
+
+
+
@@ -2529,8 +2540,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2539,14 +2559,22 @@
-
-
+
+
+
+
+
+
+
+
+
+
@@ -2559,20 +2587,34 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
-
+
-
-
+
+
-
+
+
@@ -2580,12 +2622,23 @@
+
+
+
+
+
+
+
RAMONA
+
+
+
+
@@ -2671,12 +2724,14 @@
-
-
-
-
+
+
+
+
+
+
GIANT
MALE
@@ -2699,6 +2754,8 @@
+
+
@@ -2711,6 +2768,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2733,6 +2796,8 @@
+
+
@@ -2745,6 +2810,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2767,6 +2838,8 @@
+
+
@@ -2779,6 +2852,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2801,6 +2880,8 @@
+
+
@@ -2840,8 +2921,12 @@
-
-
+
+
+
+
+
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/16700-16799.xml
index 9b82ad5156..742d4b7d5d 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/effect.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/no_summon_friend.xml
index 6d397771c9..10013e576b 100644
--- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
index 0245ea8f38..c17a26f599 100644
--- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java
@@ -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);
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini b/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini
index 9e4f682473..52fbe3441f 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index 60fe478a1c..97a701deb6 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/26100-26199.xml
index 37dfed3820..b27559c0cb 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/26100-26199.xml
@@ -2334,7 +2334,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2355,6 +2363,9 @@
+
+
+
@@ -2366,8 +2377,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2388,6 +2408,10 @@
+
+
+
+
@@ -2400,7 +2424,20 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2419,10 +2456,16 @@
-
-
+
+
+
+
+
+
+
+
@@ -2506,6 +2549,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2528,6 +2577,8 @@
+
+
@@ -2540,6 +2591,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2562,6 +2619,8 @@
+
+
@@ -2574,6 +2633,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2596,6 +2661,8 @@
+
+
@@ -2608,6 +2675,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2630,6 +2703,8 @@
+
+
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/16700-16799.xml
index 715f38cebc..73bfd1b773 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/effect.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/no_summon_friend.xml
index 47919a4da2..48b32e32bf 100644
--- a/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
index 8b2bea4a40..52d0a58ddd 100644
--- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java
@@ -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);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/GrandBoss.ini b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/GrandBoss.ini
index 9e4f682473..52fbe3441f 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/GrandBoss.ini
@@ -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
# ---------------------------------------------------------------------------
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
index 60fe478a1c..97a701deb6 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/bosses/Ramona/Ramona.java
@@ -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 _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();
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/npcs/26100-26199.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/npcs/26100-26199.xml
index 37dfed3820..b27559c0cb 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/npcs/26100-26199.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/npcs/26100-26199.xml
@@ -2334,7 +2334,15 @@
-
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2355,6 +2363,9 @@
+
+
+
@@ -2366,8 +2377,17 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2388,6 +2408,10 @@
+
+
+
+
@@ -2400,7 +2424,20 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
GIANT
FEMALE
@@ -2419,10 +2456,16 @@
-
-
+
+
+
+
+
+
+
+
@@ -2506,6 +2549,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2528,6 +2577,8 @@
+
+
@@ -2540,6 +2591,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2562,6 +2619,8 @@
+
+
@@ -2574,6 +2633,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2596,6 +2661,8 @@
+
+
@@ -2608,6 +2675,12 @@
+
+
+
+
+
+
GIANT
MALE
@@ -2630,6 +2703,8 @@
+
+
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/16700-16799.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/16700-16799.xml
index c04705163a..d7b44ed889 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/16700-16799.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/16700-16799.xml
@@ -461,30 +461,76 @@
icon.skill1059
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1478
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 10
+ PER
+
+
+ 10
+ PER
+
+
icon.skill1044
+ 5
+ 60
A2
+ -100
SELF
- 100
+ SINGLE
+
+
+ 3
+ PER
+
+
icon.skill1108
+ 5
+ 60
A2
+ -100
+ true
SELF
- 1
+ SINGLE
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/effect.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/effect.xml
index c11680b964..c0ff82732d 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/effect.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/effect.xml
@@ -2261,4 +2261,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/no_summon_friend.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/no_summon_friend.xml
index 47919a4da2..48b32e32bf 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/no_summon_friend.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/zones/no_summon_friend.xml
@@ -187,7 +187,7 @@
-
+
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
index eb47873e0b..707f8bc398 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
@@ -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);