/*
 * 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 .
 */
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 instanceWorlds = new HashMap<>();
	
	public static class InstanceHolder
	{
		List 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();
			this.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 = "Odd Globe:
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.";
		}
		return htmltext;
	}
	
	public static void main(String[] args)
	{
		new MonasteryOfSilence2();
	}
}