From fa21a6c69c8245d29c0eddb05fae051fa3aabf06 Mon Sep 17 00:00:00 2001
From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Mon, 9 Oct 2017 14:26:51 +0000
Subject: [PATCH] Basic AI for Helios.
---
.../db_installer/sql/game/grandboss_data.sql | 3 +-
.../dist/game/config/GrandBoss.ini | 21 +++-
.../ai/areas/Giran/Kekropus/34222-03.html | 4 +
.../ai/areas/Giran/Kekropus/34222-04.html | 4 +
.../ai/areas/Giran/Kekropus/Kekropus.java | 108 ++++++++++------
.../data/scripts/ai/bosses/Helios/Helios.java | 119 ++++++++++++++++++
.../dist/game/data/stats/npcs/29300-29399.xml | 6 +-
.../dist/game/data/zones/no_summon_friend.xml | 3 +
.../java/com/l2jmobius/Config.java | 15 +++
.../com/l2jmobius/gameserver/enums/Movie.java | 2 +
10 files changed, 240 insertions(+), 45 deletions(-)
create mode 100644 L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-03.html
create mode 100644 L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-04.html
create mode 100644 L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Helios/Helios.java
diff --git a/L2J_Mobius_3.0_Helios/dist/db_installer/sql/game/grandboss_data.sql b/L2J_Mobius_3.0_Helios/dist/db_installer/sql/game/grandboss_data.sql
index 48ac146c81..9f43700f04 100644
--- a/L2J_Mobius_3.0_Helios/dist/db_installer/sql/game/grandboss_data.sql
+++ b/L2J_Mobius_3.0_Helios/dist/db_installer/sql/game/grandboss_data.sql
@@ -24,4 +24,5 @@ INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`
(29118, 0, 0, 0, 0, 4109288, 1220547), -- Beleth
(25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim
(25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith
-(26124, 0, 0, 0, 0, 13945521, 50920); -- Kelbim
+(26124, 0, 0, 0, 0, 13945521, 50920), -- Kelbim
+(29305, 0, 0, 0, 0, 589355368, 51696); -- Helios
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 924f8dcad4..67ee84089e 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini
+++ b/L2J_Mobius_3.0_Helios/dist/game/config/GrandBoss.ini
@@ -182,4 +182,23 @@ LindviorMinPlayers = 49
LindviorMaxPlayers = 112
# Minimum players Level for enter to Lindvior. Retail: 99
-LindviorMinPlayerLvl = 99
\ No newline at end of file
+LindviorMinPlayerLvl = 99
+
+# ---------------------------------------------------------------------------
+# Helios
+# ---------------------------------------------------------------------------
+
+# Delay of appearance time of Helios. Value is minute. Range 3-60
+HeliosWaitTime = 10
+
+# Interval time of Helios. Value is hour. Range 1-480
+IntervalOfHeliosSpawn = 264
+
+# Random interval. Range 1-192
+RandomOfHeliosSpawn = 72
+
+# Minimal count of players for enter to Helios. Retail: 70
+HeliosMinPlayers = 70
+
+# Minimum players Level for enter to Helios. Retail: 102
+HeliosMinPlayerLvl = 99
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-03.html b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-03.html
new file mode 100644
index 0000000000..fb4b441063
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-03.html
@@ -0,0 +1,4 @@
+
Hierarch Kekropus:
+There is an attack upon Superion Fortress!
+At this time it's impossible to enter.
+
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-04.html b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-04.html
new file mode 100644
index 0000000000..708ea3d160
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/34222-04.html
@@ -0,0 +1,4 @@
+Hierarch Kekropus:
+Helios? You're too late, friend.
+A group of warriors drove him off not long ago.
+
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/Kekropus.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/Kekropus.java
index b6aaca4cb6..d194b23687 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/Kekropus.java
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/areas/Giran/Kekropus/Kekropus.java
@@ -18,14 +18,19 @@ package ai.areas.Giran.Kekropus;
import java.util.List;
+import com.l2jmobius.Config;
+import com.l2jmobius.gameserver.instancemanager.GrandBossManager;
+import com.l2jmobius.gameserver.instancemanager.QuestManager;
import com.l2jmobius.gameserver.model.L2Party;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jmobius.gameserver.network.serverpackets.PlaySound;
import ai.AbstractNpcAI;
+import ai.bosses.Helios.Helios;
/**
* Kekropus AI
@@ -33,14 +38,15 @@ import ai.AbstractNpcAI;
*/
public final class Kekropus extends AbstractNpcAI
{
- // NPC
+ // NPCs
private static final int KEKROPUS = 34222;
+ private static final int HELIOS = 29305;
// Teleports
- private static final Location TELEPORT = new Location(79827, 152588, 2304);
- private static final Location ENTER_LOC = new Location(79313, 153617, 2307);
- // Config
- private static final int HELIOS_MIN_PLAYER = 70;
- private static final int HELIOS_MIN_PLAYER_LVL = 102;
+ private static final Location NORMAL_TELEPORT = new Location(79827, 152588, 2304);
+ private static final Location RAID_ENTER_LOC = new Location(79313, 153617, 2307);
+ // Status
+ private static final int ALIVE = 0;
+ private static final int DEAD = 3;
private Kekropus()
{
@@ -57,56 +63,73 @@ public final class Kekropus extends AbstractNpcAI
{
case "teleport":
{
- player.teleToLocation(TELEPORT);
+ player.teleToLocation(NORMAL_TELEPORT);
break;
}
case "helios":
{
- if (!player.isInParty())
+ if (player.isGM())
{
- final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
- packet.setHtml(getHtm(player.getHtmlPrefix(), "34222-01.html"));
- packet.replace("%min%", Integer.toString(HELIOS_MIN_PLAYER));
- packet.replace("%minlvl%", Integer.toString(HELIOS_MIN_PLAYER_LVL));
- player.sendPacket(packet);
- return null;
+ player.teleToLocation(RAID_ENTER_LOC, true);
}
- final L2Party party = player.getParty();
- final boolean isInCC = party.isInCommandChannel();
- final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
- final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
- if (!isPartyLeader)
+ else
{
- return "34222-02.html";
- }
- if (members.size() < HELIOS_MIN_PLAYER)
- {
- final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
- packet.setHtml(getHtm(player.getHtmlPrefix(), "34222-01.html"));
- packet.replace("%min%", Integer.toString(HELIOS_MIN_PLAYER));
- packet.replace("%minlvl%", Integer.toString(HELIOS_MIN_PLAYER_LVL));
- player.sendPacket(packet);
- return null;
- }
- for (L2PcInstance member : members)
- {
- if (member.getLevel() < HELIOS_MIN_PLAYER_LVL)
+ final int status = GrandBossManager.getInstance().getBossStatus(HELIOS);
+ if ((status > ALIVE) && (status < DEAD))
+ {
+ return "34222-03.html";
+ }
+ if (status == DEAD)
+ {
+ return "34222-04.html";
+ }
+ if (!player.isInParty())
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player.getHtmlPrefix(), "34222-01.html"));
- packet.replace("%min%", Integer.toString(HELIOS_MIN_PLAYER));
- packet.replace("%minlvl%", Integer.toString(HELIOS_MIN_PLAYER_LVL));
+ packet.replace("%min%", Integer.toString(Config.HELIOS_MIN_PLAYER));
+ packet.replace("%minlvl%", Integer.toString(Config.HELIOS_MIN_PLAYER_LVL));
player.sendPacket(packet);
return null;
}
- }
- for (L2PcInstance member : members)
- {
- if ((member.calculateDistance(npc, false, false) < 1000) && (npc.getId() == KEKROPUS))
+ final L2Party party = player.getParty();
+ final boolean isInCC = party.isInCommandChannel();
+ final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
+ final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
+ if (!isPartyLeader)
{
- member.teleToLocation(ENTER_LOC, true);
+ return "34222-02.html";
+ }
+ if (members.size() < Config.HELIOS_MIN_PLAYER)
+ {
+ final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
+ packet.setHtml(getHtm(player.getHtmlPrefix(), "34222-01.html"));
+ packet.replace("%min%", Integer.toString(Config.HELIOS_MIN_PLAYER));
+ packet.replace("%minlvl%", Integer.toString(Config.HELIOS_MIN_PLAYER_LVL));
+ player.sendPacket(packet);
+ return null;
+ }
+ for (L2PcInstance member : members)
+ {
+ if (member.getLevel() < Config.HELIOS_MIN_PLAYER_LVL)
+ {
+ final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
+ packet.setHtml(getHtm(player.getHtmlPrefix(), "34222-01.html"));
+ packet.replace("%min%", Integer.toString(Config.HELIOS_MIN_PLAYER));
+ packet.replace("%minlvl%", Integer.toString(Config.HELIOS_MIN_PLAYER_LVL));
+ player.sendPacket(packet);
+ return null;
+ }
+ }
+ for (L2PcInstance member : members)
+ {
+ if ((member.calculateDistance(npc, false, false) < 1000) && (npc.getId() == KEKROPUS))
+ {
+ member.teleToLocation(RAID_ENTER_LOC, true);
+ }
}
}
+ heliosAI().startQuestTimer("beginning", Config.HELIOS_WAIT_TIME * 60000, null, null);
break;
}
}
@@ -136,6 +159,11 @@ public final class Kekropus extends AbstractNpcAI
return "34222.html";
}
+ private Quest heliosAI()
+ {
+ return QuestManager.getInstance().getQuest(Helios.class.getSimpleName());
+ }
+
public static void main(String[] args)
{
new Kekropus();
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Helios/Helios.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Helios/Helios.java
new file mode 100644
index 0000000000..5bd41a7347
--- /dev/null
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/ai/bosses/Helios/Helios.java
@@ -0,0 +1,119 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package ai.bosses.Helios;
+
+import com.l2jmobius.Config;
+import com.l2jmobius.gameserver.instancemanager.GrandBossManager;
+import com.l2jmobius.gameserver.instancemanager.ZoneManager;
+import com.l2jmobius.gameserver.model.Location;
+import com.l2jmobius.gameserver.model.StatsSet;
+import com.l2jmobius.gameserver.model.actor.L2Npc;
+import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jmobius.gameserver.model.zone.type.L2NoSummonFriendZone;
+import com.l2jmobius.gameserver.network.NpcStringId;
+import com.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
+
+import ai.AbstractNpcAI;
+
+/**
+ * @author Mobius
+ */
+public class Helios extends AbstractNpcAI
+{
+ // NPC
+ private static final int HELIOS = 29305;
+ // Location
+ private static final Location HELIOS_SPAWN_LOC = new Location(92771, 161909, 3494, 38329);
+ // Zone
+ private final static int ZONE_ID = 210109;
+ // Status
+ private static final int ALIVE = 0;
+ private static final int WAITING = 1;
+ private static final int DEAD = 3;
+ // Misc
+ private static final int HELIOS_RAID_DURATION = 5; // hours
+ private static L2Npc bossInstance;
+ protected L2NoSummonFriendZone bossZone;
+
+ private Helios()
+ {
+ addAttackId(HELIOS);
+ addKillId(HELIOS);
+ // Unlock
+ final StatsSet info = GrandBossManager.getInstance().getStatsSet(HELIOS);
+ final long time = info.getLong("respawn_time") - System.currentTimeMillis();
+ if (time > 0)
+ {
+ startQuestTimer("unlock_helios", time, null, null);
+ }
+ // Zone
+ bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, L2NoSummonFriendZone.class);
+ }
+
+ @Override
+ public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+ {
+ String htmltext = null;
+ switch (event)
+ {
+ case "unlock_helios":
+ {
+ GrandBossManager.getInstance().setBossStatus(HELIOS, ALIVE);
+ break;
+ }
+ case "beginning":
+ {
+ GrandBossManager.getInstance().setBossStatus(HELIOS, WAITING);
+ bossInstance = addSpawn(HELIOS, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
+ startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null);
+ break;
+ }
+ case "resetRaid":
+ {
+ final int status = GrandBossManager.getInstance().getBossStatus(HELIOS);
+ if ((status > ALIVE) && (status < DEAD))
+ {
+ GrandBossManager.getInstance().setBossStatus(HELIOS, ALIVE);
+ npc.deleteMe();
+ }
+ break;
+ }
+ }
+ return htmltext;
+ }
+
+ @Override
+ public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
+ {
+ if (npc.getId() == HELIOS)
+ {
+ GrandBossManager.getInstance().setBossStatus(HELIOS, DEAD);
+ final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.LINDVIOR_SPAWN_RANDOM)) * 3600000;
+ final StatsSet info = GrandBossManager.getInstance().getStatsSet(HELIOS);
+ info.set("respawn_time", System.currentTimeMillis() + respawnTime);
+ GrandBossManager.getInstance().setStatsSet(HELIOS, info);
+ startQuestTimer("unlock_helios", respawnTime, null, null);
+ bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
+ }
+ return super.onKill(npc, killer, isSummon);
+ }
+
+ public static void main(String[] args)
+ {
+ new Helios();
+ }
+}
diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/29300-29399.xml b/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/29300-29399.xml
index 1d3a616d13..3a8d693fce 100644
--- a/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/29300-29399.xml
+++ b/L2J_Mobius_3.0_Helios/dist/game/data/stats/npcs/29300-29399.xml
@@ -291,14 +291,14 @@
-
+
GIANT
-
-
+
+
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 bbd4705083..a88bc59bb2 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
@@ -190,4 +190,7 @@
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/Config.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/Config.java
index 8c5c52a5a4..7d4d506956 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/Config.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/Config.java
@@ -934,6 +934,13 @@ public final class Config
public static int LILITH_MIN_PLAYER_LVL;
public static int LILITH_MAX_PLAYER_LVL;
+ // Helios
+ public static int HELIOS_WAIT_TIME;
+ public static int HELIOS_SPAWN_INTERVAL;
+ public static int HELIOS_SPAWN_RANDOM;
+ public static int HELIOS_MIN_PLAYER;
+ public static int HELIOS_MIN_PLAYER_LVL;
+
// Gracia Seeds Settings
public static int SOD_TIAT_KILL_COUNT;
public static long SOD_STAGE_2_LENGTH;
@@ -2261,17 +2268,25 @@ public final class Config
LILITH_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfLilithSpawn", 148);
LILITH_MIN_PLAYER_LVL = GrandBossSettings.getInt("LilithMinPlayerLvl", 85);
LILITH_MAX_PLAYER_LVL = GrandBossSettings.getInt("LilithMaxPlayerLvl", 89);
+
TRASKEN_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfTraskenSpawn", 264);
TRASKEN_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfTraskenSpawn", 72);
TRASKEN_MIN_PLAYERS = GrandBossSettings.getInt("TraskenMinPlayers", 49);
TRASKEN_MAX_PLAYERS = GrandBossSettings.getInt("TraskenMaxPlayers", 112);
TRASKEN_MIN_PLAYER_LVL = GrandBossSettings.getInt("TraskenMinPlayerLvl", 85);
+
LINDVIOR_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfLindviorSpawn", 264);
LINDVIOR_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfLindviorSpawn", 72);
LINDVIOR_MIN_PLAYERS = GrandBossSettings.getInt("LindviorMinPlayers", 49);
LINDVIOR_MAX_PLAYERS = GrandBossSettings.getInt("LindviorMaxPlayers", 112);
LINDVIOR_MIN_PLAYER_LVL = GrandBossSettings.getInt("LindviorMinPlayerLvl", 99);
+ HELIOS_WAIT_TIME = GrandBossSettings.getInt("HeliosWaitTime", 10);
+ HELIOS_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfHeliosSpawn", 264);
+ HELIOS_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfHeliosSpawn", 72);
+ HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70);
+ HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102);
+
// Gracia Seeds
final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/enums/Movie.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/enums/Movie.java
index d0dbfb614a..74d3cfa606 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/enums/Movie.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/enums/Movie.java
@@ -112,6 +112,8 @@ public enum Movie
EPIC_TAUTI_SCENE(117, false),
SC_RAMONA_TRANS_A(119, true),
SC_RAMONA_TRANS_B(120, true),
+ SC_HELIOS_TRANS_A(121, true),
+ SC_HELIOS_TRANS_B(122, true),
LAND_KSERTH_A(1000, true),
LAND_KSERTH_B(1001, true),
LAND_UNDEAD_A(1002, true),