Quest Seeker Escort (10365).

This commit is contained in:
MobiusDev 2015-08-03 23:17:49 +00:00
parent 954a9681ce
commit d91c9acb1b
14 changed files with 374 additions and 1 deletions

View File

@ -0,0 +1,4 @@
<html><body>Dep:<br>
Why did the giants fight against the Gods? If they had stayed peaceful, they would have had all the races under their control...<br>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Sebion:<br>
Is that... is it King? Oh, it IS him! It's Kingy-wingy! Aren't you a cute little guy? Oh yes you are.<br>
I'm injured, but I can still keep an eye on King while you're gone. I mean, it's not as if I can patrol. Kingy-wingy's going to take a nice little nappy-kins too, aren't you? Oh, yes you are!<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10365_SeekerEscort 32978-02.html">"I'll leave you two to it."</Button>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Sebion:<br>
I'm no use out here, with this injury. I'd better get back to town. King's coming too, aren't you? Say bye-bye, now King! You hear that, adventurer? He practically talks.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Sebion:<br>
I'm planning to take King back to town. He's fine, don't worry.<br>
(Quest already completed.)
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Dep:<br>
Sigh... This is not good. All there is left is this kid.<br1>
What am I talking about? The Bloodhound! I had 10 when I first came... They all became monster food, and now all I have left is this one... King, say "hi"!<br>
(King barks at you.)<br1>
King has to survive... It's too much to bear. Help me. King, ask him to help you too.<br1>
(King whines at you.)<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10365_SeekerEscort 33453-02.htm">"Er, can I help you?"</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Dep:<br>
Yes. I want you to take King here to somewhere far away... to Sebion!<br>
Sebion will be able to take care of King much better than me. Right, King?<br1>
(King barks.)<br1>
Ha - see! He knows where to find Sebion, could you just follow him and make sure he gets there safe?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10365_SeekerEscort 33453-03.html">"Sure."</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Dep:<br>
Thank you!<br1>
<font color="LEVEL">Sebion</font> is in <font color="LEVEL">Exploration Zone 5</font>. You just need to follow King, and he'll guide you to Sebion.<br>
Listen, friend. King cannot come back here. You hear that King? You can't come back! It's not safe!
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Dep:<br>
Don't take your eyes off King! If he loses you, he'll just come back to me! It's not safe here!<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10365_SeekerEscort SPAWN_BLOODHOUND">"Okay. Got it"</Button>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Dep:<br>
<font color="LEVEL">Sebion</font> is in <font color="LEVEL">Exploration Zone 5</font>. Just follow King and you'll bump into Sebion.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Dep:<br>
How is King doing? I miss his little face...<br>
(This quest has already been completed.)
</body></html>

View File

