/*
* 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 quests.Q00501_ProofOfClanAlliance;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.l2jserver.gameserver.model.L2Clan;
import com.l2jserver.gameserver.model.Location;
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.holders.SkillHolder;
import com.l2jserver.gameserver.model.itemcontainer.Inventory;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.model.quest.State;
import com.l2jserver.gameserver.model.skills.AbnormalType;
import com.l2jserver.gameserver.network.NpcStringId;
import com.l2jserver.gameserver.network.clientpackets.Say2;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;
import com.l2jserver.gameserver.util.Util;
/**
* Proof of Clan Alliance (501)
* @author Zoey76
*/
public final class Q00501_ProofOfClanAlliance extends Quest
{
// NPCs
private static final int SIR_KRISTOF_RODEMAI = 30756;
private static final int STATUE_OF_OFFERING = 30757;
private static final int ATHREA = 30758;
private static final int KALIS = 30759;
// Monsters
private static final int OEL_MAHUM_WITCH_DOCTOR = 20576;
private static final int HARIT_LIZARDMAN_SHAMAN = 20644;
private static final int VANOR_SILENOS_SHAMAN = 20685;
private static final int BOX_OF_ATHREA_1 = 27173;
private static final int BOX_OF_ATHREA_2 = 27174;
private static final int BOX_OF_ATHREA_3 = 27175;
private static final int BOX_OF_ATHREA_4 = 27176;
private static final int BOX_OF_ATHREA_5 = 27177;
// Items
private static final int HERB_OF_HARIT = 3832;
private static final int HERB_OF_VANOR = 3833;
private static final int HERB_OF_OEL_MAHUM = 3834;
private static final int BLOOD_OF_EVA = 3835;
private static final int ATHREAS_COIN = 3836;
private static final int SYMBOL_OF_LOYALTY = 3837;
private static final int ANTIDOTE_RECIPE_LIST = 3872;
private static final int VOUCHER_OF_FAITH = 3873;
private static final int ALLIANCE_MANIFESTO = 3874;
private static final int POTION_OF_RECOVERY = 3889;
// Skills
private static final SkillHolder POISON_OF_DEATH = new SkillHolder(4082, 1);
private static final SkillHolder DIE_YOU_FOOL = new SkillHolder(4083, 1);
// Locations
// @formatter:off
private static final List LOCS = Arrays.asList(
new Location(102273, 103433, -3512),
new Location(102190, 103379, -3524),
new Location(102107, 103325, -3533),
new Location(102024, 103271, -3500),
new Location(102327, 103350, -3511),
new Location(102244, 103296, -3518),
new Location(102161, 103242, -3529),
new Location(102078, 103188, -3500),
new Location(102381, 103267, -3538),
new Location(102298, 103213, -3532),
new Location(102215, 103159, -3520),
new Location(102132, 103105, -3513),
new Location(102435, 103184, -3515),
new Location(102352, 103130, -3522),
new Location(102269, 103076, -3533),
new Location(102186, 103022, -3541));
// @formatter:on
// Misc
private static final int CLAN_MIN_LEVEL = 3;
private static final int CLAN_MEMBER_MIN_LEVEL = 40;
private static final int ADENA_TO_RESTART_GAME = 10000;
public Q00501_ProofOfClanAlliance()
{
super(501, Q00501_ProofOfClanAlliance.class.getSimpleName(), "Proof of Clan Alliance");
addStartNpc(SIR_KRISTOF_RODEMAI, STATUE_OF_OFFERING);
addTalkId(SIR_KRISTOF_RODEMAI, STATUE_OF_OFFERING, ATHREA, KALIS);
addKillId(OEL_MAHUM_WITCH_DOCTOR, HARIT_LIZARDMAN_SHAMAN, VANOR_SILENOS_SHAMAN, BOX_OF_ATHREA_1, BOX_OF_ATHREA_2, BOX_OF_ATHREA_3, BOX_OF_ATHREA_4, BOX_OF_ATHREA_5);
registerQuestItems(ANTIDOTE_RECIPE_LIST, VOUCHER_OF_FAITH, HERB_OF_HARIT, HERB_OF_VANOR, HERB_OF_OEL_MAHUM, BLOOD_OF_EVA, ATHREAS_COIN, SYMBOL_OF_LOYALTY);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30756-06.html":
case "30756-08.html":
case "30757-05.html":
case "30758-02.html":
case "30758-04.html":
case "30759-02.html":
case "30759-04.html":
{
htmltext = event;
break;
}
case "30756-07.html":
{
if (qs.isCreated() && player.isClanLeader() && (player.getClan().getLevel() == CLAN_MIN_LEVEL))
{
qs.startQuest();
qs.setMemoState(1);
htmltext = event;
}
break;
}
case "30757-04.html":
{
if (getRandom(10) > 5)
{
if (qs.getInt("flag") != 2501)
{
giveItems(player, SYMBOL_OF_LOYALTY, 1);
qs.set("flag", 2501);
}
htmltext = event;
}
else
{
npc.setTarget(player);
npc.doCast(DIE_YOU_FOOL.getSkill());
startQuestTimer("SYMBOL_OF_LOYALTY", 4000, npc, player);
htmltext = "30757-03.html";
}
break;
}
case "30758-03.html":
{
final QuestState lqs = getLeaderQuestState(player, getName());
if (lqs != null)
{
if (npc.getSummonedNpcCount() < 4)
{
lqs.setMemoState(4);
lqs.set("flag", 0);
npc.setScriptValue(0);
for (Location loc : LOCS)
{
final L2Npc box = addSpawn(npc, getRandom(BOX_OF_ATHREA_1, BOX_OF_ATHREA_5), loc, false, 300000);
box.disableCoreAI(true);
box.setIsNoRndWalk(true);
}
htmltext = event;
}
else
{
htmltext = "30758-03a.html";
}
}
break;
}
case "30758-07.html":
{
if (player.getAdena() >= ADENA_TO_RESTART_GAME)
{
if (npc.getSummonedNpcCount() < 4)
{
takeItems(player, Inventory.ADENA_ID, ADENA_TO_RESTART_GAME);
}
htmltext = event;
}
else
{
htmltext = "30758-06.html";
}
break;
}
case "30759-03.html":
{
if (qs.isMemoState(1))
{
qs.setCond(2, true);
qs.setMemoState(2);
htmltext = event;
}
break;
}
case "30759-07.html":
{
if (qs.isMemoState(2) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3))
{
takeItems(player, SYMBOL_OF_LOYALTY, -1);
giveItems(player, ANTIDOTE_RECIPE_LIST, 1);
npc.setTarget(player);
npc.doCast(POISON_OF_DEATH.getSkill());
qs.setCond(3, true);
qs.setMemoState(3);
htmltext = event;
}
break;
}
case "SYMBOL_OF_LOYALTY":
{
if (player.isDead() && (qs.getInt("flag") != 2501))
{
giveItems(player, SYMBOL_OF_LOYALTY, 1);
qs.set("flag", 2501);
}
break;
}
}
return htmltext;
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
final QuestState qs = getRandomPartyMemberState(killer, -1, 3, npc);
if (qs == null)
{
return super.onKill(npc, killer, isSummon);
}
final L2PcInstance player = qs.getPlayer();
final QuestState lqs = getLeaderQuestState(player, getName());
if (lqs != null)
{
switch (npc.getId())
{
case OEL_MAHUM_WITCH_DOCTOR:
{
if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
{
giveItemRandomly(player, npc, HERB_OF_OEL_MAHUM, 1, 0, 1.0, true);
}
break;
}
case HARIT_LIZARDMAN_SHAMAN:
{
if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
{
giveItemRandomly(player, npc, HERB_OF_HARIT, 1, 0, 1.0, true);
}
break;
}
case VANOR_SILENOS_SHAMAN:
{
if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
{
giveItemRandomly(player, npc, HERB_OF_VANOR, 1, 0, 1.0, true);
}
break;
}
case BOX_OF_ATHREA_1:
case BOX_OF_ATHREA_2:
case BOX_OF_ATHREA_3:
case BOX_OF_ATHREA_4:
case BOX_OF_ATHREA_5:
{
final L2Character summoner = npc.getSummoner();
if ((summoner != null) && summoner.isNpc() && lqs.isMemoState(4))
{
final L2Npc arthea = (L2Npc) summoner;
if ((lqs.getInt("flag") == 3) && arthea.isScriptValue(15))
{
lqs.set("flag", lqs.getInt("flag") + 1);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
}
else if ((lqs.getInt("flag") == 2) && arthea.isScriptValue(14))
{
lqs.set("flag", lqs.getInt("flag") + 1);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
}
else if ((lqs.getInt("flag") == 1) && arthea.isScriptValue(13))
{
lqs.set("flag", lqs.getInt("flag") + 1);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
}
else if ((lqs.getInt("flag") == 0) && arthea.isScriptValue(12))
{
lqs.set("flag", lqs.getInt("flag") + 1);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
}
else if (lqs.getInt("flag") < 4)
{
if (getRandom(4) == 0)
{
lqs.set("flag", lqs.getInt("flag") + 1);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
}
}
arthea.setScriptValue(arthea.getScriptValue() + 1);
}
break;
}
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, true);
final QuestState lqs = getLeaderQuestState(player, getName());
String htmltext = getNoQuestMsg(player);
switch (npc.getId())
{
case SIR_KRISTOF_RODEMAI:
{
switch (qs.getState())
{
case State.CREATED:
{
if (player.isClanLeader())
{
final L2Clan clan = player.getClan();
if (clan.getLevel() < CLAN_MIN_LEVEL)
{
htmltext = "30756-01.html";
}
else if (clan.getLevel() == CLAN_MIN_LEVEL)
{
if (hasQuestItems(player, ALLIANCE_MANIFESTO))
{
htmltext = "30756-03.html";
}
else
{
htmltext = "30756-04.html";
}
}
else
{
htmltext = "30756-02.html";
}
}
else
{
htmltext = "30756-05.html";
}
break;
}
case State.STARTED:
{
if (qs.isMemoState(6) && hasQuestItems(player, VOUCHER_OF_FAITH))
{
takeItems(player, VOUCHER_OF_FAITH, -1);
giveItems(player, ALLIANCE_MANIFESTO, 1);
addExpAndSp(player, 0, 120000);
qs.exitQuest(false);
htmltext = "30756-09.html";
}
else
{
htmltext = "30756-10.html";
}
break;
}
}
break;
}
case STATUE_OF_OFFERING:
{
if ((lqs != null) && lqs.isMemoState(2))
{
if (!player.isClanLeader())
{
if (player.getLevel() >= CLAN_MEMBER_MIN_LEVEL)
{
htmltext = (qs.getInt("flag") != 2501) ? "30757-01.html" : "30757-01b.html";
}
else
{
htmltext = "30757-02.html";
}
}
else
{
htmltext = "30757-01a.html";
}
}
else
{
htmltext = "30757-06.html";
}
break;
}
case ATHREA:
{
if (lqs != null)
{
switch (lqs.getMemoState())
{
case 3:
{
if (hasQuestItems(lqs.getPlayer(), ANTIDOTE_RECIPE_LIST) && !hasQuestItems(lqs.getPlayer(), BLOOD_OF_EVA))
{
lqs.set("flag", 0);
htmltext = "30758-01.html";
}
break;
}
case 4:
{
if (lqs.getInt("flag") < 4)
{
htmltext = "30758-05.html";
}
else
{
giveItems(player, BLOOD_OF_EVA, 1);
lqs.setMemoState(5);
htmltext = "30758-08.html";
}
break;
}
case 5:
{
htmltext = "30758-09.html";
break;
}
}
}
break;
}
case KALIS:
{
if (qs.isMemoState(1) && !hasQuestItems(player, SYMBOL_OF_LOYALTY))
{
htmltext = "30759-01.html";
}
else if (qs.isMemoState(2) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) < 3))
{
htmltext = "30759-05.html";
}
else if ((getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3) && !hasAbnormal(player))
{
htmltext = "30759-06.html";
}
else if (qs.isMemoState(5) && hasQuestItems(player, BLOOD_OF_EVA) && hasQuestItems(player, HERB_OF_VANOR) && hasQuestItems(player, HERB_OF_HARIT) && hasQuestItems(player, HERB_OF_OEL_MAHUM) && hasAbnormal(player))
{
giveItems(player, VOUCHER_OF_FAITH, 1);
giveItems(player, POTION_OF_RECOVERY, 1);
takeItems(player, BLOOD_OF_EVA, -1);
takeItems(player, ANTIDOTE_RECIPE_LIST, -1);
takeItems(player, HERB_OF_OEL_MAHUM, -1);
takeItems(player, HERB_OF_HARIT, -1);
takeItems(player, HERB_OF_VANOR, -1);
qs.setCond(4, true);
qs.setMemoState(6);
htmltext = "30759-08.html";
}
else if ((qs.isMemoState(3) || qs.isMemoState(4) || qs.isMemoState(5)) && !hasAbnormal(player))
{
takeItems(player, ANTIDOTE_RECIPE_LIST, -1);
qs.setMemoState(1);
htmltext = "30759-09.html";
}
else if ((qs.getMemoState() < 6) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3) && !hasAtLeastOneQuestItem(player, BLOOD_OF_EVA, HERB_OF_VANOR, HERB_OF_HARIT, HERB_OF_OEL_MAHUM) && hasAbnormal(player))
{
htmltext = "30759-10.html";
}
else if (qs.isMemoState(6))
{
htmltext = "30759-11.html";
}
else if ((lqs != null) && !player.isClanLeader())
{
htmltext = "30759-12.html";
}
break;
}
}
return htmltext;
}
/**
* Verifies if the player has the poison.
* @param player the player to check
* @return {@code true} if the player has {@link AbnormalType#FATAL_POISON} abnormal
*/
private static boolean hasAbnormal(L2PcInstance player)
{
return player.getEffectList().getBuffInfoByAbnormalType(AbnormalType.FATAL_POISON) != null;
}
/**
* Gets the clan leader's quest state.
* @param player the player
* @param quest the quest name
* @return the clan leader's quest state
*/
private static QuestState getLeaderQuestState(L2PcInstance player, String quest)
{
if (player.getClan() != null)
{
final L2PcInstance leader = player.getClan().getLeader().getPlayerInstance();
if (leader != null)
{
return leader.getQuestState(quest);
}
}
return null;
}
@Override
public QuestState getRandomPartyMemberState(L2PcInstance player, int condition, int playerChance, L2Npc target)
{
if ((player == null) || (playerChance < 1))
{
return null;
}
QuestState qs = getQuestState(player, false);
if (!player.isInParty())
{
if (!Util.checkIfInRange(1500, player, target, true))
{
return null;
}
return qs;
}
final List candidates = new ArrayList<>();
if ((qs != null) && (playerChance > 0))
{
for (int i = 0; i < playerChance; i++)
{
candidates.add(qs);
}
}
for (L2PcInstance member : player.getParty().getMembers())
{
if (member == player)
{
continue;
}
qs = getQuestState(member, false);
if (qs != null)
{
candidates.add(qs);
}
}
if (candidates.isEmpty())
{
return null;
}
qs = candidates.get(getRandom(candidates.size()));
if (!Util.checkIfInRange(1500, qs.getPlayer(), target, true))
{
return null;
}
return qs;
}
}