/*
* 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.Q00420_LittleWing;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.l2jserver.gameserver.enums.QuestSound;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
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;
/**
* Little Wing (420)
* @author Pandragon
*/
public final class Q00420_LittleWing extends Quest
{
// NPCs
private static final int MARIA = 30608;
private static final int CRONOS = 30610;
private static final int BYRON = 30711;
private static final int MIMYU = 30747;
private static final int EXARION = 30748;
private static final int ZWOV = 30749;
private static final int KALIBRAN = 30750;
private static final int SUZET = 30751;
private static final int SHAMHAI = 30752;
private static final int COOPER = 30829;
// Items
private static final int COAL = 1870;
private static final int CHARCOAL = 1871;
private static final int SILVER_NUGGET = 1873;
private static final int STONE_OF_PURITY = 1875;
private static final int GEMSTONE_D = 2130;
private static final int GEMSTONE_C = 2131;
private static final int FAIRY_DUST = 3499;
private static final int FAIRY_STONE = 3816;
private static final int DELUXE_FAIRY_STONE = 3817;
private static final int FAIRY_STONE_LIST = 3818;
private static final int DELUXE_STONE_LIST = 3819;
private static final int TOAD_SKIN = 3820;
private static final int MONKSHOOD_JUICE = 3821;
private static final int EXARION_SCALE = 3822;
private static final int EXARION_EGG = 3823;
private static final int ZWOV_SCALE = 3824;
private static final int ZWOV_EGG = 3825;
private static final int KALIBRAN_SCALE = 3826;
private static final int KALIBRAN_EGG = 3827;
private static final int SUZET_SCALE = 3828;
private static final int SUZET_EGG = 3829;
private static final int SHAMHAI_SCALE = 3830;
private static final int SHAMHAI_EGG = 3831;
// Monsters
private static final int DEAD_SEEKER = 20202;
private static final int TOAD_LORD = 20231;
private static final int MARSH_SPIDER = 20233;
private static final int BREKA_OVERLORD = 20270;
private static final int ROAD_SCAVENGER = 20551;
private static final int LETO_WARRIOR = 20580;
private static final int[] DELUXE_STONE_BREAKERS =
{
20589, // Fline
20590, // Liele
20591, // Valley Treant
20592, // Satyr
20593, // Unicorn
20594, // Forest Runner
20595, // Fline Elder
20596, // Liele Elder
20597, // Valley Treant Elder
20598, // Satyr Elder
20599, // Unicorn Elder
27185, // Fairy Tree of Wind (Quest Monster)
27186, // Fairy Tree of Star (Quest Monster)
27187, // Fairy Tree of Twilight (Quest Monster)
27188, // Fairy Tree of Abyss (Quest Monster)
27189, // Soul of Tree Guardian (Quest Monster)
};
// Rewards
private static final int DRAGONFLUTE_OF_WIND = 3500;
private static final int DRAGONFLUTE_OF_STAR = 3501;
private static final int DRAGONFLUTE_OF_TWILIGHT = 3502;
private static final int HATCHLING_ARMOR = 3912;
private static final int HATCHLING_FOOD = 4038;
private static final List EGGS = Arrays.asList(EXARION_EGG, SUZET_EGG, KALIBRAN_EGG, SHAMHAI_EGG, ZWOV_EGG);
// Drake Drops
private static final Map EGG_DROPS = new HashMap<>();
{
EGG_DROPS.put(DEAD_SEEKER, SHAMHAI_EGG);
EGG_DROPS.put(MARSH_SPIDER, ZWOV_EGG);
EGG_DROPS.put(BREKA_OVERLORD, SUZET_EGG);
EGG_DROPS.put(ROAD_SCAVENGER, KALIBRAN_EGG);
EGG_DROPS.put(LETO_WARRIOR, EXARION_EGG);
}
// Misc
private static final int MIN_LVL = 35;
public Q00420_LittleWing()
{
super(420, Q00420_LittleWing.class.getSimpleName(), "Little Wing");
addStartNpc(COOPER);
addTalkId(MARIA, CRONOS, BYRON, MIMYU, EXARION, ZWOV, KALIBRAN, SUZET, SHAMHAI, COOPER);
addAttackId(DELUXE_STONE_BREAKERS);
addKillId(TOAD_LORD, DEAD_SEEKER, MARSH_SPIDER, BREKA_OVERLORD, ROAD_SCAVENGER, LETO_WARRIOR);
registerQuestItems(FAIRY_DUST, FAIRY_STONE, DELUXE_FAIRY_STONE, FAIRY_STONE_LIST, DELUXE_STONE_LIST, TOAD_SKIN, MONKSHOOD_JUICE, EXARION_SCALE, EXARION_EGG, ZWOV_SCALE, ZWOV_EGG, KALIBRAN_SCALE, KALIBRAN_EGG, SUZET_SCALE, SUZET_EGG, SHAMHAI_SCALE, SHAMHAI_EGG);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
String htmltext = null;
if (qs == null)
{
return htmltext;
}
switch (event)
{
case "30610-02.html":
case "30610-03.html":
case "30610-04.html":
case "30711-02.html":
case "30747-05.html":
case "30747-06.html":
case "30751-02.html":
{
htmltext = event;
break;
}
case "30829-02.htm":
{
if (qs.isCreated())
{
qs.startQuest();
htmltext = event;
}
break;
}
case "30610-05.html":
{
if (qs.isCond(1))
{
qs.setCond(2, true);
qs.set("old_stone", 0);
qs.set("fairy_stone", 1);
giveItems(player, FAIRY_STONE_LIST, 1);
htmltext = event;
}
break;
}
case "30610-06.html":
{
if (qs.isCond(1))
{
qs.setCond(2, true);
qs.set("old_stone", 0);
qs.set("fairy_stone", 2);
giveItems(player, DELUXE_STONE_LIST, 1);
htmltext = event;
}
break;
}
case "30610-12.html":
{
if (qs.isCond(5))
{
qs.setCond(2, true);
qs.set("old_stone", qs.getInt("fairy_stone"));
qs.set("fairy_stone", 1);
giveItems(player, FAIRY_STONE_LIST, 1);
htmltext = event;
}
break;
}
case "30610-13.html":
{
if (qs.isCond(5))
{
qs.setCond(2, true);
qs.set("old_stone", qs.getInt("fairy_stone"));
qs.set("fairy_stone", 2);
giveItems(player, DELUXE_STONE_LIST, 1);
htmltext = event;
}
break;
}
case "30608-03.html":
{
if (qs.isCond(2))
{
if ((qs.getInt("fairy_stone") == 1) && (getQuestItemsCount(player, COAL) >= 10) && (getQuestItemsCount(player, CHARCOAL) >= 10) && (getQuestItemsCount(player, GEMSTONE_D) >= 1) && (getQuestItemsCount(player, SILVER_NUGGET) >= 3) && (getQuestItemsCount(player, TOAD_SKIN) >= 10))
{
takeItems(player, FAIRY_STONE_LIST, -1);
takeItems(player, COAL, 10);
takeItems(player, CHARCOAL, 10);
takeItems(player, GEMSTONE_D, 1);
takeItems(player, SILVER_NUGGET, 3);
takeItems(player, TOAD_SKIN, -1);
giveItems(player, FAIRY_STONE, 1);
}
qs.setCond(3, true);
htmltext = event;
}
break;
}
case "30608-05.html":
{
if (qs.isCond(2))
{
if ((qs.getInt("fairy_stone") == 2) && (getQuestItemsCount(player, COAL) >= 10) && (getQuestItemsCount(player, CHARCOAL) >= 10) && (getQuestItemsCount(player, GEMSTONE_C) >= 1) && (getQuestItemsCount(player, STONE_OF_PURITY) >= 1) && (getQuestItemsCount(player, SILVER_NUGGET) >= 5) && (getQuestItemsCount(player, TOAD_SKIN) >= 20))
{
takeItems(player, DELUXE_STONE_LIST, -1);
takeItems(player, COAL, 10);
takeItems(player, CHARCOAL, 10);
takeItems(player, GEMSTONE_C, 1);
takeItems(player, STONE_OF_PURITY, 1);
takeItems(player, SILVER_NUGGET, 5);
takeItems(player, TOAD_SKIN, -1);
giveItems(player, DELUXE_FAIRY_STONE, 1);
}
qs.setCond(3, true);
htmltext = event;
}
break;
}
case "30711-03.html":
{
if (qs.isCond(3))
{
qs.setCond(4, true);
if (qs.getInt("fairy_stone") == 2)
{
htmltext = "30711-04.html";
}
else
{
htmltext = event;
}
}
break;
}
case "30747-02.html":
case "30747-04.html":
{
if (qs.isCond(4) && ((getQuestItemsCount(player, FAIRY_STONE) + getQuestItemsCount(player, DELUXE_FAIRY_STONE)) > 0))
{
takeItems(player, -1, FAIRY_STONE, DELUXE_FAIRY_STONE);
if (qs.getInt("fairy_stone") == 2)
{
giveItems(player, FAIRY_DUST, 1);
}
qs.setCond(5, true);
htmltext = event;
}
break;
}
case "30747-07.html":
case "30747-08.html":
{
if (qs.isCond(5) && (getQuestItemsCount(player, MONKSHOOD_JUICE) == 0))
{
giveItems(player, MONKSHOOD_JUICE, 1);
htmltext = event;
}
break;
}
case "30747-12.html":
{
if (qs.isCond(7))
{
if ((qs.getInt("fairy_stone") == 1) || (getQuestItemsCount(player, FAIRY_DUST) == 0))
{
giveReward(player);
qs.exitQuest(true, true);
htmltext = "30747-16.html";
}
else
{
qs.setCond(8, false);
htmltext = event;
}
}
else if (qs.isCond(8))
{
htmltext = event;
}
break;
}
case "30747-13.html":
{
if (qs.isCond(8))
{
giveReward(player);
qs.exitQuest(true, true);
htmltext = event;
}
break;
}
case "30747-15.html":
{
if (qs.isCond(8) && (getQuestItemsCount(player, FAIRY_DUST) > 1))
{
if (getRandom(100) < 5)
{
giveItems(player, HATCHLING_ARMOR, 1);
htmltext = "30747-14.html";
}
else
{
giveItems(player, HATCHLING_FOOD, 20);
htmltext = event;
}
giveReward(player);
takeItems(player, FAIRY_DUST, -1);
qs.exitQuest(true, true);
}
break;
}
case "30748-02.html":
{
if (qs.isCond(5))
{
takeItems(player, MONKSHOOD_JUICE, -1);
giveItems(player, EXARION_SCALE, 1);
qs.setCond(6, true);
qs.set("drake_hunt", LETO_WARRIOR);
htmltext = event;
}
break;
}
case "30749-02.html":
{
if (qs.isCond(5))
{
takeItems(player, MONKSHOOD_JUICE, -1);
giveItems(player, ZWOV_SCALE, 1);
qs.setCond(6, true);
qs.set("drake_hunt", MARSH_SPIDER);
htmltext = event;
}
break;
}
case "30750-02.html":
{
if (qs.isCond(5))
{
takeItems(player, MONKSHOOD_JUICE, -1);
giveItems(player, KALIBRAN_SCALE, 1);
qs.setCond(6, true);
qs.set("drake_hunt", ROAD_SCAVENGER);
htmltext = event;
}
break;
}
case "30750-05.html":
{
if (qs.isCond(6) && (getQuestItemsCount(player, KALIBRAN_EGG) >= 20))
{
takeItems(player, -1, KALIBRAN_SCALE, KALIBRAN_EGG);
giveItems(player, KALIBRAN_EGG, 1);
qs.setCond(7, true);
htmltext = event;
}
break;
}
case "30751-03.html":
{
if (qs.isCond(5))
{
takeItems(player, MONKSHOOD_JUICE, -1);
giveItems(player, SUZET_SCALE, 1);
qs.setCond(6, true);
qs.set("drake_hunt", BREKA_OVERLORD);
htmltext = event;
}
break;
}
case "30752-02.html":
{
if (qs.isCond(5))
{
takeItems(player, MONKSHOOD_JUICE, -1);
giveItems(player, SHAMHAI_SCALE, 1);
qs.setCond(6, true);
qs.set("drake_hunt", DEAD_SEEKER);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
final QuestState qs = getQuestState(attacker, false);
if ((qs != null) && (getQuestItemsCount(attacker, DELUXE_FAIRY_STONE) > 0) && (getRandom(100) < 30))
{
takeItems(attacker, DELUXE_FAIRY_STONE, -1);
qs.playSound(QuestSound.ITEMSOUND_QUEST_MIDDLE);
npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.THE_STONE_THE_ELVEN_STONE_BROKE));
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance talker)
{
final QuestState qs = getQuestState(talker, true);
String htmltext = getNoQuestMsg(talker);
switch (qs.getState())
{
case State.CREATED:
{
if (npc.getId() == COOPER)
{
htmltext = ((talker.getLevel() >= MIN_LVL) ? "30829-01.htm" : "30829-03.html");
}
break;
}
case State.STARTED:
{
switch (npc.getId())
{
case COOPER:
{
htmltext = "30829-04.html";
break;
}
case CRONOS:
{
switch (qs.getCond())
{
case 1:
{
htmltext = "30610-01.html";
break;
}
case 2:
{
htmltext = "30610-07.html";
break;
}
case 3:
{
if (qs.getInt("old_stone") > 0)
{
htmltext = "30610-14.html";
}
else
{
htmltext = "30610-08.html";
}
break;
}
case 4:
{
htmltext = "30610-09.html";
break;
}
case 5:
{
if ((getQuestItemsCount(talker, FAIRY_STONE) == 0) && (getQuestItemsCount(talker, DELUXE_FAIRY_STONE) == 0))
{
htmltext = "30610-10.html";
}
else
{
htmltext = "30610-11.html";
}
break;
}
}
break;
}
case MARIA:
{
switch (qs.getCond())
{
case 2:
{
if ((qs.getInt("fairy_stone") == 1) && (getQuestItemsCount(talker, COAL) >= 10) && (getQuestItemsCount(talker, CHARCOAL) >= 10) && (getQuestItemsCount(talker, GEMSTONE_D) >= 1) && (getQuestItemsCount(talker, SILVER_NUGGET) >= 3) && (getQuestItemsCount(talker, TOAD_SKIN) >= 10))
{
htmltext = "30608-02.html";
}
else if ((qs.getInt("fairy_stone") == 2) && (getQuestItemsCount(talker, COAL) >= 10) && (getQuestItemsCount(talker, CHARCOAL) >= 10) && (getQuestItemsCount(talker, GEMSTONE_C) >= 1) && (getQuestItemsCount(talker, STONE_OF_PURITY) >= 1) && (getQuestItemsCount(talker, SILVER_NUGGET) >= 5) && (getQuestItemsCount(talker, TOAD_SKIN) >= 20))
{
htmltext = "30608-04.html";
}
else
{
htmltext = "30608-01.html";
}
break;
}
case 3:
{
htmltext = "30608-06.html";
break;
}
}
break;
}
case BYRON:
{
switch (qs.getCond())
{
case 2:
{
htmltext = "30711-10.html";
break;
}
case 3:
{
if (qs.getInt("old_stone") == 0)
{
htmltext = "30711-01.html";
}
else if (qs.getInt("old_stone") == 1)
{
qs.setCond(5, true);
htmltext = "30711-05.html";
}
else
{
qs.setCond(4, true);
htmltext = "30711-06.html";
}
break;
}
case 4:
{
if ((getQuestItemsCount(talker, FAIRY_STONE) == 0) && (getQuestItemsCount(talker, DELUXE_FAIRY_STONE) == 0))
{
htmltext = "30711-09.html";
}
else if (getQuestItemsCount(talker, FAIRY_STONE) == 0)
{
htmltext = "30711-08.html";
}
else
{
htmltext = "30711-07.html";
}
break;
}
}
break;
}
case MIMYU:
{
switch (qs.getCond())
{
case 4:
{
if (getQuestItemsCount(talker, FAIRY_STONE) > 0)
{
htmltext = "30747-01.html";
}
else if (getQuestItemsCount(talker, DELUXE_FAIRY_STONE) > 0)
{
htmltext = "30747-03.html";
}
break;
}
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30747-09.html";
}
else if (qs.getInt("fairy_stone") == 1)
{
htmltext = "30747-05.html";
}
else
{
htmltext = "30747-06.html";
}
break;
}
case 6:
{
if ((getQuestItemsCount(talker, EXARION_EGG) >= 20) || (getQuestItemsCount(talker, ZWOV_EGG) >= 20) || (getQuestItemsCount(talker, KALIBRAN_EGG) >= 20) || (getQuestItemsCount(talker, SUZET_EGG) >= 20) || (getQuestItemsCount(talker, SHAMHAI_EGG) >= 20))
{
htmltext = "30747-10.html";
}
else
{
htmltext = "30747-09.html";
}
break;
}
case 7:
{
htmltext = "30747-11.html";
break;
}
case 8:
{
htmltext = "30747-12.html";
break;
}
}
break;
}
case EXARION:
{
switch (qs.getCond())
{
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30748-01.html";
}
break;
}
case 6:
{
if (getQuestItemsCount(talker, EXARION_EGG) >= 20)
{
takeItems(talker, -1, EXARION_SCALE, EXARION_EGG);
giveItems(talker, EXARION_EGG, 1);
qs.setCond(7, true);
htmltext = "30748-04.html";
}
else
{
htmltext = "30748-03.html";
}
break;
}
case 7:
{
htmltext = "30748-05.html";
break;
}
}
break;
}
case ZWOV:
{
switch (qs.getCond())
{
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30749-01.html";
}
break;
}
case 6:
{
if (getQuestItemsCount(talker, ZWOV_EGG) >= 20)
{
takeItems(talker, -1, ZWOV_SCALE, ZWOV_EGG);
giveItems(talker, ZWOV_EGG, 1);
qs.setCond(7, true);
htmltext = "30749-04.html";
}
else
{
htmltext = "30749-03.html";
}
break;
}
case 7:
{
htmltext = "30749-05.html";
break;
}
}
break;
}
case KALIBRAN:
{
switch (qs.getCond())
{
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30750-01.html";
}
break;
}
case 6:
{
if (getQuestItemsCount(talker, KALIBRAN_EGG) >= 20)
{
htmltext = "30750-04.html";
}
else
{
htmltext = "30750-03.html";
}
break;
}
case 7:
{
htmltext = "30750-06.html";
break;
}
}
break;
}
case SUZET:
{
switch (qs.getCond())
{
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30751-01.html";
}
break;
}
case 6:
{
if (getQuestItemsCount(talker, SUZET_EGG) >= 20)
{
takeItems(talker, -1, SUZET_SCALE, SUZET_EGG);
giveItems(talker, SUZET_EGG, 1);
qs.setCond(7, true);
htmltext = "30751-05.html";
}
else
{
htmltext = "30751-04.html";
}
break;
}
case 7:
{
htmltext = "30751-06.html";
break;
}
}
break;
}
case SHAMHAI:
{
switch (qs.getCond())
{
case 5:
{
if (getQuestItemsCount(talker, MONKSHOOD_JUICE) > 0)
{
htmltext = "30752-01.html";
}
break;
}
case 6:
{
if (getQuestItemsCount(talker, SHAMHAI_EGG) >= 20)
{
takeItems(talker, -1, SHAMHAI_SCALE, SHAMHAI_EGG);
giveItems(talker, SHAMHAI_EGG, 1);
qs.setCond(7, true);
htmltext = "30752-04.html";
}
else
{
htmltext = "30752-03.html";
}
break;
}
case 7:
{
htmltext = "30752-05.html";
break;
}
}
break;
}
}
break;
}
case State.COMPLETED:
{
htmltext = getAlreadyCompletedMsg(talker);
break;
}
}
return htmltext;
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
final QuestState qs = getRandomPartyMemberState(killer, -1, 3, npc);
if (qs != null)
{
if (qs.isCond(2) && (npc.getId() == TOAD_LORD))
{
if (qs.getInt("fairy_stone") == 1)
{
giveItemRandomly(qs.getPlayer(), npc, TOAD_SKIN, 1, 10, 0.3, true);
}
else
{
giveItemRandomly(qs.getPlayer(), npc, TOAD_SKIN, 1, 20, 0.3, true);
}
}
else if (qs.isCond(6) && (npc.getId() == qs.getInt("drake_hunt")))
{
giveItemRandomly(qs.getPlayer(), npc, EGG_DROPS.get(npc.getId()), 1, 20, 0.5, true);
}
}
return super.onKill(npc, killer, isSummon);
}
/**
* Gives the reward to the player.
* @param player the player
*/
private static void giveReward(L2PcInstance player)
{
final int random = getRandom(100);
for (int i : EGGS)
{
if (hasQuestItems(player, i))
{
final int mul = EGGS.indexOf(i) * 5;
if (hasQuestItems(player, FAIRY_DUST))
{
if (random < (45 + mul))
{
giveItems(player, DRAGONFLUTE_OF_WIND, 1);
}
else if (random < (75 + mul))
{
giveItems(player, DRAGONFLUTE_OF_STAR, 1);
}
else
{
giveItems(player, DRAGONFLUTE_OF_TWILIGHT, 1);
}
}
if (random < (50 + mul))
{
giveItems(player, DRAGONFLUTE_OF_WIND, 1);
}
else if (random < (85 + mul))
{
giveItems(player, DRAGONFLUTE_OF_STAR, 1);
}
else
{
giveItems(player, DRAGONFLUTE_OF_TWILIGHT, 1);
}
takeItems(player, i, -1);
break;
}
}
}
}