/*
* 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.Q00456_DontKnowDontCare;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.l2jserver.gameserver.datatables.ItemTable;
import com.l2jserver.gameserver.enums.QuestSound;
import com.l2jserver.gameserver.enums.QuestType;
import com.l2jserver.gameserver.model.AggroInfo;
import com.l2jserver.gameserver.model.L2CommandChannel;
import com.l2jserver.gameserver.model.actor.L2Attackable;
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.items.L2Item;
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.network.NpcStringId;
import com.l2jserver.gameserver.network.clientpackets.Say2;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;
import com.l2jserver.gameserver.util.Util;
/**
* Don't Know, Don't Care (456)
* @author lion, ivantotov, jurchiks
*/
public final class Q00456_DontKnowDontCare extends Quest
{
// NPCs
// @formatter:off
private static final int[] SEPARATED_SOUL =
{
32864, 32865, 32866, 32867, 32868, 32869, 32870, 32891
};
// @formatter:on
private static final int DRAKE_LORD_CORPSE = 32884;
private static final int BEHEMOTH_LEADER_CORPSE = 32885;
private static final int DRAGON_BEAST_CORPSE = 32886;
// Items
private static final int DRAKE_LORD_ESSENCE = 17251;
private static final int BEHEMOTH_LEADER_ESSENCE = 17252;
private static final int DRAGON_BEAST_ESSENCE = 17253;
// Misc
private static final int MIN_PLAYERS = 18;
private static final int MIN_LEVEL = 80;
private static final Map MONSTER_NPCS = new HashMap<>();
private static final Map MONSTER_ESSENCES = new HashMap<>();
static
{
MONSTER_NPCS.put(25725, DRAKE_LORD_CORPSE);
MONSTER_NPCS.put(25726, BEHEMOTH_LEADER_CORPSE);
MONSTER_NPCS.put(25727, DRAGON_BEAST_CORPSE);
MONSTER_ESSENCES.put(DRAKE_LORD_CORPSE, DRAKE_LORD_ESSENCE);
MONSTER_ESSENCES.put(BEHEMOTH_LEADER_CORPSE, BEHEMOTH_LEADER_ESSENCE);
MONSTER_ESSENCES.put(DRAGON_BEAST_CORPSE, DRAGON_BEAST_ESSENCE);
}
// Rewards
private static final int[] WEAPONS =
{
15558, // Periel Sword
15559, // Skull Edge
15560, // Vigwik Axe
15561, // Devilish Maul
15562, // Feather Eye Blade
15563, // Octo Claw
15564, // Doubletop Spear
15565, // Rising Star
15566, // Black Visage
15567, // Veniplant Sword
15568, // Skull Carnium Bow
15569, // Gemtail Rapier
15570, // Finale Blade
15571, // Dominion Crossbow
};
private static final int[] ARMOR =
{
15743, // Sealed Vorpal Helmet
15746, // Sealed Vorpal Breastplate
15749, // Sealed Vorpal Gaiters
15752, // Sealed Vorpal Gauntlets
15755, // Sealed Vorpal Boots
15758, // Sealed Vorpal Shield
15744, // Sealed Vorpal Leather Helmet
15747, // Sealed Vorpal Leather Breastplate
15750, // Sealed Vorpal Leather Leggings
15753, // Sealed Vorpal Leather Gloves
15756, // Sealed Vorpal Leather Boots
15745, // Sealed Vorpal Circlet
15748, // Sealed Vorpal Tunic
15751, // Sealed Vorpal Stockings
15754, // Sealed Vorpal Gloves
15757, // Sealed Vorpal Shoes
15759, // Sealed Vorpal Sigil
};
private static final int[] ACCESSORIES =
{
15763, // Sealed Vorpal Ring
15764, // Sealed Vorpal Earring
15765, // Sealed Vorpal Necklace
};
private static final int[] ATTRIBUTE_CRYSTALS =
{
9552, // Fire Crystal
9553, // Water Crystal
9554, // Earth Crystal
9555, // Wind Crystal
9556, // Dark Crystal
9557, // Holy Crystal
};
private static final int BLESSED_SCROLL_ENCHANT_WEAPON_S = 6577;
private static final int BLESSED_SCROLL_ENCHANT_ARMOR_S = 6578;
private static final int SCROLL_ENCHANT_WEAPON_S = 959;
private static final int GEMSTONE_S = 2134;
private final Map> allowedPlayerMap = new HashMap<>();
public Q00456_DontKnowDontCare()
{
super(456, Q00456_DontKnowDontCare.class.getSimpleName(), "Don't Know, Don't Care");
addStartNpc(SEPARATED_SOUL);
addTalkId(SEPARATED_SOUL);
addFirstTalkId(DRAKE_LORD_CORPSE, BEHEMOTH_LEADER_CORPSE, DRAGON_BEAST_CORPSE);
addTalkId(DRAKE_LORD_CORPSE, BEHEMOTH_LEADER_CORPSE, DRAGON_BEAST_CORPSE);
addKillId(MONSTER_NPCS.keySet());
registerQuestItems(DRAKE_LORD_ESSENCE, BEHEMOTH_LEADER_ESSENCE, DRAGON_BEAST_ESSENCE);
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
final Set allowedPlayers = allowedPlayerMap.get(npc.getObjectId());
if ((qs == null) || !qs.isCond(1) || (allowedPlayers == null) || !allowedPlayers.contains(player.getObjectId()))
{
return npc.getId() + "-02.html";
}
final int essence = MONSTER_ESSENCES.get(npc.getId());
final String htmltext;
if (hasQuestItems(player, essence))
{
htmltext = npc.getId() + "-03.html";
}
else
{
giveItems(player, essence, 1);
htmltext = npc.getId() + "-01.html";
if (hasQuestItems(player, getRegisteredItemIds()))
{
qs.setCond(2, true);
}
else
{
playSound(player, QuestSound.ITEMSOUND_QUEST_ITEMGET);
}
}
return htmltext;
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs == null)
{
return htmltext;
}
if (Util.contains(SEPARATED_SOUL, npc.getId()))
{
switch (qs.getState())
{
case State.COMPLETED:
if (!qs.isNowAvailable())
{
htmltext = "32864-02.html";
break;
}
qs.setState(State.CREATED);
// intentional fall-through
case State.CREATED:
htmltext = ((player.getLevel() >= MIN_LEVEL) ? "32864-01.htm" : "32864-03.html");
break;
case State.STARTED:
switch (qs.getCond())
{
case 1:
{
htmltext = (hasAtLeastOneQuestItem(player, getRegisteredItemIds()) ? "32864-09.html" : "32864-08.html");
break;
}
case 2:
{
if (hasQuestItems(player, getRegisteredItemIds()))
{
rewardPlayer(player, npc);
qs.exitQuest(QuestType.DAILY, true);
htmltext = "32864-10.html";
}
break;
}
}
break;
}
}
return htmltext;
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
String htmltext = null;
switch (event)
{
case "32864-04.htm":
case "32864-05.htm":
case "32864-06.htm":
if ((qs != null) && qs.isCreated())
{
htmltext = event;
}
break;
case "32864-07.htm":
if ((qs != null) && qs.isCreated())
{
qs.startQuest();
htmltext = event;
}
break;
case "unspawnRaidCorpse":
allowedPlayerMap.remove(npc.getObjectId());
npc.deleteMe();
break;
}
return htmltext;
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
if (!killer.isInParty() || !killer.getParty().isInCommandChannel())
{
// only the killing cc gets the quest
return super.onKill(npc, killer, isSummon);
}
final L2CommandChannel cc = killer.getParty().getCommandChannel();
if (cc.getMemberCount() < MIN_PLAYERS)
{
return super.onKill(npc, killer, isSummon);
}
Map playerList = ((L2Attackable) npc).getAggroList();
Set allowedPlayers = new HashSet<>();
for (AggroInfo aggro : playerList.values())
{
if ((aggro.getAttacker() == null) || !aggro.getAttacker().isPlayer())
{
continue;
}
L2PcInstance attacker = aggro.getAttacker().getActingPlayer();
if (attacker.isInParty() //
&& attacker.getParty().isInCommandChannel() //
&& attacker.getParty().getCommandChannel().equals(cc) // only players from the same cc are allowed
&& Util.checkIfInRange(1500, npc, attacker, true))
{
allowedPlayers.add(attacker.getObjectId());
}
}
if (!allowedPlayers.isEmpty())
{
// This depends on the boss respawn delay being at least 5 minutes.
final L2Npc spawned = addSpawn(MONSTER_NPCS.get(npc.getId()), npc, true, 0);
allowedPlayerMap.put(spawned.getObjectId(), allowedPlayers);
startQuestTimer("unspawnRaidCorpse", 300000, npc, null);
}
return super.onKill(npc, killer, isSummon);
}
private static void rewardPlayer(L2PcInstance player, L2Npc npc)
{
int chance = getRandom(10000);
final int reward;
int count = 1;
if (chance < 170)
{
reward = ARMOR[getRandom(ARMOR.length)];
}
else if (chance < 200)
{
reward = ACCESSORIES[getRandom(ACCESSORIES.length)];
}
else if (chance < 270)
{
reward = WEAPONS[getRandom(WEAPONS.length)];
}
else if (chance < 325)
{
reward = BLESSED_SCROLL_ENCHANT_WEAPON_S;
}
else if (chance < 425)
{
reward = BLESSED_SCROLL_ENCHANT_ARMOR_S;
}
else if (chance < 925)
{
reward = ATTRIBUTE_CRYSTALS[getRandom(ATTRIBUTE_CRYSTALS.length)];
}
else if (chance < 1100)
{
reward = SCROLL_ENCHANT_WEAPON_S;
}
else
{
reward = GEMSTONE_S;
count = 3;
}
giveItems(player, reward, count);
L2Item item = ItemTable.getInstance().getTemplate(reward);
NpcSay packet = new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.S1_RECEIVED_A_S2_ITEM_AS_A_REWARD_FROM_THE_SEPARATED_SOUL);
packet.addStringParameter(player.getName());
packet.addStringParameter(item.getName());
npc.broadcastPacket(packet);
}
}