@ -0,0 +1,320 @@
/*
* Copyright (C) 2004-2015 L2J DataPack
*
* This file is part of L2J DataPack.
*
* L2J DataPack is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* L2J DataPack is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package quests.Q10365_SeekerEscort;
import com.l2jserver.gameserver.enums.ChatType;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Npc;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.model.quest.QuestState;
import com.l2jserver.gameserver.model.quest.State;
import com.l2jserver.gameserver.network.NpcStringId;
import com.l2jserver.gameserver.network.serverpackets.ExRotation;
import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage;
import com.l2jserver.gameserver.network.serverpackets.NpcSay;
import com.l2jserver.gameserver.util.Util;
/**
* Seeker Escort (10365)
* @author Mobius
*/
public final class Q10365_SeekerEscort extends Quest
{
// NPCs
private static final int SEBION = 32978;
private static final int BLOODHOUND = 32988;
private static final int DEP = 33453;
// Locations
private static final Location BLOODHOUND_LOC1_SPAWN = new Location(-110579, 238972, -2920);
private static final Location BLOODHOUND_LOC2_SPAWN = new Location(-112665, 233944, -3072);
private final static Location[] BLOODHOUND_PATH1_COORDS =
{
new Location(-110579, 238972, -2920),
new Location(-110706, 239273, -2920),
new Location(-110962, 239513, -2920),
new Location(-110988, 239944, -2920),
new Location(-110759, 240185, -2920),
new Location(-110794, 240551, -2920),
new Location(-111028, 240608, -2920),
new Location(-111295, 240387, -2920),
new Location(-111639, 239897, -2920),
new Location(-111948, 239731, -2920),
new Location(-112281, 239791, -2920),
new Location(-112622, 239901, -2920),
new Location(-112705, 240230, -2920),
new Location(-112473, 240518, -2920),
new Location(-112138, 240510, -2920),
new Location(-112022, 240281, -2920),
new Location(-112212, 240154, -2920),
};
private final static Location[] BLOODHOUND_PATH2_COORDS =
{
new Location(-112665, 233944, -3072),
new Location(-112431, 233681, -3096),
new Location(-112185, 233480, -3120),
new Location(-112117, 233092, -3136),
new Location(-112415, 232911, -3096),
new Location(-112705, 232543, -3072),
new Location(-112505, 232054, -3096),
new Location(-112284, 232075, -3104),
new Location(-112078, 232350, -3136),
new Location(-111685, 232600, -3168),
new Location(-111215, 232725, -3224),
new Location(-110822, 232470, -3256),
new Location(-110769, 232134, -3256),
new Location(-111156, 231852, -3224),
new Location(-111475, 231982, -3200),
new Location(-111672, 231945, -3168),
};
// Others
private static final int MIN_LEVEL = 16;
private static final int MAX_LEVEL = 25;
public Q10365_SeekerEscort()
{
super(10365, Q10365_SeekerEscort.class.getSimpleName(), "Seeker Escort");
addStartNpc(DEP);
addTalkId(DEP, SEBION);
addSpawnId(BLOODHOUND);
addMoveFinishedId(BLOODHOUND);
addCondLevel(MIN_LEVEL, MAX_LEVEL, "no_level.html");
// addCondCompletedQuest(Q10364_ObligationsOfTheSeeker.class.getSimpleName(), "no_level.html");
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "33453-02.htm":
{
htmltext = event;
break;
}
case "33453-03.html":
{
qs.startQuest();
qs.setMemoState(2);
final L2Npc bloodhound = addSpawn(BLOODHOUND, BLOODHOUND_LOC1_SPAWN, false, 300000);
startQuestTimer("MOVE_DELAY", 500, bloodhound, player);
htmltext = event;
break;
}
case "32978-02.html":
{
if (qs.isCond(2))
{
giveAdena(player, 65000, true);
addExpAndSp(player, 120000, 28);
qs.exitQuest(false, true);
htmltext = event;
}
break;
}
case "SPAWN_BLOODHOUND":
{
qs.setMemoState(2);
final L2Npc bloodhound = addSpawn(BLOODHOUND, BLOODHOUND_LOC1_SPAWN, false, 300000);
startQuestTimer("MOVE_DELAY", 500, bloodhound, player);
break;
}
case "CHECK_PLAYER":
{
final L2PcInstance owner = npc.getSummoner().getActingPlayer();
if (owner != null)
{
if (npc.calculateDistance(owner, false, false) < 180)
{
npc.getVariables().set("FAIL_COUNT", 0);
final int loc_index = npc.getVariables().getInt("MOVE_INDEX", -1) + 1;
if (loc_index > 0)
{
if (qs.isMemoState(2))
{
if (loc_index == 16)
{
showOnScreenMsg(player, NpcStringId.YOU_MUST_MOVE_TO_EXPLORATION_AREA_5_IN_ORDER_TO_CONTINUE, ExShowScreenMessage.TOP_CENTER, 5000);
startQuestTimer("DELETE_NPC", 3000, npc, owner);
startQuestTimer("NEXT_AREA", 7000, npc, owner);
break;
}
npc.getVariables().set("MOVE_INDEX", loc_index);
addMoveToDesire(npc, BLOODHOUND_PATH1_COORDS[loc_index], 0);
}
else if (qs.isMemoState(3))
{
if (loc_index == 16)
{
qs.setCond(2);
startQuestTimer("DELETE_NPC", 3000, npc, owner);
break;
}
npc.getVariables().set("MOVE_INDEX", loc_index);
addMoveToDesire(npc, BLOODHOUND_PATH2_COORDS[loc_index], 0);
}
}
}
else
{
final int failCount = npc.getVariables().getInt("FAIL_COUNT", 0);
npc.getVariables().set("FAIL_COUNT", failCount + 1);
if (failCount >= 30)
{
qs.setMemoState(1);
showOnScreenMsg(player, NpcStringId.KING_HAS_RETURNED_TO_DEF_RETURN_TO_DEF_AND_START_AGAIN, ExShowScreenMessage.TOP_CENTER, 5000);
npc.deleteMe();
break;
}
startQuestTimer("CHECK_PLAYER", 1000, npc, owner);
if (getRandom(100) < 10)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.RUFF_RUFF_RRRRRR));
}
}
}
else
{
npc.deleteMe();
}
break;
}
case "MOVE_DELAY":
{
if (qs.isMemoState(2))
{
npc.setSummoner(player);
npc.setIsRunning(true);
npc.broadcastInfo();
addMoveToDesire(npc, BLOODHOUND_PATH1_COORDS[0], 0);
npc.getVariables().set("MOVE_INDEX", 0);
break;
}
else if (qs.isMemoState(3))
{
npc.setSummoner(player);
npc.setIsRunning(true);
npc.broadcastInfo();
addMoveToDesire(npc, BLOODHOUND_PATH2_COORDS[0], 0);
npc.getVariables().set("MOVE_INDEX", 0);
break;
}
break;
}
case "DELETE_NPC":
{
npc.deleteMe();
break;
}
case "NEXT_AREA":
{
qs.setMemoState(3);
final L2Npc bloodhound = addSpawn(BLOODHOUND, BLOODHOUND_LOC2_SPAWN, false, 300000);
player.teleToLocation(BLOODHOUND_LOC2_SPAWN);
startQuestTimer("MOVE_DELAY", 1000, bloodhound, player);
break;
}
}
return htmltext;
}
@Override
public void onMoveFinished(L2Npc npc)
{
final L2PcInstance owner = npc.getSummoner().getActingPlayer();
if (owner != null)
{
showOnScreenMsg(owner, NpcStringId.CATCH_UP_TO_KING_HE_S_WAITING, ExShowScreenMessage.TOP_CENTER, 5000);
npc.setHeading(Util.calculateHeadingFrom(npc, owner));
npc.broadcastPacket(new ExRotation(npc.getObjectId(), npc.getHeading()));
startQuestTimer("CHECK_PLAYER", 1000, npc, owner);
}
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, true);
String htmltext = null;
switch (qs.getState())
{
case State.CREATED:
{
if (npc.getId() == DEP)
{
htmltext = "33453-01.htm";
break;
}
break;
}
case State.STARTED:
{
if (npc.getId() == DEP)
{
if (qs.isCond(1))
{
if (qs.isMemoState(1))
{
htmltext = "33453-04.html";
}
else
{
htmltext = "33453-05.html";
}
break;
}
break;
}
else if (npc.getId() == SEBION)
{
if (qs.isCond(2))
{
htmltext = "32978-01.html";
}
break;
}
break;
}
case State.COMPLETED:
{
if (npc.getId() == SEBION)
{
htmltext = "32978-03.html";
}
else
{
htmltext = "33453-06.html";
}
break;
}
}
return htmltext;
}
}

