diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31087.htm b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31087.htm new file mode 100644 index 0000000000..9ec75240c9 --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31087.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Lilith lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31088.htm b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31088.htm new file mode 100644 index 0000000000..2fd631a2d6 --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31088.htm @@ -0,0 +1,6 @@ + +Gatekeeper Spirit:
+Teleport out from the Sanctum +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31089.htm b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31089.htm new file mode 100644 index 0000000000..7a51055f6f --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/teleporter/31089.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Anakim lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfAnakim.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfAnakim.xml new file mode 100644 index 0000000000..7040769bb4 --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfAnakim.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfLilith.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfLilith.xml new file mode 100644 index 0000000000..741f9954ce --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/instances/SanctumOfLilith.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java new file mode 100644 index 0000000000..a5119bfb1f --- /dev/null +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java @@ -0,0 +1,260 @@ +/* + * 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 instances.SevenSignsRBs; + +import java.util.List; + +import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.model.Party; +import org.l2jmobius.gameserver.model.actor.Creature; +import org.l2jmobius.gameserver.model.actor.Npc; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.instancezone.Instance; +import org.l2jmobius.gameserver.model.zone.type.NoRestartZone; + +import instances.AbstractInstance; + +/** + * @author RobikBobik + * @NOTE: Retail like work + * @TODO: When one RB die, the second will be invul for 5 minutes. + */ +public class SevenSignsRBs extends AbstractInstance +{ + // NPCs + private static final int ANAKIM_GATEKEEPER_SPIRIT = 31089; + private static final int LILITH_GATEKEEPER_SPIRIT = 31087; + private static final int GATEKEEPER_SPIRIT_OUT_TELEPORT = 31088; + private static final int ANAKIM = 25286; + private static final int LILITH = 25283; + + // Misc + private static final int ANAKIM_TEMPLATE_ID = 200; + private static final int LILITH_TEMPLATE_ID = 199; + + private static int MAX_PLAYERS_IN_ZONE = 300; + + private static final NoRestartZone _anakim_zone = ZoneManager.getInstance().getZoneById(70052, NoRestartZone.class); + private static final NoRestartZone _lilith_zone = ZoneManager.getInstance().getZoneById(70053, NoRestartZone.class); + + // TELEPORTS + private static final Location[] TELEPORT_TO_DARK_ELVEN = + { + new Location(12168, 17149, -4575), + new Location(11688, 18219, -4585), + new Location(10502, 17112, -4588), + new Location(11169, 15922, -4585), + }; + + // TODO: When teleport from instance done. Enable it + /* + * private static final Location[] TELEPORT_TO_ADEN = { new Location(148053, 26935, -2206), new Location(148053, 28017, -2269), new Location(146558, 28017, -2269), new Location(146558, 26935, -2206), }; + */ + + public SevenSignsRBs() + { + super(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + addStartNpc(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT); + addTalkId(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT, GATEKEEPER_SPIRIT_OUT_TELEPORT); + addKillId(ANAKIM, LILITH); + addAttackId(ANAKIM, LILITH); + addInstanceLeaveId(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + } + + @Override + public String onAdvEvent(String event, Npc npc, PlayerInstance player) + { + switch (event) + { + case "ANAKIM_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _anakim_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, ANAKIM_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + } + break; + } + case "LILITH_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _lilith_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, LILITH_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, LILITH_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, LILITH_TEMPLATE_ID); + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_ANAKIM": + { + for (Creature charInside : _anakim_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(-20185 + getRandom(50), 13476 + getRandom(50), -4901); + } + } + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_LILITH": + { + for (Creature charInside : _lilith_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(171346 + getRandom(50), -17599 + getRandom(50), -4901); + } + } + } + break; + } + case "TELEPORT_OUT": + { + // TODO: Different teleport location from instance. + // switch (player.getInstanceId()) + // { + // case ANAKIM_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // case LILITH_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_ADEN[getRandom(TELEPORT_TO_ADEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // } + final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + break; + } + case "ANAKIM_DEATH_CAST_LILITH_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + case "LILITH_DEATH_CAST_ANAKIM_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + } + return null; + } + + @Override + public String onKill(Npc npc, PlayerInstance player, boolean isSummon) + { + switch (npc.getId()) + { + case ANAKIM: + { + // TODO: + // startQuestTimer("ANAKIM_DEATH_CAST_LILITH_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_ANAKIM", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, -6664, 18501, -5495, 0, false, 600000, false, npc.getInstanceId()); + break; + } + case LILITH: + { + // TODO: + // startQuestTimer("LILITH_DEATH_CAST_ANAKIM_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_LILITH", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, 185062, -9612, -5493, 0, false, 600000, false, npc.getInstanceId()); + break; + } + } + final Instance world = npc.getInstanceWorld(); + if (world != null) + { + world.finishInstance(); + } + return super.onKill(npc, player, isSummon); + } + + public static void main(String[] args) + { + new SevenSignsRBs(); + } +} diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/zones/no_restart.xml b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/zones/no_restart.xml index 5efbfe3bd9..a7be76e3c1 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/zones/no_restart.xml +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/zones/no_restart.xml @@ -328,4 +328,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31087.htm b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31087.htm new file mode 100644 index 0000000000..9ec75240c9 --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31087.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Lilith lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31088.htm b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31088.htm new file mode 100644 index 0000000000..2fd631a2d6 --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31088.htm @@ -0,0 +1,6 @@ + +Gatekeeper Spirit:
+Teleport out from the Sanctum +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31089.htm b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31089.htm new file mode 100644 index 0000000000..7a51055f6f --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/teleporter/31089.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Anakim lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfAnakim.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfAnakim.xml new file mode 100644 index 0000000000..7040769bb4 --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfAnakim.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfLilith.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfLilith.xml new file mode 100644 index 0000000000..741f9954ce --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/instances/SanctumOfLilith.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java new file mode 100644 index 0000000000..a5119bfb1f --- /dev/null +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java @@ -0,0 +1,260 @@ +/* + * 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 instances.SevenSignsRBs; + +import java.util.List; + +import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.model.Party; +import org.l2jmobius.gameserver.model.actor.Creature; +import org.l2jmobius.gameserver.model.actor.Npc; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.instancezone.Instance; +import org.l2jmobius.gameserver.model.zone.type.NoRestartZone; + +import instances.AbstractInstance; + +/** + * @author RobikBobik + * @NOTE: Retail like work + * @TODO: When one RB die, the second will be invul for 5 minutes. + */ +public class SevenSignsRBs extends AbstractInstance +{ + // NPCs + private static final int ANAKIM_GATEKEEPER_SPIRIT = 31089; + private static final int LILITH_GATEKEEPER_SPIRIT = 31087; + private static final int GATEKEEPER_SPIRIT_OUT_TELEPORT = 31088; + private static final int ANAKIM = 25286; + private static final int LILITH = 25283; + + // Misc + private static final int ANAKIM_TEMPLATE_ID = 200; + private static final int LILITH_TEMPLATE_ID = 199; + + private static int MAX_PLAYERS_IN_ZONE = 300; + + private static final NoRestartZone _anakim_zone = ZoneManager.getInstance().getZoneById(70052, NoRestartZone.class); + private static final NoRestartZone _lilith_zone = ZoneManager.getInstance().getZoneById(70053, NoRestartZone.class); + + // TELEPORTS + private static final Location[] TELEPORT_TO_DARK_ELVEN = + { + new Location(12168, 17149, -4575), + new Location(11688, 18219, -4585), + new Location(10502, 17112, -4588), + new Location(11169, 15922, -4585), + }; + + // TODO: When teleport from instance done. Enable it + /* + * private static final Location[] TELEPORT_TO_ADEN = { new Location(148053, 26935, -2206), new Location(148053, 28017, -2269), new Location(146558, 28017, -2269), new Location(146558, 26935, -2206), }; + */ + + public SevenSignsRBs() + { + super(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + addStartNpc(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT); + addTalkId(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT, GATEKEEPER_SPIRIT_OUT_TELEPORT); + addKillId(ANAKIM, LILITH); + addAttackId(ANAKIM, LILITH); + addInstanceLeaveId(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + } + + @Override + public String onAdvEvent(String event, Npc npc, PlayerInstance player) + { + switch (event) + { + case "ANAKIM_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _anakim_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, ANAKIM_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + } + break; + } + case "LILITH_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _lilith_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, LILITH_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, LILITH_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, LILITH_TEMPLATE_ID); + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_ANAKIM": + { + for (Creature charInside : _anakim_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(-20185 + getRandom(50), 13476 + getRandom(50), -4901); + } + } + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_LILITH": + { + for (Creature charInside : _lilith_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(171346 + getRandom(50), -17599 + getRandom(50), -4901); + } + } + } + break; + } + case "TELEPORT_OUT": + { + // TODO: Different teleport location from instance. + // switch (player.getInstanceId()) + // { + // case ANAKIM_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // case LILITH_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_ADEN[getRandom(TELEPORT_TO_ADEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // } + final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + break; + } + case "ANAKIM_DEATH_CAST_LILITH_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + case "LILITH_DEATH_CAST_ANAKIM_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + } + return null; + } + + @Override + public String onKill(Npc npc, PlayerInstance player, boolean isSummon) + { + switch (npc.getId()) + { + case ANAKIM: + { + // TODO: + // startQuestTimer("ANAKIM_DEATH_CAST_LILITH_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_ANAKIM", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, -6664, 18501, -5495, 0, false, 600000, false, npc.getInstanceId()); + break; + } + case LILITH: + { + // TODO: + // startQuestTimer("LILITH_DEATH_CAST_ANAKIM_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_LILITH", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, 185062, -9612, -5493, 0, false, 600000, false, npc.getInstanceId()); + break; + } + } + final Instance world = npc.getInstanceWorld(); + if (world != null) + { + world.finishInstance(); + } + return super.onKill(npc, player, isSummon); + } + + public static void main(String[] args) + { + new SevenSignsRBs(); + } +} diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/zones/no_restart.xml b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/zones/no_restart.xml index 5efbfe3bd9..a7be76e3c1 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/zones/no_restart.xml +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/zones/no_restart.xml @@ -328,4 +328,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31087.htm b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31087.htm new file mode 100644 index 0000000000..3500f9a91f --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31087.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Lilith lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31088.htm b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31088.htm new file mode 100644 index 0000000000..2fd631a2d6 --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31088.htm @@ -0,0 +1,6 @@ + +Gatekeeper Spirit:
+Teleport out from the Sanctum +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31089.htm b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31089.htm new file mode 100644 index 0000000000..96814ac2d8 --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/html/teleporter/31089.htm @@ -0,0 +1,12 @@ + +Gatekeeper Spirit:
+A voice seems to emanate from a shining blue sphere: +
+It is a sacred place where Anakim lays. I guard the path. +
+ +Remember, you cannot go back until all of your enemies are destroyed. And if you are unable to defeat them, magic must be used. + +
+ + \ No newline at end of file diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfAnakim.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfAnakim.xml new file mode 100644 index 0000000000..7040769bb4 --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfAnakim.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfLilith.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfLilith.xml new file mode 100644 index 0000000000..741f9954ce --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/instances/SanctumOfLilith.xml @@ -0,0 +1,33 @@ + + + diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java new file mode 100644 index 0000000000..a5119bfb1f --- /dev/null +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/instances/SevenSignsRBs/SevenSignsRBs.java @@ -0,0 +1,260 @@ +/* + * 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 instances.SevenSignsRBs; + +import java.util.List; + +import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.model.Party; +import org.l2jmobius.gameserver.model.actor.Creature; +import org.l2jmobius.gameserver.model.actor.Npc; +import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; +import org.l2jmobius.gameserver.model.instancezone.Instance; +import org.l2jmobius.gameserver.model.zone.type.NoRestartZone; + +import instances.AbstractInstance; + +/** + * @author RobikBobik + * @NOTE: Retail like work + * @TODO: When one RB die, the second will be invul for 5 minutes. + */ +public class SevenSignsRBs extends AbstractInstance +{ + // NPCs + private static final int ANAKIM_GATEKEEPER_SPIRIT = 31089; + private static final int LILITH_GATEKEEPER_SPIRIT = 31087; + private static final int GATEKEEPER_SPIRIT_OUT_TELEPORT = 31088; + private static final int ANAKIM = 25286; + private static final int LILITH = 25283; + + // Misc + private static final int ANAKIM_TEMPLATE_ID = 200; + private static final int LILITH_TEMPLATE_ID = 199; + + private static int MAX_PLAYERS_IN_ZONE = 300; + + private static final NoRestartZone _anakim_zone = ZoneManager.getInstance().getZoneById(70052, NoRestartZone.class); + private static final NoRestartZone _lilith_zone = ZoneManager.getInstance().getZoneById(70053, NoRestartZone.class); + + // TELEPORTS + private static final Location[] TELEPORT_TO_DARK_ELVEN = + { + new Location(12168, 17149, -4575), + new Location(11688, 18219, -4585), + new Location(10502, 17112, -4588), + new Location(11169, 15922, -4585), + }; + + // TODO: When teleport from instance done. Enable it + /* + * private static final Location[] TELEPORT_TO_ADEN = { new Location(148053, 26935, -2206), new Location(148053, 28017, -2269), new Location(146558, 28017, -2269), new Location(146558, 26935, -2206), }; + */ + + public SevenSignsRBs() + { + super(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + addStartNpc(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT); + addTalkId(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT, GATEKEEPER_SPIRIT_OUT_TELEPORT); + addKillId(ANAKIM, LILITH); + addAttackId(ANAKIM, LILITH); + addInstanceLeaveId(ANAKIM_TEMPLATE_ID, LILITH_TEMPLATE_ID); + } + + @Override + public String onAdvEvent(String event, Npc npc, PlayerInstance player) + { + switch (event) + { + case "ANAKIM_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _anakim_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, ANAKIM_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, ANAKIM_TEMPLATE_ID); + } + break; + } + case "LILITH_ENTER": + { + if (player.isInParty()) + { + final Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + + if (members.size() > (MAX_PLAYERS_IN_ZONE - _lilith_zone.getPlayersInside().size())) + { + player.sendMessage("Lilith Sanctum reached 300 players. You cannot enter now."); + } + else + { + for (PlayerInstance member : members) + { + if (!member.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit."); + } + enterInstance(member, npc, LILITH_TEMPLATE_ID); + } + } + } + else if (player.isGM()) + { + enterInstance(player, npc, LILITH_TEMPLATE_ID); + player.sendMessage("SYS: You have entered as GM/Admin to Anakim Instance"); + } + else + { + if (!player.isInsideRadius3D(npc, 1000)) + { + player.sendMessage("You must go closer to Gatekeeper Spirit."); + } + enterInstance(player, npc, LILITH_TEMPLATE_ID); + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_ANAKIM": + { + for (Creature charInside : _anakim_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(-20185 + getRandom(50), 13476 + getRandom(50), -4901); + } + } + } + break; + } + case "REMOVE_PLAYERS_FROM_ZONE_LILITH": + { + for (Creature charInside : _lilith_zone.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isPlayer()) + { + charInside.teleToLocation(171346 + getRandom(50), -17599 + getRandom(50), -4901); + } + } + } + break; + } + case "TELEPORT_OUT": + { + // TODO: Different teleport location from instance. + // switch (player.getInstanceId()) + // { + // case ANAKIM_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // case LILITH_TEMPLATE_ID: + // { + // final Location destination = TELEPORT_TO_ADEN[getRandom(TELEPORT_TO_ADEN.length)]; + // player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + // break; + // } + // } + final Location destination = TELEPORT_TO_DARK_ELVEN[getRandom(TELEPORT_TO_DARK_ELVEN.length)]; + player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ()); + break; + } + case "ANAKIM_DEATH_CAST_LILITH_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + case "LILITH_DEATH_CAST_ANAKIM_INVUL": + { + // TODO: When one RB die, the second will be invul for 5 minutes. + break; + } + } + return null; + } + + @Override + public String onKill(Npc npc, PlayerInstance player, boolean isSummon) + { + switch (npc.getId()) + { + case ANAKIM: + { + // TODO: + // startQuestTimer("ANAKIM_DEATH_CAST_LILITH_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_ANAKIM", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, -6664, 18501, -5495, 0, false, 600000, false, npc.getInstanceId()); + break; + } + case LILITH: + { + // TODO: + // startQuestTimer("LILITH_DEATH_CAST_ANAKIM_INVUL", 1000, null, null); + startQuestTimer("REMOVE_PLAYERS_FROM_ZONE_LILITH", 600000, null, player); + addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, 185062, -9612, -5493, 0, false, 600000, false, npc.getInstanceId()); + break; + } + } + final Instance world = npc.getInstanceWorld(); + if (world != null) + { + world.finishInstance(); + } + return super.onKill(npc, player, isSummon); + } + + public static void main(String[] args) + { + new SevenSignsRBs(); + } +} diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/zones/no_restart.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/zones/no_restart.xml index 5efbfe3bd9..a7be76e3c1 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/zones/no_restart.xml +++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/zones/no_restart.xml @@ -328,4 +328,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file