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);