View File

@ -0,0 +1,4 @@
<html><body>Dep:<br>
I can't just give King to anybody!<br>
(Only characters between level 16 and 25 can take this quest.)
</body></html>

View File

@ -201,6 +201,7 @@ import quests.Q10334_ReportingTheStatusOfWindmillHill.Q10334_ReportingTheStatusO
import quests.Q10335_RequestToFindSakum.Q10335_RequestToFindSakum;
import quests.Q10336_DividedSakumKanilov.Q10336_DividedSakumKanilov;
import quests.Q10338_SeizeYourDestiny.Q10338_SeizeYourDestiny;
import quests.Q10365_SeekerEscort.Q10365_SeekerEscort;
import quests.Q10390_KekropusLetter.Q10390_KekropusLetter;
import quests.Q10393_KekropusLetter_AClueCompleted.Q10393_KekropusLetter_AClueCompleted;
import quests.Q10397_KekropusLetter_ASuspiciousBadge.Q10397_KekropusLetter_ASuspiciousBadge;
@ -420,6 +421,7 @@ public class QuestMasterHandler
Q10335_RequestToFindSakum.class,
Q10336_DividedSakumKanilov.class,
Q10338_SeizeYourDestiny.class,
Q10365_SeekerEscort.class,
Q10390_KekropusLetter.class,
Q10393_KekropusLetter_AClueCompleted.class,
Q10397_KekropusLetter_ASuspiciousBadge.class,

View File

@ -2192,7 +2192,7 @@
</speed>
<hit_time>500</hit_time>
</stats>
<status attackable="false" />
<status attackable="false" talkable="false" targetable="false" />
<skill_list>
<skill id="4416" level="4" />
</skill_list>