Q10385_RedThreadOfFate improvements.

Contributed by Stayway.
This commit is contained in:
MobiusDev 2016-03-29 06:25:39 +00:00
parent 901d2a858b
commit 090ac70e0b
16 changed files with 210 additions and 49 deletions

View File

@ -10,8 +10,5 @@
<spawn npcId="33749" x="210312" y="13768" z="-3754" heading="0" respawn="0" />
<spawn npcId="30031" x="210344" y="16024" z="-3748" heading="0" respawn="0" />
</group>
<group name="dark">
<spawn npcId="33751" x="209372" y="15037" z="-3729" heading="0" respawn="0" />
</group>
</spawnlist>
</instance>

View File

@ -0,0 +1,3 @@
<html><body>Darin:<br>
The village is untouched, as you can see.<br><font color="LEVEL">Roxxy</font> has been worrying about ominous winds lately, and she doesn't need strangers coming in here spreading unlucky rumors. Get out!
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Roxxy:<br>
If you really know something about this village, <font color="LEVEL">High Priest Biotin</font> would have greeted you.
</body></html>

View File

@ -16,9 +16,11 @@
*/
package instances.TalkingIsland;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
@ -26,6 +28,7 @@ import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.network.NpcStringId;
import com.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
@ -46,10 +49,12 @@ public class TalkingIsland extends AbstractInstance
// Skill
private static final SkillHolder NPC_TREE = new SkillHolder(9579, 1);
// Locations
private static final Location DARK_KNIGHT_LOC = new Location(209372, 15037, -3729, 0);
private static final Location START_LOC = new Location(210705, 13259, -3754);
private static final Location EXIT_LOC = new Location(-113647, 246016, -3696);
// Instance
private static final int TEMPLATE_ID = 241;
private static final int ZONE = 33751;
class TIWorld extends InstanceWorld
{
@ -63,6 +68,7 @@ public class TalkingIsland extends AbstractInstance
addFirstTalkId(DARIN, ROXXY, BIOTIN, DARK_KNIGHT);
addSkillSeeId(MOTHER_TREE);
addSpawnId(DARK_KNIGHT);
addEnterZoneId(ZONE);
}
@Override
@ -84,13 +90,7 @@ public class TalkingIsland extends AbstractInstance
if (qs.isCond(20) && (player.getInstanceId() == world.getInstanceId()))
{
qs.setCond(21);
spawnGroup("dark", world.getInstanceId());
showOnScreenMsg(player, NpcStringId.GO_OUTSIDE_THE_TEMPLE, ExShowScreenMessage.TOP_CENTER, 4500);
final double distance = npc.calculateDistance(player, false, false);
if ((distance <= 200))
{
showOnScreenMsg(player, NpcStringId.A_MYSTERIOUS_DARK_KNIGHT_IS_HERE, ExShowScreenMessage.TOP_CENTER, 4500);
}
return "30031-03.html";
}
break;
@ -108,6 +108,8 @@ public class TalkingIsland extends AbstractInstance
if (qs.isCond(19))
{
showOnScreenMsg(player, NpcStringId.SPEAK_WITH_ROXXY, ExShowScreenMessage.TOP_CENTER, 4500);
qs.setMemoState(1);
return "33748-03.html";
}
break;
}
@ -115,11 +117,19 @@ public class TalkingIsland extends AbstractInstance
{
qs.setCond(22);
{
teleportPlayer(player, EXIT_LOC, 0);
player.showQuestMovie(75);
player.setMovieId(75);
player.setIsTeleporting(true, false);
startQuestTimer("TELEPORT", 38000, npc, player);
break;
}
}
case "TELEPORT":
{
teleportPlayer(player, EXIT_LOC, 0);
break;
}
}
return htmltext;
}
@ -127,6 +137,7 @@ public class TalkingIsland extends AbstractInstance
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
final TIWorld world = (TIWorld) InstanceManager.getInstance().getWorld(npc.getInstanceId());
final QuestState qs = player.getQuestState(Q10385_RedThreadOfFate.class.getSimpleName());
String htmltext = null;
@ -151,6 +162,10 @@ public class TalkingIsland extends AbstractInstance
qs.setCond(20);
htmltext = "33749-02.html";
}
else if (qs.isCond(20))
{
htmltext = "33749-03.html";
}
break;
}
case BIOTIN:
@ -167,10 +182,15 @@ public class TalkingIsland extends AbstractInstance
{
htmltext = "33751-02.html";
}
if (qs.isCond(22))
{
InstanceManager.getInstance().getInstance(world.getInstanceId()).setDuration(38000);
InstanceManager.getInstance().getInstance(world.getInstanceId()).setEmptyDestroyTime(0);
world.removeAllowed(player.getObjectId());
}
break;
}
}
break;
}
}
return htmltext;
@ -187,10 +207,14 @@ public class TalkingIsland extends AbstractInstance
{
case DARIN:
{
if (qs.isCond(19))
if ((qs.isCond(19)) && qs.isMemoState(0))
{
htmltext = "33748-01.html";
}
else if ((qs.isCond(19)) && qs.isMemoState(1))
{
htmltext = "33748-04.html";
}
break;
}
case ROXXY:
@ -199,6 +223,10 @@ public class TalkingIsland extends AbstractInstance
{
htmltext = "33749-01.html";
}
else if (qs.isCond(20))
{
htmltext = "33749-03.html";
}
break;
}
case BIOTIN:
@ -238,6 +266,25 @@ public class TalkingIsland extends AbstractInstance
return null;
}
@Override
public String onEnterZone(L2Character character, L2ZoneType zone)
{
if (character.isPlayer())
{
final L2PcInstance player = character.getActingPlayer();
final TIWorld world = (TIWorld) InstanceManager.getInstance().getWorld(character.getInstanceId());
final QuestState qs = player.getQuestState(Q10385_RedThreadOfFate.class.getSimpleName());
if ((qs != null) && qs.isCond(21))
{
world.dark = addSpawn(DARK_KNIGHT, DARK_KNIGHT_LOC, false, 0, false, world.getInstanceId());
world.dark.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
showOnScreenMsg(player, NpcStringId.A_MYSTERIOUS_DARK_KNIGHT_IS_HERE, ExShowScreenMessage.TOP_CENTER, 4500);
}
return super.onEnterZone(character, zone);
}
return null;
}
@Override
public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance)
{

View File

@ -0,0 +1,3 @@
<html><body>Nerupa:<br>
Didn't you say you were off to find Enfeux? Hurry along to the <font color="LEVEL">Valley of Saints</font>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Alchemist's Mixing Urn:<br>
After rummaging through the jar, you found nothing valuable. Go back to the Blacksmith of Flame, Vulcan, through Magic Trader Wesley.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Enfeux:<br>
Return to the <font color="LEVEL">Town of Rune</font> and ask <font color="LEVEL">High Priest Innocentin</font> at Einhasad Temple about the gem.
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Vulcan, Blacksmith of the Flame:<br>
You forgot what to do?<br1>
Go to the <font color="LEVEL">basement floor of the Ivory Tower where all the shops are</font>, and you will see an <font color="LEVEL">Alchemist's Mixing Urn</font>. Put in all the ingredients I gave you and mix them.<br>
On your way back here, tell <font color="LEVEL">Magic Trader Wesley</font> that I sent you there. Then he will send you back here with his scroll.
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Vulcan, Blacksmith of the Flame:<br>
Now that you have what you wanted from me, you will just walk away? Please bury my letter in the <font color="LEVEL">Dwarven Village</font> for my poor wife who was killed by the Earth Wyrm.
</body></html>

View File

@ -1,5 +1,5 @@
<html><body>Heine Water Source:<br>
Clean-looking water.<br>
Not sure, if this is the Clearest Water, but try scooping the water.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10385_RedThreadOfFate TP2">"I'll try scooping the water."</button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10385_RedThreadOfFate">"I'll try scooping the water."</button>
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>The Altar of Shilen:<br>
The stone statue of Shilen stands before you, dark and foreboding despite its inanimate nature.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body<Deserted Dwarven House:<br>
Abandoned house at the Dwarven Village, destroyed by the Earth Wyrm.<br>
Along with Talking Island Village, the Dwarven Village was the most severely damaged by the wakening of the Goddess of Destruction.
</body></html>

View File

@ -0,0 +1,4 @@
<html><body>Pa'agrio Temple:<br>
Pa'agrio Temple. Its doors are sealed shut. <br>
The Orcs have now lost their anchor in this vast world...
</body></html>

View File

@ -0,0 +1,3 @@
<html><body>Cave of Souls:<br>
Kamaels were created here before the waking of the Goddess of Destruction. The place is desolate now, with rocks crumbled down.
</body></html>

View File

@ -59,7 +59,6 @@ public class Q10385_RedThreadOfFate extends Quest
private static final int SHILEN = 33785;
private static final int SOULS = 33789;
private static final int MOTHER_TREE = 33786;
// Items
private static final int MYSTERIOUS_LETTER = 36072;
private static final int WATER_GARDEN_OF_EVA = 36066;
@ -99,11 +98,12 @@ public class Q10385_RedThreadOfFate extends Quest
super(10385, Q10385_RedThreadOfFate.class.getSimpleName(), "Red Thread of Fate");
addStartNpc(RAINA);
addTalkId(RAINA, MORELYN, LANYA, WATER_SOURCE, LADY_OF_THE_LAKE, NERUPA, ENFEUX, INNOCENTIN, VULCAN, URN, WESLEY, HOUSE, PAAGRIO_TEMPLE, SHILEN, SOULS, MOTHER_TREE);
addFirstTalkId(LANYA, HOUSE, PAAGRIO_TEMPLE, SHILEN, SOULS, MOTHER_TREE);
addFirstTalkId(LANYA, WATER_SOURCE, HOUSE, PAAGRIO_TEMPLE, SHILEN, SOULS, MOTHER_TREE);
addSocialActionSeeId(LANYA);
addSkillSeeId(HOUSE, PAAGRIO_TEMPLE, SHILEN, SOULS, MOTHER_TREE);
registerQuestItems(MYSTERIOUS_LETTER, WATER_GARDEN_OF_EVA, CLEAREST_WATER, PUREST_SOUL, VULCAN_TRUE_GOLD, VULCAN_PURE_SILVER, VULCAN_BLOOD_FIRE, FIERCEST_FLAME, FONDEST_HEART, SCROLL_OF_ESCAPE_VOA, SCROLL_OF_ESCAPE_FOG, SCROLL_OF_ESCAPE_IT, SCROLL_OF_ESCAPE_DV);
addKillId(SHILEN_MESSENGER);
addAttackId(SHILEN_MESSENGER);
addSpawnId(SHILEN_MESSENGER);
addCondNotRace(Race.ERTHEIA, "noRace.html");
addCondCompletedQuest(Q10338_SeizeYourDestiny.class.getSimpleName(), "restriction.html");
@ -180,16 +180,6 @@ public class Q10385_RedThreadOfFate extends Quest
}
break;
}
case "TP2":
{
if (qs.isCond(5))
{
qs.setCond(6);
player.teleToLocation(WATER_LOC, 0);
giveItems(player, WATER_GARDEN_OF_EVA, 1);
}
break;
}
case "31745-03.html":
{
if (qs.isCond(6))
@ -227,6 +217,7 @@ public class Q10385_RedThreadOfFate extends Quest
{
qs.setCond(9);
giveItems(player, PUREST_SOUL, 1);
htmltext = "31519-02.html";
}
break;
}
@ -236,6 +227,7 @@ public class Q10385_RedThreadOfFate extends Quest
{
qs.setCond(10);
giveItems(player, SCROLL_OF_ESCAPE_FOG, 1);
htmltext = "31328-02.html";
showOnScreenMsg(player, NpcStringId.TRY_USING_THE_TELEPORT_SCROLL_INNOCENTIN_GAVE_YOU_TO_GO_TO_THE_FORGE_OF_THE_GODS, ExShowScreenMessage.TOP_CENTER, 4500);
}
break;
@ -249,6 +241,7 @@ public class Q10385_RedThreadOfFate extends Quest
giveItems(player, VULCAN_TRUE_GOLD, 1);
giveItems(player, VULCAN_PURE_SILVER, 1);
giveItems(player, VULCAN_BLOOD_FIRE, 1);
htmltext = "31539-04.html";
showOnScreenMsg(player, NpcStringId.TRY_USING_THE_TELEPORT_SCROLL_VULCAN_GAVE_YOU_TO_GO_TO_IVORY_TOWER, ExShowScreenMessage.TOP_CENTER, 4500);
}
break;
@ -291,6 +284,7 @@ public class Q10385_RedThreadOfFate extends Quest
giveItems(player, SCROLL_OF_ESCAPE_DV, 1);
giveItems(player, FIERCEST_FLAME, 1);
giveItems(player, FONDEST_HEART, 1);
htmltext = "31539-08.html";
}
break;
}
@ -311,38 +305,54 @@ public class Q10385_RedThreadOfFate extends Quest
{
case 14:
{
castSkill(npc, player, NPC_HOUSE.getSkill());
qs.setCond(15);
break;
if (skill.getId() == NPC_HOUSE.getSkillId())
{
castSkill(npc, player, NPC_HOUSE.getSkill());
qs.setCond(15);
break;
}
}
case 15:
{
castSkill(npc, player, NPC_PAAGRIO.getSkill());
qs.setCond(16);
break;
if (skill.getId() == NPC_PAAGRIO.getSkillId())
{
castSkill(npc, player, NPC_PAAGRIO.getSkill());
qs.setCond(16);
break;
}
}
case 16:
{
castSkill(npc, player, NPC_SHILEN.getSkill());
addAttackDesire(addSpawn(SHILEN_MESSENGER, npc, true, 0, false), player);
showOnScreenMsg(player, NpcStringId.YOU_MUST_DEFEAT_SHILEN_S_MESSENGER, ExShowScreenMessage.TOP_CENTER, 4500);
startQuestTimer("DESPAWN", 10000, npc, player);
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.BRIGHTEST_LIGHT_HOW_DARE_YOU_DESECRATE_THE_ALTAR_OF_SHILEN));
qs.setCond(17);
break;
if (skill.getId() == NPC_SHILEN.getSkillId())
{
castSkill(npc, player, NPC_SHILEN.getSkill());
addAttackDesire(addSpawn(SHILEN_MESSENGER, npc, true, 0, false), player);
showOnScreenMsg(player, NpcStringId.YOU_MUST_DEFEAT_SHILEN_S_MESSENGER, ExShowScreenMessage.TOP_CENTER, 4500);
startQuestTimer("DESPAWN", 10000, npc, player);
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), NpcStringId.BRIGHTEST_LIGHT_HOW_DARE_YOU_DESECRATE_THE_ALTAR_OF_SHILEN));
qs.setCond(17);
break;
}
}
case 17:
{
castSkill(npc, player, NPC_SOULS.getSkill());
qs.setCond(18);
break;
if (skill.getId() == NPC_SOULS.getSkillId())
{
castSkill(npc, player, NPC_SOULS.getSkill());
qs.setCond(18);
break;
}
}
case 18:
{
castSkill(npc, player, NPC_TREE.getSkill());
qs.setCond(19);
break;
if (skill.getId() == NPC_TREE.getSkillId())
{
castSkill(npc, player, NPC_TREE.getSkill());
qs.setCond(19);
break;
}
}
return null;
}
return null;
}
@ -424,13 +434,27 @@ public class Q10385_RedThreadOfFate extends Quest
}
break;
}
case WATER_SOURCE:
{
if (qs.isCond(5))
{
htmltext = "33784-01.html";
}
break;
}
case HOUSE:
{
if (qs.isCond(14))
{
htmltext = "33788-01.html";
showOnScreenMsg(player, NpcStringId.USE_THE_FONDEST_HEART_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
}
else if (qs.isCond(15))
{
{
htmltext = "33788-02.html";
}
}
showOnScreenMsg(player, NpcStringId.USE_THE_FONDEST_HEART_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
break;
}
case PAAGRIO_TEMPLE:
@ -438,8 +462,14 @@ public class Q10385_RedThreadOfFate extends Quest
if (qs.isCond(15))
{
htmltext = "33787-01.html";
showOnScreenMsg(player, NpcStringId.USE_THE_FIERCEST_FLAME_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
}
else if (qs.isCond(16))
{
{
htmltext = "33787-02.html";
}
}
showOnScreenMsg(player, NpcStringId.USE_THE_FIERCEST_FLAME_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
break;
}
case SHILEN:
@ -447,8 +477,14 @@ public class Q10385_RedThreadOfFate extends Quest
if (qs.isCond(16))
{
htmltext = "33785-01.html";
showOnScreenMsg(player, NpcStringId.USE_THE_BRIGHTEST_LIGHT_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
}
else if (qs.isCond(17))
{
{
htmltext = "33785-02.html";
}
}
showOnScreenMsg(player, NpcStringId.USE_THE_BRIGHTEST_LIGHT_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
break;
}
case SOULS:
@ -456,8 +492,14 @@ public class Q10385_RedThreadOfFate extends Quest
if (qs.isCond(17))
{
htmltext = "33789-01.html";
showOnScreenMsg(player, NpcStringId.USE_THE_PUREST_SOUL_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
}
else if (qs.isCond(18))
{
{
htmltext = "33789-02.html";
}
}
showOnScreenMsg(player, NpcStringId.USE_THE_PUREST_SOUL_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 4500);
break;
}
case MOTHER_TREE:
@ -526,7 +568,9 @@ public class Q10385_RedThreadOfFate extends Quest
{
if (qs.isCond(5))
{
htmltext = "33784-01.html";
qs.setCond(6);
player.teleToLocation(WATER_LOC, 0);
giveItems(player, WATER_GARDEN_OF_EVA, 1);
}
break;
}
@ -544,6 +588,12 @@ public class Q10385_RedThreadOfFate extends Quest
{
htmltext = "30370-01.html";
}
else if (qs.isCond(8))
{
{
htmltext = "30370-05.html";
}
}
break;
}
case ENFEUX:
@ -552,6 +602,12 @@ public class Q10385_RedThreadOfFate extends Quest
{
htmltext = "31519-01.html";
}
else if (qs.isCond(9))
{
{
htmltext = "31519-03.html";
}
}
break;
}
case INNOCENTIN:
@ -572,10 +628,18 @@ public class Q10385_RedThreadOfFate extends Quest
{
htmltext = "31539-01.html";
}
else if (qs.isCond(11))
{
htmltext = "31539-09.html";
}
else if (qs.isCond(13))
{
htmltext = "31539-05.html";
}
else if (qs.isCond(14))
{
htmltext = "31539-10.html";
}
break;
}
case URN:
@ -584,6 +648,10 @@ public class Q10385_RedThreadOfFate extends Quest
{
htmltext = "31149-01.html";
}
else if (qs.isCond(12))
{
htmltext = "31149-03.html";
}
break;
}
case WESLEY:

View File

@ -245,6 +245,18 @@
<node X="-114536" Y="257336" />
<node X="-114520" Y="257496" />
</zone>
<zone name="talking_island_dark_knight" id="33751" type="ScriptZone" shape="NPoly" minZ="-3755" maxZ="-3685">
<node X="209431" Y="15217" />
<node X="209336" Y="15536" />
<node X="210171" Y="16373" />
<node X="210005" Y="16484" />
<node X="207353" Y="13443" />
<node X="210664" Y="10363" />
<node X="212533" Y="12276" />
<node X="213840" Y="13987" />
<node X="210597" Y="16835" />
<node X="210049" Y="16529" />
</zone>
<zone name="ye_sagira_ruins_movie_zone" id="10361" type="ScriptZone" shape="NPoly" minZ="-1700" maxZ="-1637">
<node X="-115086" Y="230896" />
<node X="-115448" Y="230009" />