Lilith and Anakim re-additions.

Thanks to kamikadzz.
This commit is contained in:
MobiusDevelopment
2022-08-26 22:50:13 +00:00
parent 3cbff7d0b4
commit ee0b23d18f
11 changed files with 1053 additions and 3 deletions

View File

@@ -246,5 +246,9 @@
<npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil --> <npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil -->
<npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia --> <npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia -->
</group> </group>
<group name="SevenSigns">
<npc id="25283" x="185067" y="-9616" z="-5493" heading="48103" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Lilith -->
<npc id="25286" x="-6664" y="18505" z="-5493" heading="48103" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Anakim -->
</group>
</spawn> </spawn>
</list> </list>

View File

@@ -0,0 +1,276 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.SevenSignsRBs;
import java.util.List;
import org.l2jmobius.gameserver.enums.RaidBossStatus;
import org.l2jmobius.gameserver.instancemanager.DBSpawnManager;
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.Player;
import org.l2jmobius.gameserver.model.skill.AbnormalVisualEffect;
import org.l2jmobius.gameserver.model.zone.type.NoRestartZone;
import ai.AbstractNpcAI;
/**
* @author RobikBobik
* @NOTE: Retail like work
*/
public class SevenSignsRBs extends AbstractNpcAI
{
// 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 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_LILITH = new Location(185657, -10112, -5496);
private static final Location TELEPORT_TO_ANAKIM = new Location(-7283, 19086, -5496);
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),
};
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()
{
addStartNpc(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT);
addTalkId(ANAKIM_GATEKEEPER_SPIRIT, LILITH_GATEKEEPER_SPIRIT, GATEKEEPER_SPIRIT_OUT_TELEPORT);
addKillId(ANAKIM, LILITH);
addAttackId(ANAKIM, LILITH);
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
switch (event)
{
case "ANAKIM_ENTER":
{
if (DBSpawnManager.getInstance().getStatus(ANAKIM) != RaidBossStatus.ALIVE)
{
player.sendMessage("Anakim is not present at the moment");
break;
}
if (player.isInParty())
{
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<Player> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
if (members.size() > (MAX_PLAYERS_IN_ZONE - ANAKIM_ZONE.getPlayersInside().size()))
{
player.sendMessage("Anakims Sanctum reached " + MAX_PLAYERS_IN_ZONE + " players. You cannot enter now.");
}
else
{
for (Player member : members)
{
if (!member.isInsideRadius3D(npc, 1000))
{
player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit.");
}
member.teleToLocation(TELEPORT_TO_ANAKIM);
}
}
}
else if (player.isGM())
{
player.teleToLocation(TELEPORT_TO_ANAKIM);
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.");
break;
}
player.teleToLocation(TELEPORT_TO_ANAKIM);
}
break;
}
case "LILITH_ENTER":
{
if (DBSpawnManager.getInstance().getStatus(LILITH) != RaidBossStatus.ALIVE)
{
player.sendMessage("Lilith is not present at the moment");
break;
}
if (player.isInParty())
{
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<Player> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
if (members.size() > (MAX_PLAYERS_IN_ZONE - LILITH_ZONE.getPlayersInside().size()))
{
player.sendMessage("Lilith Sanctum reached " + MAX_PLAYERS_IN_ZONE + " players. You cannot enter now.");
}
else
{
for (Player member : members)
{
if (!member.isInsideRadius3D(npc, 1000))
{
player.sendMessage("Player " + member.getName() + " must go closer to Gatekeeper Spirit.");
}
member.teleToLocation(TELEPORT_TO_LILITH);
}
}
}
else if (player.isGM())
{
player.teleToLocation(TELEPORT_TO_LILITH);
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.");
break;
}
player.teleToLocation(TELEPORT_TO_LILITH);
}
break;
}
case "REMOVE_PLAYERS_FROM_ZONE_ANAKIM":
{
for (Creature charInside : ANAKIM_ZONE.getCharactersInside())
{
if ((charInside != null) && 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) && charInside.isPlayer())
{
charInside.teleToLocation(171346 + getRandom(50), -17599 + getRandom(50), -4901);
}
}
break;
}
case "TELEPORT_OUT":
{
if (ANAKIM_ZONE.isInsideZone(player.getLocation()))
{
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;
}
if (LILITH_ZONE.isInsideZone(player.getLocation()))
{
final Location destination = TELEPORT_TO_ADEN[getRandom(TELEPORT_TO_ADEN.length)];
player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ());
break;
}
break;
}
case "ANAKIM_DEATH_CAST_LILITH_INVUL":
{
if (DBSpawnManager.getInstance().getStatus(LILITH) == RaidBossStatus.ALIVE)
{
Npc LILITH_NPC = DBSpawnManager.getInstance().getNpcs().get(LILITH);
LILITH_NPC.setInvul(true);
LILITH_NPC.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
startQuestTimer("LILITH_INVUL_END", 300000, null, player);
}
break;
}
case "LILITH_DEATH_CAST_ANAKIM_INVUL":
{
if (DBSpawnManager.getInstance().getStatus(ANAKIM) == RaidBossStatus.ALIVE)
{
Npc ANAKIM_NPC = DBSpawnManager.getInstance().getNpcs().get(ANAKIM);
ANAKIM_NPC.setInvul(true);
ANAKIM_NPC.getEffectList().startAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
startQuestTimer("ANAKIM_INVUL_END", 300000, null, player);
}
break;
}
case "LILITH_INVUL_END":
{
Npc LILITH_NPC = DBSpawnManager.getInstance().getNpcs().get(LILITH);
LILITH_NPC.setInvul(false);
LILITH_NPC.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
break;
}
case "ANAKIM_INVUL_END":
{
Npc ANAKIM_NPC = DBSpawnManager.getInstance().getNpcs().get(ANAKIM);
ANAKIM_NPC.setInvul(false);
ANAKIM_NPC.getEffectList().stopAbnormalVisualEffect(AbnormalVisualEffect.INVINCIBILITY);
break;
}
}
return null;
}
@Override
public String onKill(Npc npc, Player player, boolean isSummon)
{
switch (npc.getId())
{
case ANAKIM:
{
startQuestTimer("ANAKIM_DEATH_CAST_LILITH_INVUL", 1000, null, null);
addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, -6664, 18501, -5495, 0, false, 600000, false, npc.getInstanceId());
break;
}
case LILITH:
{
startQuestTimer("LILITH_DEATH_CAST_ANAKIM_INVUL", 1000, null, null);
addSpawn(GATEKEEPER_SPIRIT_OUT_TELEPORT, 185062, -9612, -5493, 0, false, 600000, false, npc.getInstanceId());
break;
}
}
return super.onKill(npc, player, isSummon);
}
public static void main(String[] args)
{
new SevenSignsRBs();
}
}

