l2j_mobius/trunk/dist/game/data/scripts/instances/MonasteryOfSilence2/MonasteryOfSilence2.java
2015-05-20 09:23:41 +00:00

538 lines
16 KiB
Java

/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack 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.
*
* L2J DataPack 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.MonasteryOfSilence2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
import quests.Q10295_SevenSignsSolinasTomb.Q10295_SevenSignsSolinasTomb;
import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
import ai.npc.AbstractNpcAI;
import com.l2jserver.gameserver.ai.CtrlIntention;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.enums.ChatType;
import com.l2jserver.gameserver.instancemanager.InstanceManager;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.entity.Instance;
import com.l2jserver.gameserver.model.instancezone.InstanceWorld;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.model.quest.State;
import com.l2jserver.gameserver.network.NpcStringId;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
public class MonasteryOfSilence2 extends AbstractNpcAI
{
// Values
private static final int INSTANCE_ID = 151;
// NPC's
private static final int OddGlobe = 32815;
private static final int Elcadia_First_Room = 32787;
private static final int Elcadia_Support = 32785;
private static final int ErissEvilThoughts = 32792;
private static final int SolinasEvilThoughts = 32793;
private static final int RelicGuardian = 32803;
private static final int WestRelicWatcher = 32804;
private static final int NorthRelicWatcher = 32805;
private static final int EastRelicWatcher = 32806;
private static final int SouthRelicWatcher = 32807;
private static final int EtisVanEtina = 32808;
private static final int WestTeleportControlDevice = 32816;
private static final int NorthTeleportControlDevice = 32817;
private static final int EastTeleportControlDevice = 32818;
private static final int SouthTeleportControlDevice = 32819;
private static final int JudeVanEtinasEvilThoughts = 32888;
private static final int TeleportControlDevice1 = 32837;
private static final int TeleportControlDevice2 = 32842;
private static final int TombOfTheSaintess = 32843;
private static final int AltarOfHallows_Staff = 32857;
private static final int AltarOfHallows_Sword = 32858;
private static final int AltarOfHallows_Scroll = 32859;
private static final int AltarOfHallows_Shield = 32860;
// Teleport's
private static final int ENTER = 0;
private static final int HOLYGRAL = 1;
private static final int EXIT = 2;
private static final int TW = 3;
private static final int TN = 4;
private static final int TE = 5;
private static final int TS = 6;
private static final int RTE = 7;
private static final int RTG = 8;
private static final int ENTER1 = 9;
private static final int MTS = 10;
private static final int MTS2 = 11;
private static final int EE = 12;
private static final int[][] TELEPORTS =
{
{
120664,
-86968,
-3392
}, // Enter
{
85937,
-249618,
-8320
}, // HolyBurailOpen
{
115944,
-86952,
-3392
}, // ExitInstance
{
82434,
-249546,
-8320
}, // TeleWest
{
85691,
-252426,
-8320
}, // TeleNorth
{
88573,
-249556,
-8320
}, // TeleEast
{
85675,
-246630,
-8320
}, // TeleSouth
{
120727,
-86868,
-3392
}, // ReturnToEris
{
85937,
-249618,
-8320
}, // ReturnToGuardian
{
45545,
-249423,
-6760
}, // Enter1
{
56033,
-252944,
-6760
}, // MoveToSaintness
{
55955,
-250394,
-6760
}, // MoveToSaintness2
{
76707,
-241022,
-10832
}
// EtisEtina
};
private static final int[] TALK =
{
OddGlobe,
Elcadia_Support,
WestTeleportControlDevice,
NorthTeleportControlDevice,
EastTeleportControlDevice,
SouthTeleportControlDevice,
RelicGuardian,
WestRelicWatcher,
NorthRelicWatcher,
EastRelicWatcher,
SouthRelicWatcher,
ErissEvilThoughts,
EtisVanEtina,
JudeVanEtinasEvilThoughts,
SolinasEvilThoughts,
TeleportControlDevice1,
TeleportControlDevice2,
TombOfTheSaintess,
AltarOfHallows_Staff,
AltarOfHallows_Sword,
AltarOfHallows_Scroll,
AltarOfHallows_Shield
};
private static final int[] MageBuff =
{
6725,
6721,
6722,
6717
};
private static final int[] FighterBuff =
{
6714,
6715,
6716,
6717
};
private final HashMap<Integer, InstanceHolder> instanceWorlds = new HashMap<>();
public static class InstanceHolder
{
List<L2Npc> mobs = new ArrayList<>();
}
private class MoSWorld2 extends InstanceWorld
{
public MoSWorld2()
{
}
}
public MonasteryOfSilence2()
{
super(MonasteryOfSilence2.class.getSimpleName(), "instances");
addStartNpc(OddGlobe);
addStartNpc(WestTeleportControlDevice);
addStartNpc(NorthTeleportControlDevice);
addStartNpc(EastTeleportControlDevice);
addStartNpc(SouthTeleportControlDevice);
for (int NPC : TALK)
{
addTalkId(NPC);
}
}
private void teleportPlayer(L2Npc npc, L2PcInstance player, int[] coords, int instanceId)
{
for (L2Character cha : player.getKnownList().getKnownCharacters())
{
if (cha.isNpc() && ((((L2Npc) cha).getId() == Elcadia_Support) || (((L2Npc) cha).getId() == Elcadia_First_Room)))
{
cha.deleteMe();
}
}
InstanceHolder holder = instanceWorlds.get(instanceId);
if ((holder == null) && (instanceId > 0))
{
holder = new InstanceHolder();
instanceWorlds.put(Integer.valueOf(instanceId), holder);
}
player.stopAllEffectsExceptThoseThatLastThroughDeath();
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.setInstanceId(instanceId);
player.teleToLocation(coords[0], coords[1], coords[2], false);
cancelQuestTimer("check_follow", npc, player);
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
if ((holder != null) && (instanceId > 0))
{
L2Npc support = addSpawn(Elcadia_Support, player.getX(), player.getY(), player.getZ(), 0, false, 0L, false, player.getInstanceId());
holder.mobs.add(support);
startQuestTimer("check_follow", 3000, support, player);
}
}
protected void enterInstance(L2Npc npc, L2PcInstance player)
{
InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player);
if (world != null)
{
if (!(world instanceof MoSWorld2))
{
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANT_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON));
return;
}
Instance inst = InstanceManager.getInstance().getInstance(world.getInstanceId());
if (inst != null)
{
teleportPlayer(npc, player, TELEPORTS[ENTER], world.getInstanceId());
}
return;
}
final int instanceId = InstanceManager.getInstance().createDynamicInstance("MonasteryOfSilence.xml");
world = new MoSWorld2();
world.setInstanceId(instanceId);
world.setTemplateId(INSTANCE_ID);
world.setStatus(0);
InstanceManager.getInstance().addWorld(world);
world.addAllowed(player.getObjectId());
teleportPlayer(npc, player, TELEPORTS[ENTER], instanceId);
return;
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
String htmltext = getNoQuestMsg(player);
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
QuestState qs = player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
QuestState qs1 = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
if (st == null)
{
st = newQuestState(player);
}
if ("check_follow".equals(event))
{
cancelQuestTimer("check_follow", npc, player);
npc.getAI().stopFollow();
npc.setIsRunning(true);
npc.getAI().startFollow(player);
if ((qs != null) && (qs.getCond() == 2))
{
if (getRandom(10) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK));
}
else
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU));
}
}
if ((qs != null) && (qs.getCond() == 3))
{
if (getRandom(8) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.YOUR_WORK_HERE_IS_DONE_SO_RETURN_TO_THE_CENTRAL_GUARDIAN));
}
}
if ((qs1 != null) && (qs1.getCond() == 1))
{
if (getRandom(5) < 1)
{
if (getRandom(10) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.TO_REMOVE_THE_BARRIER_YOU_MUST_FIND_THE_RELICS_THAT_FIT_THE_BARRIER_AND_ACTIVATE_THE_DEVICE));
}
else if (getRandom(15) < 1)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.THE_GUARDIAN_OF_THE_SEAL_DOESN_T_SEEM_TO_GET_INJURED_AT_ALL_UNTIL_THE_BARRIER_IS_DESTROYED));
}
else
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.THE_DEVICE_LOCATED_IN_THE_ROOM_IN_FRONT_OF_THE_GUARDIAN_OF_THE_SEAL_IS_DEFINITELY_THE_BARRIER_THAT_CONTROLS_THE_GUARDIAN_S_POWER));
}
}
}
if (player.getCurrentHp() < (player.getMaxHp() * 0.8D))
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6724, 1));
}
if (player.getCurrentMp() < (player.getMaxMp() * 0.5D))
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6728, 1));
}
startQuestTimer("check_follow", 20000, npc, player);
return "";
}
else if ("enter".equals(event))
{
enterInstance(npc, player);
return null;
}
if (npc.getId() == ErissEvilThoughts)
{
if ("Enter1".equals(event))
{
if (qs1.getInt("seal_removed") != 1)
{
qs1.startQuestTimer("StartMovie", 1000);
teleportPlayer(npc, player, TELEPORTS[ENTER1], player.getInstanceId());
}
else
{
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
}
return null;
}
if ("Enter3".equals(event))
{
if ((qs.getInt("book_" + 32821) + qs.getInt("book_" + 32828) + qs.getInt("book_" + 32831) + qs.getInt("book_" + 32834)) != 4)
{
qs.startQuestTimer("OpenMovie", 4000);
}
teleportPlayer(npc, player, TELEPORTS[HOLYGRAL], player.getInstanceId());
return null;
}
else if ("video".equals(event))
{
player.showQuestMovie(29);
startQuestTimer("teleport", 60000, npc, player);
cancelQuestTimer("check_follow", npc, player);
InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
return null;
}
else if ("teleport".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[EE], player.getInstanceId());
return null;
}
}
else if ("buff".equals(event))
{
if (player.isMageClass())
{
for (int h : MageBuff)
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
}
}
else
{
for (int h : FighterBuff)
{
npc.setTarget(player);
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
}
}
return null;
}
else if ("Exit".equals(event))
{
cancelQuestTimer("check_follow", npc, player);
InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
if (holder != null)
{
for (L2Npc h : holder.mobs)
{
h.deleteMe();
}
holder.mobs.clear();
}
teleportPlayer(npc, player, TELEPORTS[EXIT], 0);
return null;
}
else if ("TeleWest".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TW], player.getInstanceId());
return null;
}
else if (event.equalsIgnoreCase("TeleNorth"))
{
teleportPlayer(npc, player, TELEPORTS[TN], player.getInstanceId());
return null;
}
else if ("TeleEast".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TE], player.getInstanceId());
return null;
}
else if ("TeleSouth".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[TS], player.getInstanceId());
return null;
}
else if ("ReturnToEris".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[RTE], player.getInstanceId());
return null;
}
else if ("ReturnToGuardian".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[RTG], player.getInstanceId());
return null;
}
else if ("MoveToSaintess".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[MTS], player.getInstanceId());
return null;
}
else if ("MoveToSaintess2".equals(event))
{
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
return null;
}
return htmltext;
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
String htmltext = getNoQuestMsg(player);
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
if (st == null)
{
st = newQuestState(player);
}
int npcId = npc.getId();
if (npcId == OddGlobe)
{
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.STARTED))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) == null))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() != State.COMPLETED))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) == null))
{
enterInstance(npc, player);
return null;
}
if ((player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) != null) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()).getState() != State.COMPLETED))
{
enterInstance(npc, player);
return null;
}
htmltext = "<html><body>Odd Globe:<br>The huge mechanism in the form of the globe. Around silent cottons are heard and in air presence of any unknown energy, which which in a way doesn't come under to your influence is felt.</body></html>";
}
return htmltext;
}
public static void main(String[] args)
{
new MonasteryOfSilence2();
}
}