diff --git a/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql b/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql index f781f20e7e..aa7275bcf3 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql +++ b/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql @@ -25,4 +25,5 @@ INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading` (29336, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim (29348, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith (26124, 0, 0, 0, 0, 13945521, 50920), -- Kelbim -(29305, 0, 0, 0, 0, 589355368, 51696); -- Helios +(29305, 0, 0, 0, 0, 589355368, 51696), -- Helios +(29364, 180712, 210664, -14823, 22146, 412872295, 124077); -- Fafurion 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 1ac8c66df1..9e4f682473 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini +++ b/L2J_Mobius_6.0_Fafurion/dist/game/config/GrandBoss.ini @@ -184,3 +184,25 @@ HeliosMinPlayers = 70 # Minimum players Level for enter to Helios. Retail: 102 HeliosMinPlayerLvl = 99 + +# --------------------------------------------------------------------------- +# Fafurion +# --------------------------------------------------------------------------- + +# Delay of appearance time of Fafurion. Value is minute. Range 3-60 +FafurionWaitTime = 10 + +# Interval time of Fafurion. Value is hour. Range 1-480 +IntervalOfFafurionSpawn = 264 + +# Random interval. Range 1-192 +RandomOfFafurionSpawn = 72 + +# Maximum count of players for enter to 200. Retail: 200 +FafurionMaxPlayers = 200 + +# Minimal count of players for enter to Fafurion. Retail: 49 +FafurionMinPlayers = 49 + +# Minimum players Level for enter to Fafurion. Retail: 105 +FafurionMinPlayerLvl = 105 diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/html/admin/teleports/raid/raid_special.htm b/L2J_Mobius_6.0_Fafurion/dist/game/data/html/admin/teleports/raid/raid_special.htm index ea1b6704eb..5d03d0878c 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/html/admin/teleports/raid/raid_special.htm +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/html/admin/teleports/raid/raid_special.htm @@ -61,7 +61,7 @@ + + + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Fafurion/Fafurion.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Fafurion/Fafurion.java new file mode 100644 index 0000000000..d13bf7294b --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Fafurion/Fafurion.java @@ -0,0 +1,203 @@ +/* + * 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.Fafurion; + +import java.util.List; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.instancemanager.GrandBossManager; +import com.l2jmobius.gameserver.model.L2Party; +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 ai.AbstractNpcAI; + +/** + * @author Mobius + */ +public class Fafurion extends AbstractNpcAI +{ + // NPCs + private static final int HEART_OF_TSUNAMI = 34488; + private static final int FAFURION = 29364; + // Item + private static final int FONDUS_STONE = 80322; + // Locations + private static final Location RAID_ENTER_LOC = new Location(180059, 212896, -14727); + private static final Location FAFURION_SPAWN_LOC = new Location(180712, 210664, -14823, 22146); + // Status + private static final int ALIVE = 0; + private static final int WAITING = 1; + private static final int FIGHTING = 2; + private static final int DEAD = 3; + // Misc + private static final int RAID_DURATION = 5; // hours + private static L2Npc bossInstance; + + private Fafurion() + { + addStartNpc(HEART_OF_TSUNAMI); + addTalkId(HEART_OF_TSUNAMI); + addFirstTalkId(HEART_OF_TSUNAMI); + addKillId(FAFURION); + // Unlock + final StatsSet info = GrandBossManager.getInstance().getStatsSet(FAFURION); + final int status = GrandBossManager.getInstance().getBossStatus(FAFURION); + if (status == DEAD) + { + final long time = info.getLong("respawn_time") - System.currentTimeMillis(); + if (time > 0) + { + startQuestTimer("unlock_fafurion", time, null, null); + } + else + { + GrandBossManager.getInstance().setBossStatus(FAFURION, ALIVE); + } + } + else if (status != ALIVE) + { + GrandBossManager.getInstance().setBossStatus(FAFURION, ALIVE); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + String htmltext = null; + switch (event) + { + case "unlock_fafurion": + { + GrandBossManager.getInstance().setBossStatus(FAFURION, ALIVE); + break; + } + case "beginning": + { + if (GrandBossManager.getInstance().getBossStatus(FAFURION) == WAITING) + { + GrandBossManager.getInstance().setBossStatus(FAFURION, FIGHTING); + bossInstance = addSpawn(FAFURION, FAFURION_SPAWN_LOC.getX(), FAFURION_SPAWN_LOC.getY(), FAFURION_SPAWN_LOC.getZ(), FAFURION_SPAWN_LOC.getHeading(), false, 0, false); + startQuestTimer("resetRaid", RAID_DURATION * 60 * 60 * 1000, bossInstance, null); + } + break; + } + case "resetRaid": + { + final int status = GrandBossManager.getInstance().getBossStatus(FAFURION); + if ((status > ALIVE) && (status < DEAD)) + { + GrandBossManager.getInstance().setBossStatus(FAFURION, ALIVE); + npc.deleteMe(); + } + break; + } + case "enter_area": + { + final int status = GrandBossManager.getInstance().getBossStatus(FAFURION); + if (player.isGM()) + { + player.teleToLocation(RAID_ENTER_LOC, true); + } + else + { + if (((status > ALIVE) && (status < DEAD)) || (status == DEAD)) + { + return "34488-02.html"; + } + if (!player.isInParty()) + { + return "34488-01.html"; + } + 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) + { + return "34488-02.html"; + } + if ((members.size() < Config.FAFURION_MIN_PLAYERS) || (members.size() > Config.FAFURION_MAX_PLAYERS)) + { + return "34488-01.html"; + } + for (L2PcInstance member : members) + { + if (member.getLevel() < Config.FAFURION_MIN_PLAYER_LVL) + { + return "34488-01.html"; + } + } + if (!hasQuestItems(player, FONDUS_STONE)) + { + // TODO: Retail message. + player.sendMessage("You need to own a fondus stone."); + return null; + } + takeItems(player, FONDUS_STONE, 1); + for (L2PcInstance member : members) + { + if ((member.calculateDistance2D(npc) < 1000) && (npc.getId() == HEART_OF_TSUNAMI)) + { + member.teleToLocation(RAID_ENTER_LOC, true); + } + } + } + if (status == ALIVE) + { + GrandBossManager.getInstance().setBossStatus(FAFURION, WAITING); + startQuestTimer("beginning", Config.FAFURION_WAIT_TIME * 60000, null, null); + } + break; + } + } + return htmltext; + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + // TODO: More ids. + // switch (npc.getId()) + // { + // case FAFURION: + // { + GrandBossManager.getInstance().setBossStatus(FAFURION, DEAD); + final long respawnTime = (Config.FAFURION_SPAWN_INTERVAL + getRandom(-Config.FAFURION_SPAWN_RANDOM, Config.FAFURION_SPAWN_RANDOM)) * 3600000; + final StatsSet info = GrandBossManager.getInstance().getStatsSet(FAFURION); + info.set("respawn_time", System.currentTimeMillis() + respawnTime); + GrandBossManager.getInstance().setStatsSet(FAFURION, info); + startQuestTimer("unlock_fafurion", respawnTime, null, null); + // break; + // } + // } + return super.onKill(npc, killer, isSummon); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + return "34488.html"; + } + + public static void main(String[] args) + { + new Fafurion(); + } +} diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml index 78387d6f63..021bc3af0b 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml @@ -2811,7 +2811,64 @@ - + + + ETC + FEMALE + + + + + + + + + + + + + + + + + + ETC + FEMALE + + + + + + + + + + + + + + + + + + ETC + FEMALE + + + + + + + + + + + + + + + + DRAGON @@ -2923,63 +2980,6 @@ - - - ETC - FEMALE - - - - - - - - - - - - - - - - - - ETC - FEMALE - - - - - - - - - - - - - - - - - - ETC - FEMALE - - - - - - - - - - - - - - - ETC 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 a88bc59bb2..061b3a2798 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 @@ -193,4 +193,7 @@ + + + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/java/com/l2jmobius/Config.java b/L2J_Mobius_6.0_Fafurion/java/com/l2jmobius/Config.java index 2e9c825818..5ec68f923e 100644 --- a/L2J_Mobius_6.0_Fafurion/java/com/l2jmobius/Config.java +++ b/L2J_Mobius_6.0_Fafurion/java/com/l2jmobius/Config.java @@ -902,6 +902,14 @@ public final class Config public static int HELIOS_MIN_PLAYER; public static int HELIOS_MIN_PLAYER_LVL; + // Fafurion + public static int FAFURION_WAIT_TIME; + public static int FAFURION_SPAWN_INTERVAL; + public static int FAFURION_SPAWN_RANDOM; + public static int FAFURION_MIN_PLAYERS; + public static int FAFURION_MAX_PLAYERS; + public static int FAFURION_MIN_PLAYER_LVL; + // Gracia Seeds Settings public static int SOD_TIAT_KILL_COUNT; public static long SOD_STAGE_2_LENGTH; @@ -2252,6 +2260,13 @@ public final class Config HELIOS_MIN_PLAYER = GrandBossSettings.getInt("HeliosMinPlayers", 70); HELIOS_MIN_PLAYER_LVL = GrandBossSettings.getInt("HeliosMinPlayerLvl", 102); + FAFURION_WAIT_TIME = GrandBossSettings.getInt("FafurionWaitTime", 10); + FAFURION_SPAWN_INTERVAL = GrandBossSettings.getInt("IntervalOfFafurionSpawn", 264); + FAFURION_SPAWN_RANDOM = GrandBossSettings.getInt("RandomOfFafurionSpawn", 72); + FAFURION_MIN_PLAYERS = GrandBossSettings.getInt("FafurionMinPlayers", 49); + FAFURION_MAX_PLAYERS = GrandBossSettings.getInt("FafurionMaxPlayers", 200); + FAFURION_MIN_PLAYER_LVL = GrandBossSettings.getInt("FafurionMinPlayerLvl", 105); + // Gracia Seeds final PropertiesParser GraciaSeedsSettings = new PropertiesParser(GRACIASEEDS_CONFIG_FILE);