View File

@@ -246,5 +246,9 @@
<npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil --> <npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil -->
<npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia --> <npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia -->
</group> </group>
<group name="SevenSigns">
<npc id="25283" x="185067" y="-9616" z="-5493" heading="48103" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Lilith -->
<npc id="25286" x="-6664" y="18505" z="-5493" heading="48103" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Anakim -->
</group>
</spawn> </spawn>
</list> </list>

View File

@@ -246,5 +246,9 @@
<npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil --> <npc id="25447" x="113225" y="17488" z="-1414" heading="9173" dbSave="true" dbName="Immortal Savior Mardil" respawnTime="24hour" respawnRandom="12hour" /> <!-- Immortal Savior Mardil -->
<npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia --> <npc id="25450" x="113515" y="14908" z="9565" heading="7554" dbSave="true" dbName="Cherub Galaxia" respawnTime="24hour" respawnRandom="12hour" /> <!-- Cherub Galaxia -->
</group> </group>
<group name="SevenSigns">
<npc id="25283" x="185067" y="-9616" z="-5493" heading="48103" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Lilith -->
<npc id="25286" x="-6664" y="18505" z="-5493" heading="48103" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 1 | 0 19 * * 4"/> <!-- Anakim -->
</group>
</spawn> </spawn>
</list> </list>

