Addition of probable useful quests from The Kamael branch.

This commit is contained in:
MobiusDevelopment 2022-08-27 02:08:59 +00:00
parent b5c8b64ab8
commit 6b415557c8
102 changed files with 3787 additions and 0 deletions

View File

@ -0,0 +1,80 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 ai.others;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLevelChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
import ai.AbstractNpcAI;
/**
* Second class change has only level requirement.
* @author Mobius
*/
public class SecondClassChange extends AbstractNpcAI
{
private static final int LEVEL_REQUIREMENT = 40;
@RegisterEvent(EventType.ON_PLAYER_LEVEL_CHANGED)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLevelChanged(OnPlayerLevelChanged event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if ((player.getLevel() < LEVEL_REQUIREMENT) || !CategoryData.getInstance().isInCategory(CategoryType.SECOND_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if ((player.getLevel() < LEVEL_REQUIREMENT) || !CategoryData.getInstance().isInCategory(CategoryType.SECOND_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
public static void main(String[] args)
{
new SecondClassChange();
}
}

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
It's wrong to take advantages of others just because they don't know any better.<br>
Isn't it?<br>
(This quest is only available for characters Lv. 76 or above after 2nd class change.)
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
Do you know about the gems from the Wind Realm being traded in the Material Realm?<br>
Recently, a small box with a letter came from Alchemist Veruti in the Town of Rune.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-02.htm">"Go on."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
When Veruti first heard about the gems from the Wind Realm, she thought they could be minerals.<br>
Someone gave this to Veruti when she was left alone in the Town of Rune as a gift from home. She thought it was strange and sent it to me.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-03.htm">Is it a problem?</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Orven:<br>
If it's powerless and only sold as a trinket, it is not a problem. But if someone knows about it and is trying to create it...that is dangerous.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-04.htm">"Why?"</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
If items with such power gets in the wrong hands, the outcome could be catastrophic.<br>
I need you to find out who is making the fake items and why.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-05.htm">"Leave it to me."</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Orven:<br>
You will need to investigate <font color="LEVEL">Silent Valley</font> or <font color="LEVEL">Devil's Isle</font>. Go to the hunting zone of your choice, defeat any monsters. You need to defeat 700 monsters in total.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-06.html">"Go on."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
Go investigate <font color="LEVEL">Silent Valley</font> or <font color="LEVEL">Devil's Isle</font>. Go to the hunting zone of your choice, defeat any monsters. You need to defeat 700 monsters in total.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-07.html">"Go on Silent Valley."</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-07a.html">"Go on Devil's Isle."</Button>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Orven:<br>
Investigate <font color="LEVEL">Silent Valley</font>. You need to defeat 700 monsters in total.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Orven:<br>
Investigate <font color="LEVEL">Devil's Isle</font>. You need to defeat 700 monsters in total.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Orven:<br>
Go investigate <font color="LEVEL">Silent Valley</font> or <font color="LEVEL">Devil's Isle</font>.<br1>
You need to defeat 700 monsters in total.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Orven:<br>
Go investigate <font color="LEVEL">Silent Valley</font> or <font color="LEVEL">Devil's Isle</font>.<br1>
You need to defeat 700 monsters in total.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Orven:<br>
I see a big smile on your face...<br1>
You have completed the task?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10673_SagaOfLegend 30857-10.html">"I have."</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Orven:<br>
You got stronger very quickly!<br>
Now you may change to your third class.
</body></html>

View File

@ -0,0 +1,340 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10673_SagaOfLegend;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerProfessionChange;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.model.quest.State;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* Saga of Legend (10673)
* @URL https://l2wiki.com/classic/Saga_of_Legend
* @TODO: Retail htmls.
* @author Dmitri, Mobius
*/
public class Q10673_SagaOfLegend extends Quest
{
// NPCs
private static final int ORVEN = 30857;
// Monsters
private static final int[] MOBS =
{
20965, // Chimera Piece 72
20970, // Soldier of Ancient Times 73
20966, // Mutated Creation 74
20971, // Warrior of Ancient Times 74
20967, // Creature of the Past 75
20973, // Forgotten Ancient People 75
20968, // Forgotten Face 75
20969, // Giant's Shadow 75
20972, // Shaman of Ancient Times 75
24025, // Bloody Purple 70
24046, // Floating Eye Seer 70
24032, // Seer 70
24041, // Bloody Mourner 71
24026, // Clipher 71
24042, // Clumsy Wimp 71
24047, // Floating Eye Seer 71
24033, // Guardian Spirit 71
24048, // Immortal Spirit 71
24043, // Mysterious Creature 71
24050, // Starving Spirit 71
24049, // Immortal Spirit 72
24034, // Midnight Sairon 72
24027, // Sairon 72
24052, // Starving Soldier 72
24051, // Starving Spirit 72
24035, // Daymen 73
24028, // Demon Warrior 73
24053, // Starving Soldier 73
24054, // Starving Warrior 73
24036, // Dolores 74
24037, // Maiden Doll 74
24055, // Starving Warrior 74
24030, // Stone Vanul 74
24029, // Veil Master 74
24044, // Zaken's Treasure Chest 74
24045, // Zaken's Treasure Chest 74
24031, // Death Flyer 75
24040, // Midnight Nightmare 75
24039, // Pearl Horror 75
24038, // Tor Scorpion 75
};
// Rewards
private static final int MAGICAL_TABLET = 90045;
private static final int SPELLBOOK_HUMAN = 90038; // Spellbook: Mount Golden Lion
private static final int SPELLBOOK_ELF = 90039; // Spellbook: Mount Pegasus
private static final int SPELLBOOK_DELF = 90040; // Spellbook: Mount Saber Tooth Cougar
private static final int SPELLBOOK_ORC = 90042; // Spellbook: Mount Black Bear
private static final int SPELLBOOK_DWARF = 90041; // Spellbook: Mount Kukuru
private static final int SPELLBOOK_KAMAEL = 91946; // Spellbook: Mount Griffin
// Misc
private static final int MIN_LEVEL = 76;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10673_SagaOfLegend()
{
super(10673);
addStartNpc(ORVEN);
addTalkId(ORVEN);
addKillId(MOBS);
addCondMinLevel(MIN_LEVEL, "30857-00.htm");
addCondInCategory(CategoryType.THIRD_CLASS_GROUP, "30857-00.htm");
setQuestNameNpcStringId(NpcStringId.LV_76_SAGA_OF_LEGEND);
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
String htmltext = null;
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return htmltext;
}
switch (event)
{
case "30857-02.htm":
case "30857-03.htm":
case "30857-04.htm":
case "30857-06.html":
{
htmltext = event;
break;
}
case "30857-05.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30857-07.html":
{
qs.setCond(2, true);
htmltext = event;
break;
}
case "30857-07a.html":
{
qs.setCond(3, true);
htmltext = event;
break;
}
case "30857-10.html":
{
if (qs.isCond(4))
{
giveItems(player, MAGICAL_TABLET, 10);
qs.exitQuest(false, true);
if (CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
switch (qs.getState())
{
case State.CREATED:
{
htmltext = "30857-01.htm";
break;
}
case State.STARTED:
{
switch (qs.getCond())
{
case 1:
{
htmltext = "30857-05.htm";
break;
}
case 2:
{
htmltext = "30857-08.html";
break;
}
case 3:
{
htmltext = "30857-08a.html";
break;
}
case 4:
{
htmltext = "30857-09.html";
break;
}
}
break;
}
case State.COMPLETED:
{
htmltext = getAlreadyCompletedMsg(player);
break;
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && (qs.getCond() > 1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 700)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(4, true);
qs.unset(KILL_COUNT_VAR);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && (qs.getCond() > 1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.ORVEN_S_REQUEST.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.THIRD_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
@RegisterEvent(EventType.ON_PLAYER_PROFESSION_CHANGE)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onProfessionChange(OnPlayerProfessionChange event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FOURTH_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
// Avoid reward more than once.
if (player.getVariables().getBoolean("3rdClassMountRewarded", false))
{
return;
}
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCompleted())
{
player.getVariables().set("3rdClassMountRewarded", true);
switch (player.getRace())
{
case ELF:
{
giveItems(player, SPELLBOOK_ELF, 1);
break;
}
case DARK_ELF:
{
giveItems(player, SPELLBOOK_DELF, 1);
break;
}
case ORC:
{
giveItems(player, SPELLBOOK_ORC, 1);
break;
}
case DWARF:
{
giveItems(player, SPELLBOOK_DWARF, 1);
break;
}
case KAMAEL:
{
giveItems(player, SPELLBOOK_KAMAEL, 1);
break;
}
case HUMAN:
{
giveItems(player, SPELLBOOK_HUMAN, 1);
break;
}
}
}
}
}

View File

@ -0,0 +1,6 @@
<html><body>Trader Jackson:<br>
It is not much, but I hope it helps.<br>
By the way. I heard that Captain Bathis of Gludio Castle is looking for someone to help... Are you interested?<br>
<font color=LEVEL>(Open the Missions window and receive the reward for reaching level 10.)</font><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt NEXT_QUEST">"I will try"</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Jackson:<br>
It is quiter now. Thank you. Please take it.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10981_UnbearableWolvesHowling 30002-02.htm">"Thank you"</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
Those Keltirs and Wolves are wandering around the front of the village, so it is beem chaotic.<br>
Jackson said he cannot even sleep at night because of their howling. He asked for those Wolves to be kicked out.<br>
Will you help?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10981_UnbearableWolvesHowling 30598-02.htm">"I will help"</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
Thank you!<br>
Please hunt 20 Wolves or Keltirs.<br1>
if you are going to the hunting ground, I can send you there.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10981_UnbearableWolvesHowling TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground</Button>
</body></html>

View File

@ -0,0 +1,191 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10981_UnbearableWolvesHowling;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
/**
* Unbearable Wolves Howling (10981)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10981_UnbearableWolvesHowling extends Quest
{
// NPCs
private static final int NEWBIE_GUIDE = 30598;
private static final int JACKSON = 30002;
// Items
private static final ItemHolder SOE_TO_JACKSON = new ItemHolder(91646, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 10);
private static final ItemHolder RING_NOVICE = new ItemHolder(49041, 2);
private static final ItemHolder EARRING_NOVICE = new ItemHolder(49040, 2);
private static final ItemHolder NECKLACE_NOVICE = new ItemHolder(49039, 1);
// Monsters
private static final int BEARDED_KELTIR = 20481;
private static final int WOLF = 20120;
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10981_UnbearableWolvesHowling()
{
super(10981);
addStartNpc(NEWBIE_GUIDE);
addTalkId(NEWBIE_GUIDE, JACKSON);
addKillId(BEARDED_KELTIR, WOLF);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_2_20_UNBEARABLE_WOLVES_HOWLING);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(-90050, 241763, -3560);
break;
}
case "30598-02.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30002-02.htm":
{
if (qs.isStarted())
{
addExpAndSp(player, 260000, 6000);
giveItems(player, SOE_NOVICE);
giveItems(player, RING_NOVICE);
giveItems(player, EARRING_NOVICE);
giveItems(player, NECKLACE_NOVICE);
qs.exitQuest(false, true);
htmltext = event;
break;
}
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 20)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to return to Trader Jackson", 5000));
giveItems(killer, SOE_TO_JACKSON);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_WOLVES_AND_BEARDED_KELTIRS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30598-01.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case NEWBIE_GUIDE:
{
if (qs.isCond(1))
{
htmltext = "30598-02.htm";
}
break;
}
case JACKSON:
{
if (qs.isCond(2))
{
htmltext = "30002.htm";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == NEWBIE_GUIDE)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
}

View File

@ -0,0 +1,3 @@
<html><body>Newbie Guide:<br>
You do not meet the requirements of the quest (Quest is only available to 2-20 levels).
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Trader Jackson:<br>
Captain Bathis want someone who knows about spiders, more than a veteran.<br1>
It looks like he wants to raise someone to hunt spiders expertly in Gludio.<br1>
How many, you ask? I think 30 should be enough.<br1>
There are many spiders to the west of the island. It is pretty far to walk there.<br1>
If you are going to the hunting ground, I can help you.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground.</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Trader Jackson:<br>
Captain Bathis of Gludio Castle is looking for a spider expert to hunt spiders.<br>
Defeat some Giant Spiders as practice and go to find Captain Bathis.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30002-01.html">"I will do it"</Button>
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Armor<br><br>
[Recommended Classes]<br>
Warrior(Humans)<br1>
Knight(Humans)<br1>
Elven Knight(Elves)<br1>
Palus Knight(Dark Elves)<br1>
Orc Raider(Orcs)<br1>
Scavenger(Dwarves)<br1>
Artisan(Dwarves)<br1>
Trooper(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt HeavyArmor.html">Receive (Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,12 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Outfit<br><br>
[Recommended Classes]<br>
Rogue(Humans)<br1>
Elven Scout(Elves)<br1>
Assassin(Dark Elves)<br1>
Orc Monk(Orcs)<br1>
Soul Finder(Jin Kamael))<br1>
Warder(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt LightArmor.html">Receive (Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,13 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Doublet<br><br>
[Recommended Classes]<br>
Wizard(Humans)<br1>
Cleric(Humans)<br1>
Elven Wizard(Elves)<br1>
Oracle(Elves)<br1>
Dark Wizard(Dark Elves)<br1>
Shillien Oracle(Dark Elves)<br1>
Orc Shaman(Orcs)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt Robe.html">Receive (Robe) Moonshadow Double Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Captain Bathis:<br>
You came from Talking Island? I see. You know how hunt spiders?<br>
Hm. It should be good enough for you. You will have to get ready to go hunt. Pick one of these for your armor.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332-01.html">(Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332-02.html">(Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10982_SpiderHunt 30332-03.html">(Robe Armor) Moonshadow Double Set</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Armor.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Ourfit.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,316 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10982_SpiderHunt;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* New Horizons (10982)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10982_SpiderHunt extends Quest
{
// NPCs
private static final int JACKSON = 30002;
private static final int CAPTAIN_BATHIS = 30332;
// Monsters
private static final int GIANT_SPIDER = 20103;
private static final int GIANT_FANG_SPIDER = 20106;
private static final int GIANT_BLADE_SPIDER = 20108;
// Items
private static final ItemHolder SOE_TO_CAPTAIN_BATHIS = new ItemHolder(91651, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 20);
private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 50);
private static final ItemHolder HP_POTS = new ItemHolder(91912, 50); // TODO: Finish Item
private static final ItemHolder RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT = new ItemHolder(91840, 1);
// HELMET FOR ALL ARMORS
private static final ItemHolder MOON_HELMET = new ItemHolder(7850, 1);
// HEAVY
private static final ItemHolder MOON_ARMOR = new ItemHolder(7851, 1);
private static final ItemHolder MOON_GAUNTLETS = new ItemHolder(7852, 1);
private static final ItemHolder MOON_BOOTS = new ItemHolder(7853, 1);
// LIGHT
private static final ItemHolder MOON_SHELL = new ItemHolder(7854, 1);
private static final ItemHolder MOON_LEATHER_GLOVES = new ItemHolder(7855, 1);
private static final ItemHolder MOON_SHOES = new ItemHolder(7856, 1);
// ROBE
private static final ItemHolder MOON_CAPE = new ItemHolder(7857, 1);
private static final ItemHolder MOON_SILK = new ItemHolder(7858, 1);
private static final ItemHolder MOON_SANDALS = new ItemHolder(7859, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10982_SpiderHunt()
{
super(10982);
addStartNpc(JACKSON);
addTalkId(JACKSON, CAPTAIN_BATHIS);
addKillId(GIANT_SPIDER, GIANT_FANG_SPIDER, GIANT_BLADE_SPIDER);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_15_20_SPIDER_HUNT);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30002-01.html":
{
qs.startQuest();
htmltext = event;
break;
}
case "30332-01.html":
{
htmltext = event;
break;
}
case "30332-02.html":
{
htmltext = event;
break;
}
case "30332-03.html":
{
htmltext = event;
break;
}
case "30332.html":
{
htmltext = event;
break;
}
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(-117409, 227185, -2896);
break;
}
case "NEXT_QUEST":
{
htmltext = "30002.htm";
break;
}
case "HeavyArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_ARMOR);
giveItems(player, MOON_GAUNTLETS);
giveItems(player, MOON_BOOTS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "LightArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_SHELL);
giveItems(player, MOON_LEATHER_GLOVES);
giveItems(player, MOON_SHOES);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "Robe.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_CAPE);
giveItems(player, MOON_SILK);
giveItems(player, MOON_SANDALS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 30)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to go to Captain Bathis in the Town of Gludio.", 5000));
giveItems(killer, SOE_TO_CAPTAIN_BATHIS);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_GIANT_SPIDERS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30002.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case JACKSON:
{
if (qs.isCond(1))
{
htmltext = "30002-01.html";
}
break;
}
case CAPTAIN_BATHIS:
{
if (qs.isCond(2))
{
htmltext = "30332.html";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == JACKSON)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
}

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Robe.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Trader Vollodov:<br>
You do not meet the requirements of the quest (Quest is only available to 15-20 levels).
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Trader Herbiel:<br>
I heard that Captain Bathis of GLudio Castle is looking for some spider web. He wants to make a rope with that. I wonder for what?<br>
Would you like to try, adventurer?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb NEXT_QUEST">"How much doest he need?"</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Herbiel:<br>
Im feeling great. It is not much, but please take it.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10983_TroubledForest 30150-02.htm">You have my gratitude.</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
Have you seen the Goblin Raiders and the Kaboo Orcs outside the village? They are very violent.<br1>
Herbiel was chased by them before. That is why he is looking for someone to beat them up.<br>
Will you help?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10983_TroubledForest 30599-02.htm">"I will help"</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Newbie Guide:<br>
Thank you!<br>
Please beath up 20 Goblin Raiders and Kaboo Orcs causing trouble in front of the village.<br>
If you are going to hunting ground, I can send you there. You say it is too close?<br>
Still, I like doing this. Just let me know.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10983_TroubledForest TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground.</Button>
</body></html>

View File

@ -0,0 +1,191 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10983_TroubledForest;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
/**
* Troubled Forest (10983)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10983_TroubledForest extends Quest
{
// NPCs
private static final int NEWBIE_GUIDE = 30599;
private static final int HERBIEL = 30150;
// Monsters
private static final int GOBLIN_RAIDER = 20325;
private static final int KABOO_ORC = 20468;
// Items
private static final ItemHolder SOE_TO_HERBIEL = new ItemHolder(91647, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 10);
private static final ItemHolder RING_NOVICE = new ItemHolder(49041, 2);
private static final ItemHolder EARRING_NOVICE = new ItemHolder(49040, 2);
private static final ItemHolder NECKLACE_NOVICE = new ItemHolder(49039, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10983_TroubledForest()
{
super(10983);
addStartNpc(NEWBIE_GUIDE);
addTalkId(NEWBIE_GUIDE, HERBIEL);
addKillId(GOBLIN_RAIDER, KABOO_ORC);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_2_20_TROUBLED_FOREST);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(52746, 49932, -3480);
break;
}
case "30599-02.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30150-02.htm":
{
if (qs.isStarted())
{
addExpAndSp(player, 260000, 6000);
giveItems(player, SOE_NOVICE);
giveItems(player, RING_NOVICE);
giveItems(player, EARRING_NOVICE);
giveItems(player, NECKLACE_NOVICE);
qs.exitQuest(false, true);
htmltext = event;
break;
}
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 20)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to return to Trader Herbiel.", 5000));
giveItems(killer, SOE_TO_HERBIEL);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_ORCS_AND_GOBLINS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30599-01.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case NEWBIE_GUIDE:
{
if (qs.isCond(1))
{
htmltext = "30599-02.htm";
}
break;
}
case HERBIEL:
{
if (qs.isCond(2))
{
htmltext = "30150.htm";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == NEWBIE_GUIDE)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
}

View File

@ -0,0 +1,3 @@
<html><body>Newbie Guide:<br>
You do not meet the requirements of the quest (Quest is only available to 2-20 levels).
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Herbiel:<br>
I think 30 Spider Webs should be enough. Once you get it, go to straight to Captain Bathis.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground.</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Trader Herbiel:<br>
I heard that Captain Bathis of Gludio Castle is looking for some spider web. He want to make a rope with that. I wonder for what?<br>
Would you like to try, adventurer?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30150-01.html">"How much doest he need?"</Button>
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Armor<br><br>
[Recommended Classes]<br>
Warrior(Humans)<br1>
Knight(Humans)<br1>
Elven Knight(Elves)<br1>
Palus Knight(Dark Elves)<br1>
Orc Raider(Orcs)<br1>
Scavenger(Dwarves)<br1>
Artisan(Dwarves)<br1>
Trooper(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb HeavyArmor.html">Receive (Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,12 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Outfit<br><br>
[Recommended Classes]<br>
Rogue(Humans)<br1>
Elven Scout(Elves)<br1>
Assassin(Dark Elves)<br1>
Orc Monk(Orcs)<br1>
Soul Finder(Jin Kamael))<br1>
Warder(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb LightArmor.html">Receive (Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,13 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Doublet<br><br>
[Recommended Classes]<br>
Wizard(Humans)<br1>
Cleric(Humans)<br1>
Elven Wizard(Elves)<br1>
Oracle(Elves)<br1>
Dark Wizard(Dark Elves)<br1>
Shillien Oracle(Dark Elves)<br1>
Orc Shaman(Orcs)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb Robe.html">Receive (Robe) Moonshadow Double Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,9 @@
<html><body>Captain Bathis:<br>
Lets see<br>
Hm, this should be enough.<br>
I cant tell you the details, but there are many creatures in the swamp these days. Im prepared for it. It is nothing to be worried about.<br>
Since you helped me. I looked for armor that could fit you. Pick one that you would like.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332-01.html">(Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332-02.html">(Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10984_CollectSpiderweb 30332-03.html">(Robe Armor) Moonshadow Double Set</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Armor.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Ourfit.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,295 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10984_CollectSpiderweb;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* Collect Spiderweb (10984)
* @author RobikBobik, Mobius
* @Notee: Based on NA server September 2019
*/
public class Q10984_CollectSpiderweb extends Quest
{
// NPCs
private static final int HERBIEL = 30150;
private static final int CAPTAIN_BATHIS = 30332;
// Monsters
private static final int HOOK_SPIDER = 20308;
private static final int CRIMSON_SPIDER = 20460;
private static final int PINCER_SPIDER = 20466;
// Items
private static final int GIANT_COBWEB = 91652;
private static final ItemHolder SOE_TO_CAPTAIN_BATHIS = new ItemHolder(91651, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 20);
private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 50);
private static final ItemHolder HP_POTS = new ItemHolder(91912, 50); // TODO: Finish Item
private static final ItemHolder RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT = new ItemHolder(91840, 1);
// HELMET FOR ALL ARMORS
private static final ItemHolder MOON_HELMET = new ItemHolder(7850, 1);
// HEAVY
private static final ItemHolder MOON_ARMOR = new ItemHolder(7851, 1);
private static final ItemHolder MOON_GAUNTLETS = new ItemHolder(7852, 1);
private static final ItemHolder MOON_BOOTS = new ItemHolder(7853, 1);
// LIGHT
private static final ItemHolder MOON_SHELL = new ItemHolder(7854, 1);
private static final ItemHolder MOON_LEATHER_GLOVES = new ItemHolder(7855, 1);
private static final ItemHolder MOON_SHOES = new ItemHolder(7856, 1);
// ROBE
private static final ItemHolder MOON_CAPE = new ItemHolder(7857, 1);
private static final ItemHolder MOON_SILK = new ItemHolder(7858, 1);
private static final ItemHolder MOON_SANDALS = new ItemHolder(7859, 1);
// Misc
private static final int MAX_LEVEL = 20;
public Q10984_CollectSpiderweb()
{
super(10984);
addStartNpc(HERBIEL);
addTalkId(HERBIEL, CAPTAIN_BATHIS);
addKillId(HOOK_SPIDER, CRIMSON_SPIDER, PINCER_SPIDER);
registerQuestItems(GIANT_COBWEB);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_15_20_SPIDER_WEB);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30150-01.html":
{
qs.startQuest();
htmltext = event;
break;
}
case "30332-01.html":
{
htmltext = event;
break;
}
case "30332-02.html":
{
htmltext = event;
break;
}
case "30332-03.html":
{
htmltext = event;
break;
}
case "30332.html":
{
htmltext = event;
break;
}
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(5135, 68148, -3256);
break;
}
case "NEXT_QUEST":
{
htmltext = "30150.htm";
break;
}
case "HeavyArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_ARMOR);
giveItems(player, MOON_GAUNTLETS);
giveItems(player, MOON_BOOTS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "LightArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_SHELL);
giveItems(player, MOON_LEATHER_GLOVES);
giveItems(player, MOON_SHOES);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "Robe.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_CAPE);
giveItems(player, MOON_SILK);
giveItems(player, MOON_SANDALS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30150.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case HERBIEL:
{
if (qs.isCond(1))
{
htmltext = "30150-01.html";
}
break;
}
case CAPTAIN_BATHIS:
{
if (qs.isCond(2))
{
htmltext = "30332.html";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == HERBIEL)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
if (getQuestItemsCount(killer, GIANT_COBWEB) < 30)
{
giveItems(killer, GIANT_COBWEB, 1, true);
}
if (getQuestItemsCount(killer, GIANT_COBWEB) >= 30)
{
qs.setCond(2, true);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to go to Captain Bathis in the Town of Gludio.", 5000));
giveItems(killer, SOE_TO_CAPTAIN_BATHIS);
}
}
return super.onKill(npc, killer, isSummon);
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
}

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Robe.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Trader Vollodov:<br>
You do not meet the requirements of the quest (Quest is only available to 15-20 levels).
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Trader Vollodos:<br>
Lets see... Some accessories... And a Scroll of Escape.<br>
Oh, Im sorry.<br>
This isnt to make up for it, but I heard that Captain Bathis of Gludio Castle is looking for someone to help. Are you interested?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster NEXT_QUEST">"I will try"</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Vollodos:<br>
I heard about you from the Newbie Guide. Here is the item.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10985_CleaningUpTheGround 30137-02.htm">Receive the item.</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
Did you see the goblins in front of the village? There are even dirty Imps.<br>
I need them to disappear to feel better.<br>
You want to try?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10985_CleaningUpTheGround 30600-02.htm">"I will do it."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Newbie Guide:<br>
Take a care of those dirty bastards.<br>Get rid of those Imps, Goblins, and Ashen Wolves. How many you ask? About 20 should be enough.<br>
Dont you want to go now? I can send you there.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10985_CleaningUpTheGround TELEPORT_TO_HUNTING_GROUND">"Go to the hunting ground."</Button>
</body></html>

View File

@ -0,0 +1,192 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10985_CleaningUpTheGround;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
/**
* Cleaning-Up The Ground (10985)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10985_CleaningUpTheGround extends Quest
{
// NPCs
private static final int NEWBIE_GUIDE = 30600;
private static final int VOLODOS = 30137;
// Monsters
private static final int ASHEN_WOLF = 20456;
private static final int GOBLIN = 20003;
private static final int IMP = 20004;
// Items
private static final ItemHolder SOE_TO_VOLLODOS = new ItemHolder(91648, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 10);
private static final ItemHolder RING_NOVICE = new ItemHolder(49041, 2);
private static final ItemHolder EARRING_NOVICE = new ItemHolder(49040, 2);
private static final ItemHolder NECKLACE_NOVICE = new ItemHolder(49039, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10985_CleaningUpTheGround()
{
super(10985);
addStartNpc(NEWBIE_GUIDE);
addTalkId(NEWBIE_GUIDE, VOLODOS);
addKillId(ASHEN_WOLF, GOBLIN, IMP);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_2_20_CLEANING_UP_THE_GROUNDS);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(8945, 3529, -2504);
break;
}
case "30600-02.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30137-02.htm":
{
if (qs.isStarted())
{
addExpAndSp(player, 260000, 6000);
giveItems(player, SOE_NOVICE);
giveItems(player, RING_NOVICE);
giveItems(player, EARRING_NOVICE);
giveItems(player, NECKLACE_NOVICE);
qs.exitQuest(false, true);
htmltext = event;
break;
}
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 20)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory.", 5000));
giveItems(killer, SOE_TO_VOLLODOS);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_MONSTERS_NEAR_THE_VILLAGE.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30600-01.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case NEWBIE_GUIDE:
{
if (qs.isCond(1))
{
htmltext = "30600-02.htm";
}
break;
}
case VOLODOS:
{
if (qs.isCond(2))
{
htmltext = "30137.htm";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == NEWBIE_GUIDE)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
}

View File

@ -0,0 +1,3 @@
<html><body>Newbie Guide:<br>
You do not meet the requirements of the quest (Quest is only available to 2-20 levels).
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Trader Vollodos:<br>
Captain Bathis asked to get rid of the Undead in the Swampland. I heard that there are Marsh Zombies and Dark Horrors.<br>
Im counting on you.<br>
But it is pretty far to walk all the way to the Swampland.<br>
If you are going to the hunting ground, I can help you.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground.</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Trader Vollodos:<br>
Captain Bathis of Gludio Castle is looking for someone to take care of the Undead in the Swamplant.<br>
Gludio Castle is so far from here, so Im not sure why he requested that.<br>
Will you do it?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30137-01.html">"I will do it"</Button>
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Armor<br><br>
[Recommended Classes]<br>
Warrior(Humans)<br1>
Knight(Humans)<br1>
Elven Knight(Elves)<br1>
Palus Knight(Dark Elves)<br1>
Orc Raider(Orcs)<br1>
Scavenger(Dwarves)<br1>
Artisan(Dwarves)<br1>
Trooper(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster HeavyArmor.html">Receive (Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,12 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Outfit<br><br>
[Recommended Classes]<br>
Rogue(Humans)<br1>
Elven Scout(Elves)<br1>
Assassin(Dark Elves)<br1>
Orc Monk(Orcs)<br1>
Soul Finder(Jin Kamael))<br1>
Warder(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster LightArmor.html">Receive (Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,13 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Doublet<br><br>
[Recommended Classes]<br>
Wizard(Humans)<br1>
Cleric(Humans)<br1>
Elven Wizard(Elves)<br1>
Oracle(Elves)<br1>
Dark Wizard(Dark Elves)<br1>
Shillien Oracle(Dark Elves)<br1>
Orc Shaman(Orcs)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster Robe.html">Receive (Robe) Moonshadow Double Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Captain Bathis:<br>
I heard from Vollodos. You are skilled. if there were more monsters in the swamp, they might have come to Gludio. Thank you<br>
its not much, but pick an armor piece.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332-01.html">(Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332-02.html">(Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10986_SwampMonster 30332-03.html">(Robe Armor) Moonshadow Double Set</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Armor.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Ourfit.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,317 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10986_SwampMonster;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* Swamp Monsters (10986)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10986_SwampMonster extends Quest
{
// NPCs
private static final int VOLODOS = 30137;
private static final int CAPTAIN_BATHIS = 30332;
// Monsters
private static final int MARSH_ZOMBIE = 20015; // NOTE: Zombie Forest Elf in old client
private static final int MARSH_ZOMBIE_SCOUT = 20020; // NOTE: Zombie Forest Elf Resercher in old client
private static final int DARK_HORROR = 20105;
private static final int LESSER_DARK_HORROR = 20025;
// Items
private static final ItemHolder SOE_TO_CAPTAIN_BATHIS = new ItemHolder(91651, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 20);
private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 50);
private static final ItemHolder HP_POTS = new ItemHolder(91912, 50); // TODO: Finish Item
private static final ItemHolder RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT = new ItemHolder(91840, 1);
// HELMET FOR ALL ARMORS
private static final ItemHolder MOON_HELMET = new ItemHolder(7850, 1);
// HEAVY
private static final ItemHolder MOON_ARMOR = new ItemHolder(7851, 1);
private static final ItemHolder MOON_GAUNTLETS = new ItemHolder(7852, 1);
private static final ItemHolder MOON_BOOTS = new ItemHolder(7853, 1);
// LIGHT
private static final ItemHolder MOON_SHELL = new ItemHolder(7854, 1);
private static final ItemHolder MOON_LEATHER_GLOVES = new ItemHolder(7855, 1);
private static final ItemHolder MOON_SHOES = new ItemHolder(7856, 1);
// ROBE
private static final ItemHolder MOON_CAPE = new ItemHolder(7857, 1);
private static final ItemHolder MOON_SILK = new ItemHolder(7858, 1);
private static final ItemHolder MOON_SANDALS = new ItemHolder(7859, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10986_SwampMonster()
{
super(10986);
addStartNpc(VOLODOS);
addTalkId(VOLODOS, CAPTAIN_BATHIS);
addKillId(MARSH_ZOMBIE, MARSH_ZOMBIE_SCOUT, DARK_HORROR, LESSER_DARK_HORROR);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_15_20_TERRIBLE_SWAMP_MONSTERS);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30137-01.html":
{
qs.startQuest();
htmltext = event;
break;
}
case "30332-01.html":
{
htmltext = event;
break;
}
case "30332-02.html":
{
htmltext = event;
break;
}
case "30332-03.html":
{
htmltext = event;
break;
}
case "30332.html":
{
htmltext = event;
break;
}
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(-19004, 47388, -3608);
break;
}
case "NEXT_QUEST":
{
htmltext = "30137.htm";
break;
}
case "HeavyArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_ARMOR);
giveItems(player, MOON_GAUNTLETS);
giveItems(player, MOON_BOOTS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "LightArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_SHELL);
giveItems(player, MOON_LEATHER_GLOVES);
giveItems(player, MOON_SHOES);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "Robe.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_CAPE);
giveItems(player, MOON_SILK);
giveItems(player, MOON_SANDALS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 30)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to go to Captain Bathis in the Town of Gludio.", 5000));
giveItems(killer, SOE_TO_CAPTAIN_BATHIS);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_ZOMBIES_AND_DARK_HORRORS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30137.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case VOLODOS:
{
if (qs.isCond(1))
{
htmltext = "30137-01.html";
}
break;
}
case CAPTAIN_BATHIS:
{
if (qs.isCond(2))
{
htmltext = "30332.html";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == VOLODOS)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
}

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Robe.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Trader Vollodov:<br>
You do not meet the requirements of the quest (Quest is only available to 15-20 levels).
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Uska:<br>
I heard someting that might help you. The Maraku Werewolves seem to be scheming something. Its something they always do, but it looks like it is something big this time. Even Captain Bathis from Gludio Castle is worried about what the Maraku Werewolves are up to. How about taking care of the Maraku Werewolves and going to Bathis?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy NEXT_QUEST">"I will try"</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Uska:<br>
I heard that you beat those guys up. Our ancestors will be able to rest in peace.Here is the item I was storing. Thank you.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10987_PlunderedGraves 30560-02.htm">Thank you</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
You know that many ancestora are resting in the Valley of Heroes, right?<br>
But it looks like the Kasha Wolves and Goblin Tomb Raiders have been damaging the tombs.<br1>
Will you take care of those bastards? I have left some rewards with Uska, so go after you finish the job.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10987_PlunderedGraves 30602-02.htm">"I cannot forgive them, no."</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
Hunt those Kasha Wolves, Goblin Tomb Raiders, and Rakeclaw Imps. They dared to damage the tombs of our ancestors.<br>
20 of them should be enough. And one you are done, go find Uska. I left some rewards with him.<br>
If you are going to hunting ground, I can send you there.
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10987_PlunderedGraves TELEPORT_TO_HUNTING_GROUND">"Go to the hunting ground."</Button>
</body></html>

View File

@ -0,0 +1,193 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10987_PlunderedGraves;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
/**
* Plundered Graves (10987)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10987_PlunderedGraves extends Quest
{
// NPCs
private static final int NEWBIE_GUIDE = 30602;
private static final int USKA = 30560;
// Monsters
private static final int KASHA_WOLF = 20475;
private static final int KASHA_TIMBER_WOLF = 20477; // NOTE: Kasha Forest Wolf in old client
private static final int GOBLIN_TOMB_RAIDER = 20319;
private static final int RAKECLAW_IMP_HUNTER = 20312;
// Items
private static final ItemHolder SOE_TO_USKA = new ItemHolder(91649, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 10);
private static final ItemHolder RING_NOVICE = new ItemHolder(49041, 2);
private static final ItemHolder EARRING_NOVICE = new ItemHolder(49040, 2);
private static final ItemHolder NECKLACE_NOVICE = new ItemHolder(49039, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10987_PlunderedGraves()
{
super(10987);
addStartNpc(NEWBIE_GUIDE);
addTalkId(NEWBIE_GUIDE, USKA);
addKillId(KASHA_WOLF, KASHA_TIMBER_WOLF, GOBLIN_TOMB_RAIDER, RAKECLAW_IMP_HUNTER);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_2_20_PLUNDERED_GRAVES);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(-39527, -117654, -1840);
break;
}
case "30602-02.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30560-02.htm":
{
if (qs.isStarted())
{
addExpAndSp(player, 260000, 6000);
giveItems(player, SOE_NOVICE);
giveItems(player, RING_NOVICE);
giveItems(player, EARRING_NOVICE);
giveItems(player, NECKLACE_NOVICE);
qs.exitQuest(false, true);
htmltext = event;
break;
}
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 20)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory.", 5000));
giveItems(killer, SOE_TO_USKA);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.TRACK_DOWN_GRAVE_ROBBERS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30602-01.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case NEWBIE_GUIDE:
{
if (qs.isCond(1))
{
htmltext = "30602-02.htm";
}
break;
}
case USKA:
{
if (qs.isCond(2))
{
htmltext = "30560.htm";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == NEWBIE_GUIDE)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
}

View File

@ -0,0 +1,3 @@
<html><body>Newbie Guide:<br>
You do not meet the requirements of the quest (Quest is only available to 2-20 levels).
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Armor<br><br>
[Recommended Classes]<br>
Warrior(Humans)<br1>
Knight(Humans)<br1>
Elven Knight(Elves)<br1>
Palus Knight(Dark Elves)<br1>
Orc Raider(Orcs)<br1>
Scavenger(Dwarves)<br1>
Artisan(Dwarves)<br1>
Trooper(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy HeavyArmor.html">Receive (Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,12 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Outfit<br><br>
[Recommended Classes]<br>
Rogue(Humans)<br1>
Elven Scout(Elves)<br1>
Assassin(Dark Elves)<br1>
Orc Monk(Orcs)<br1>
Soul Finder(Jin Kamael))<br1>
Warder(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy LightArmor.html">Receive (Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,13 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Doublet<br><br>
[Recommended Classes]<br>
Wizard(Humans)<br1>
Cleric(Humans)<br1>
Elven Wizard(Elves)<br1>
Oracle(Elves)<br1>
Dark Wizard(Dark Elves)<br1>
Shillien Oracle(Dark Elves)<br1>
Orc Shaman(Orcs)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy Robe.html">Receive (Robe) Moonshadow Double Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,9 @@
<html><body>Captain Bathis:<br>
Its you- The one who made Maraku Werevolves shiver...<br>
I was worrived about what they were up to, but thanks to you, I am relived.<br>
What?<br1>
You look curious. But Im sorry. I dont think I can tell you. I will give you an armor instead, so pick one you like.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332-01.html">(Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332-02.html">(Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30332-03.html">(Robe Armor) Moonshadow Double Set</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Trader Uska:<br>
I heard that the Maraku Werewolves are raising spiders to do something. We better give them a warning. Defeating 30 of them should be good enough of a warning. Will you go?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy TELEPORT_TO_HUNTING_GROUND">Go to the hunting ground.</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Trader Uska:<br>
You want to know what counts as a warning?<br>
Lets me see... Defeat 30 of Maraku Werewolfs, and that should do the trick.<br>
Will you do it?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10988_Conspiracy 30560-01.html">"I will do it."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Armor.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Ourfit.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,317 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10988_Conspiracy;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* Conspiracy (10988)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10988_Conspiracy extends Quest
{
// NPCs
private static final int USKA = 30560;
private static final int CAPTAIN_BATHIS = 30332;
// Monsters
private static final int KASHA_SPIDER = 20474;
private static final int KASHA_BLADE_SPIDER = 20478;
private static final int MARAKU_WEREVOLF_CHIEFTAIN = 20364;
private static final int EVIL_EYE_PATROL = 20428;
// Items
private static final ItemHolder SOE_TO_CAPTAIN_BATHIS = new ItemHolder(91651, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 20);
private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 50);
private static final ItemHolder HP_POTS = new ItemHolder(91912, 50); // TODO: Finish Item
private static final ItemHolder RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT = new ItemHolder(91840, 1);
// HELMET FOR ALL ARMORS
private static final ItemHolder MOON_HELMET = new ItemHolder(7850, 1);
// HEAVY
private static final ItemHolder MOON_ARMOR = new ItemHolder(7851, 1);
private static final ItemHolder MOON_GAUNTLETS = new ItemHolder(7852, 1);
private static final ItemHolder MOON_BOOTS = new ItemHolder(7853, 1);
// LIGHT
private static final ItemHolder MOON_SHELL = new ItemHolder(7854, 1);
private static final ItemHolder MOON_LEATHER_GLOVES = new ItemHolder(7855, 1);
private static final ItemHolder MOON_SHOES = new ItemHolder(7856, 1);
// ROBE
private static final ItemHolder MOON_CAPE = new ItemHolder(7857, 1);
private static final ItemHolder MOON_SILK = new ItemHolder(7858, 1);
private static final ItemHolder MOON_SANDALS = new ItemHolder(7859, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10988_Conspiracy()
{
super(10988);
addStartNpc(USKA);
addTalkId(USKA, CAPTAIN_BATHIS);
addKillId(KASHA_SPIDER, KASHA_BLADE_SPIDER, MARAKU_WEREVOLF_CHIEFTAIN, EVIL_EYE_PATROL);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_15_20_CONSPIRACY);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30560-01.html":
{
qs.startQuest();
htmltext = event;
break;
}
case "30332-01.html":
{
htmltext = event;
break;
}
case "30332-02.html":
{
htmltext = event;
break;
}
case "30332-03.html":
{
htmltext = event;
break;
}
case "30332.html":
{
htmltext = event;
break;
}
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(13136, -131688, -1312);
break;
}
case "NEXT_QUEST":
{
htmltext = "30560.htm";
break;
}
case "HeavyArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_ARMOR);
giveItems(player, MOON_GAUNTLETS);
giveItems(player, MOON_BOOTS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "LightArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_SHELL);
giveItems(player, MOON_LEATHER_GLOVES);
giveItems(player, MOON_SHOES);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "Robe.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_CAPE);
giveItems(player, MOON_SILK);
giveItems(player, MOON_SANDALS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 30)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to go to Captain Bathis in the Town of Gludio.", 5000));
giveItems(killer, SOE_TO_CAPTAIN_BATHIS);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.EXPOSE_A_PLOT_OF_MARAKU_WEREWOLVES.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30560.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case USKA:
{
if (qs.isCond(1))
{
htmltext = "30560-01.html";
}
break;
}
case CAPTAIN_BATHIS:
{
if (qs.isCond(2))
{
htmltext = "30332.html";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == USKA)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
}

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Robe.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Trader Vollodov:<br>
You do not meet the requirements of the quest (Quest is only available to 15-20 levels).
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Newbie Guide:<br>
I heard that Wolves and keltiers are wandering in front of the village. Those things get in the way of work. Especially when sending food to the mines, those Gnomes make some loud noises, so people hate it.<br>
I want to show them away. Can you help?<br>
If you help, I will talk to Gerald and get you some accessories.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10989_DangerousPredators 30601-02.htm">"Sure."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Newbie Guide:<br>
Thank you. Hunt 20 from either Longtail Keltirs , Elder Longtail Keltirs, or Black Wolves.<br1>
Get going.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10989_DangerousPredators TELEPORT_TO_HUNTING_GROUND">"Go to the hunting ground."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Priest of the Earth Gerald:<br>
I heard the Captain Bathis from Gludio Castle has been looking for tarantula by-products...
Are you interested?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction NEXT_QUEST">"I will try"</Button>
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Priest of the Earth Gerald:<br>
I heard about you from the Newbie Guide. You kicked out those rats from around the village. This is a token of my appreciation. Please take it.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10989_DangerousPredators 30650-02.htm">Receive the item.</Button>
</body></html>

View File

@ -0,0 +1,192 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10989_DangerousPredators;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
/**
* Dangerous Predators (10989)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10989_DangerousPredators extends Quest
{
// NPCs
private static final int NEWBIE_GUIDE = 30601;
private static final int GERALD = 30650;
// Monsters
private static final int LONGTAIL_KELTIR = 20533;
private static final int ELDER_LONGTAIL_KELTIR = 20539;
private static final int BLACK_WOLF = 21983;
// Items
private static final ItemHolder SOE_TO_GERAILD = new ItemHolder(91650, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 10);
private static final ItemHolder RING_NOVICE = new ItemHolder(49041, 2);
private static final ItemHolder EARRING_NOVICE = new ItemHolder(49040, 2);
private static final ItemHolder NECKLACE_NOVICE = new ItemHolder(49039, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10989_DangerousPredators()
{
super(10989);
addStartNpc(NEWBIE_GUIDE);
addTalkId(NEWBIE_GUIDE, GERALD);
addKillId(LONGTAIL_KELTIR, ELDER_LONGTAIL_KELTIR, BLACK_WOLF);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_2_20_DANGEROUS_PREDATORS);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(115960, -174659, -960);
break;
}
case "30601-02.htm":
{
qs.startQuest();
htmltext = event;
break;
}
case "30650-02.htm":
{
if (qs.isStarted())
{
addExpAndSp(player, 260000, 6000);
giveItems(player, SOE_NOVICE);
giveItems(player, RING_NOVICE);
giveItems(player, EARRING_NOVICE);
giveItems(player, NECKLACE_NOVICE);
qs.exitQuest(false, true);
htmltext = event;
break;
}
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 20)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to return to Priest of the Earth Gerald.", 5000));
giveItems(killer, SOE_TO_GERAILD);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.KILL_WOLVES_AND_BEARDED_KELTIRS_2.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30601-01.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case NEWBIE_GUIDE:
{
if (qs.isCond(1))
{
htmltext = "30601-02.htm";
}
break;
}
case GERALD:
{
if (qs.isCond(2))
{
htmltext = "30650.htm";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == NEWBIE_GUIDE)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
}

View File

@ -0,0 +1,3 @@
<html><body>Newbie Guide:<br>
You do not meet the requirements of the quest (Quest is only available to 2-20 levels).
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Armor<br><br>
[Recommended Classes]<br>
Warrior(Humans)<br1>
Knight(Humans)<br1>
Elven Knight(Elves)<br1>
Palus Knight(Dark Elves)<br1>
Orc Raider(Orcs)<br1>
Scavenger(Dwarves)<br1>
Artisan(Dwarves)<br1>
Trooper(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction HeavyArmor.html">Receive (Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,12 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Outfit<br><br>
[Recommended Classes]<br>
Rogue(Humans)<br1>
Elven Scout(Elves)<br1>
Assassin(Dark Elves)<br1>
Orc Monk(Orcs)<br1>
Soul Finder(Jin Kamael))<br1>
Warder(Jin Kamael)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction LightArmor.html">Receive (Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,13 @@
<html><body>Captain Bathis:<br>
If you want to transfer to the following classes, I recommend Moonshadow Doublet<br><br>
[Recommended Classes]<br>
Wizard(Humans)<br1>
Cleric(Humans)<br1>
Elven Wizard(Elves)<br1>
Oracle(Elves)<br1>
Dark Wizard(Dark Elves)<br1>
Shillien Oracle(Dark Elves)<br1>
Orc Shaman(Orcs)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction Robe.html">Receive (Robe) Moonshadow Double Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332.html">Back</Button>
</body></html>

View File

@ -0,0 +1,9 @@
<html><body>Captain Bathis:<br>
You came from Dwarven Village?<br>
Oh, you brought Tarantulas Venom Sac.<br1>
One, two, three, four... Hm. 30. Great work.<br1>
Here is the reward. I told Priest Gerald about. Pick the one you need.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332-01.html">(Heavy Armor) Moonshadow Armor Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332-02.html">(Light Armor) Moonshadow Outfit Set</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30332-03.html">(Robe Armor) Moonshadow Double Set</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Priest of the Earth Gerald:<br>
Good thining.<br>
The venom is the Venom Sacs turns quickly, so take them directly to Captain Bathis. He will pay you for your work.<br>
Now you should head out to the hunting ground.<br1>
Please let me know if you are ready.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction TELEPORT_TO_HUNTING_GROUND">Im ready.</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Priest of the Earth Gerald:<br>
I heard that Captain Bathis is looking for Tarantulas Venom Sacs. I heard something about Maraku Werewolves, but Im not sure about details.<br>
He said he needed about 30. Would you like to give it a try?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10990_PoisonExtraction 30650-01.html">"I will do it"</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Armor.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Ourfit.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,315 @@
/*
* This file is part of the L2J Mobius project.
*
* This program 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.
*
* This program 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 quests.Q10990_PoisonExtraction;
import java.util.HashSet;
import java.util.Set;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.QuestSound;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.NpcLogListHolder;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.network.NpcStringId;
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
import org.l2jmobius.gameserver.network.serverpackets.classchange.ExRequestClassChangeUi;
/**
* Poison Extraction (10990)
* @author RobikBobik
* @Notee: Based on NA server September 2019
*/
public class Q10990_PoisonExtraction extends Quest
{
// NPCs
private static final int GERALD = 30650;
private static final int CAPTAIN_BATHIS = 30332;
// Monsters
private static final int HUNTER_TARANTULA = 20403;
private static final int PLUNDER_TARANTULA = 20508;
// Items
private static final ItemHolder SOE_TO_CAPTAIN_BATHIS = new ItemHolder(91651, 1);
private static final ItemHolder SOE_NOVICE = new ItemHolder(10650, 20);
private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 50);
private static final ItemHolder HP_POTS = new ItemHolder(91912, 50); // TODO: Finish Item
private static final ItemHolder RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT = new ItemHolder(91840, 1);
// HELMET FOR ALL ARMORS
private static final ItemHolder MOON_HELMET = new ItemHolder(7850, 1);
// HEAVY
private static final ItemHolder MOON_ARMOR = new ItemHolder(7851, 1);
private static final ItemHolder MOON_GAUNTLETS = new ItemHolder(7852, 1);
private static final ItemHolder MOON_BOOTS = new ItemHolder(7853, 1);
// LIGHT
private static final ItemHolder MOON_SHELL = new ItemHolder(7854, 1);
private static final ItemHolder MOON_LEATHER_GLOVES = new ItemHolder(7855, 1);
private static final ItemHolder MOON_SHOES = new ItemHolder(7856, 1);
// ROBE
private static final ItemHolder MOON_CAPE = new ItemHolder(7857, 1);
private static final ItemHolder MOON_SILK = new ItemHolder(7858, 1);
private static final ItemHolder MOON_SANDALS = new ItemHolder(7859, 1);
// Misc
private static final int MAX_LEVEL = 20;
private static final String KILL_COUNT_VAR = "KillCount";
public Q10990_PoisonExtraction()
{
super(10990);
addStartNpc(GERALD);
addTalkId(GERALD, CAPTAIN_BATHIS);
addKillId(HUNTER_TARANTULA, PLUNDER_TARANTULA);
addCondMaxLevel(MAX_LEVEL, "no_lvl.html");
setQuestNameNpcStringId(NpcStringId.LV_15_20_POISON_EXTRACTION);
}
@Override
public boolean checkPartyMember(Player member, Npc npc)
{
final QuestState qs = getQuestState(member, false);
return ((qs != null) && qs.isStarted());
}
@Override
public String onAdvEvent(String event, Npc npc, Player player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "30650-01.html":
{
qs.startQuest();
htmltext = event;
break;
}
case "30332-01.html":
{
htmltext = event;
break;
}
case "30332-02.html":
{
htmltext = event;
break;
}
case "30332-03.html":
{
htmltext = event;
break;
}
case "30332.html":
{
htmltext = event;
break;
}
case "TELEPORT_TO_HUNTING_GROUND":
{
player.teleToLocation(135382, -207694, -3704);
break;
}
case "NEXT_QUEST":
{
htmltext = "30650.htm";
break;
}
case "HeavyArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_ARMOR);
giveItems(player, MOON_GAUNTLETS);
giveItems(player, MOON_BOOTS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "LightArmor.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_SHELL);
giveItems(player, MOON_LEATHER_GLOVES);
giveItems(player, MOON_SHOES);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "Robe.html":
{
if (qs.isStarted())
{
addExpAndSp(player, 600000, 13500);
giveItems(player, SOE_NOVICE);
giveItems(player, SPIRIT_ORE);
giveItems(player, HP_POTS);
giveItems(player, RICE_CAKE_OF_FLAMING_FIGHTING_SPIRIT_EVENT);
giveItems(player, MOON_HELMET);
giveItems(player, MOON_CAPE);
giveItems(player, MOON_SILK);
giveItems(player, MOON_SANDALS);
if (CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
showOnScreenMsg(player, NpcStringId.YOU_VE_FINISHED_THE_TUTORIAL_NTAKE_YOUR_1ST_CLASS_TRANSFER_AND_COMPLETE_YOUR_TRAINING_WITH_BATHIS_TO_BECOME_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000);
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
}
return htmltext;
}
@Override
public String onKill(Npc npc, Player killer, boolean isSummon)
{
final QuestState qs = getQuestState(killer, false);
if ((qs != null) && qs.isCond(1))
{
final int killCount = qs.getInt(KILL_COUNT_VAR) + 1;
if (killCount < 30)
{
qs.set(KILL_COUNT_VAR, killCount);
playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
sendNpcLogList(killer);
}
else
{
qs.setCond(2, true);
qs.unset(KILL_COUNT_VAR);
killer.sendPacket(new ExShowScreenMessage("You hunted all monsters.#Use the Scroll of Escape in you inventory to go to Captain Bathis in the Town of Gludio.", 5000));
giveItems(killer, SOE_TO_CAPTAIN_BATHIS);
}
}
return super.onKill(npc, killer, isSummon);
}
@Override
public Set<NpcLogListHolder> getNpcLogList(Player player)
{
final QuestState qs = getQuestState(player, false);
if ((qs != null) && qs.isCond(1))
{
final Set<NpcLogListHolder> holder = new HashSet<>();
holder.add(new NpcLogListHolder(NpcStringId.LV_15_20_POISON_EXTRACTION_IN_PROGRESS.getId(), true, qs.getInt(KILL_COUNT_VAR)));
return holder;
}
return super.getNpcLogList(player);
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
if (qs.isCreated())
{
htmltext = "30650.htm";
}
else if (qs.isStarted())
{
switch (npc.getId())
{
case GERALD:
{
if (qs.isCond(1))
{
htmltext = "30650-01.html";
}
break;
}
case CAPTAIN_BATHIS:
{
if (qs.isCond(2))
{
htmltext = "30332.html";
}
break;
}
}
}
else if (qs.isCompleted())
{
if (npc.getId() == GERALD)
{
htmltext = getAlreadyCompletedMsg(player);
}
}
return htmltext;
}
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
public void onPlayerLogin(OnPlayerLogin event)
{
final Player player = event.getPlayer();
if (player == null)
{
return;
}
if (!CategoryData.getInstance().isInCategory(CategoryType.FIRST_CLASS_GROUP, player.getClassId().getId()))
{
return;
}
final QuestState qs = getQuestState(player, false);
if (Config.DISABLE_TUTORIAL || ((qs != null) && qs.isCompleted()))
{
player.sendPacket(ExRequestClassChangeUi.STATIC_PACKET);
}
}
}

View File

@ -0,0 +1,5 @@
<html><body>Captain Bathis:<br>
You picked Moonshadow Robe.<br><br>
You are getting stronger very quickly, so if you have reached <font color=LEVEL>level 20</font>, go to the village and start your <font color=LEVEL>class transfer</font>. You will get even stronger.<br>
I ve prepared a few things for you. Hope that the <font color=LEVEL>HP Potions</font>, and the <font color=LEVEL>Rice Cake of Flaming Fighting Spirit</font> are useful.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Priest of the Earth Gerald:<br>
You do not meet the requirements of the quest (Quest is only available to 15-20 levels).
</body></html>

Some files were not shown because too many files have changed in this diff Show More