View File

@@ -298,4 +298,10 @@
<npc id="25125" x="170497" y="85411" z="-1990" heading="40799" dbSave="true" dbName="Fierce Tiger King Angel" respawnTime="24hour" respawnRandom="12hour" /> <!-- Fierce Tiger King Angel --> <npc id="25125" x="170497" y="85411" z="-1990" heading="40799" dbSave="true" dbName="Fierce Tiger King Angel" respawnTime="24hour" respawnRandom="12hour" /> <!-- Fierce Tiger King Angel -->
</group> </group>
</spawn> </spawn>
<spawn name="GrandBosses">
<group name="SevenSigns">
<npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" />
<npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" />
</group>
</spawn>
</list> </list>

View File

@@ -0,0 +1,252 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
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.Player;
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 final 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, Player player)
{
switch (event)
{
case "ANAKIM_ENTER":
{
if (player.isInParty())
{
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<Player> 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 (Player 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<Player> 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 (Player 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) && 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) && 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, Player 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();
}
}

View File

@@ -163,7 +163,7 @@
</group> </group>
</spawn> </spawn>
<spawn name="GrandBosses"> <spawn name="GrandBosses">
<group name="Epic"> <group name="SevenSigns">
<npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" /> <npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" />
<npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" /> <npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" />
</group> </group>

View File

@@ -0,0 +1,252 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
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.Player;
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 final 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, Player player)
{
switch (event)
{
case "ANAKIM_ENTER":
{
if (player.isInParty())
{
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<Player> 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 (Player 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<Player> 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 (Player 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) && 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) && 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, Player 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();
}
}

View File

@@ -95,7 +95,7 @@
<npc id="25932" x="127644" y="114568" z="-3520" heading="46378" dbSave="true" dbName="Katuba" respawnTime="22hour" respawnRandom="0hour" /> <npc id="25932" x="127644" y="114568" z="-3520" heading="46378" dbSave="true" dbName="Katuba" respawnTime="22hour" respawnRandom="0hour" />
<npc id="25948" x="26625" y="183245" z="-3415" heading="5000" dbSave="true" dbName="Beoro" respawnTime="11hour" respawnRandom="0hour" /> <npc id="25948" x="26625" y="183245" z="-3415" heading="5000" dbSave="true" dbName="Beoro" respawnTime="11hour" respawnRandom="0hour" />
</group> </group>
<group name="Epic"> <group name="SevenSigns">
<npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" /> <npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" />
<npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" /> <npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" />
</group> </group>

View File

@@ -0,0 +1,252 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
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.Player;
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 final 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, Player player)
{
switch (event)
{
case "ANAKIM_ENTER":
{
if (player.isInParty())
{
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<Player> 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 (Player 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<Player> 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 (Player 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) && 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) && 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, Player 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();
}
}

View File

@@ -95,7 +95,7 @@
<npc id="25932" x="127644" y="114568" z="-3520" heading="46378" dbSave="true" dbName="Katuba" respawnTime="22hour" respawnRandom="0hour" /> <npc id="25932" x="127644" y="114568" z="-3520" heading="46378" dbSave="true" dbName="Katuba" respawnTime="22hour" respawnRandom="0hour" />
<npc id="25948" x="26625" y="183245" z="-3415" heading="5000" dbSave="true" dbName="Beoro" respawnTime="11hour" respawnRandom="0hour" /> <npc id="25948" x="26625" y="183245" z="-3415" heading="5000" dbSave="true" dbName="Beoro" respawnTime="11hour" respawnRandom="0hour" />
</group> </group>
<group name="Epic"> <group name="SevenSigns">
<npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" /> <npc id="25283" x="185059" y="-9610" z="-5488" heading="15640" dbSave="true" dbName="Lilith" respawnPattern="0 19 * * 1 | 0 19 * * 4" />
<npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" /> <npc id="25286" x="-6675" y="18505" z="-5488" heading="16550" dbSave="true" dbName="Anakim" respawnPattern="0 19 * * 2 | 0 19 * * 5" />
</group> </group>