Pailaka Injured Dragon improvements.

This commit is contained in:
MobiusDev
2018-04-27 16:03:12 +00:00
parent e096c1b5e4
commit 5d7c5d553a
11 changed files with 358 additions and 312 deletions

View File

@@ -1,5 +0,0 @@
<html><body>Ketra Orc Intelligence Officer:<br>
Dejakar Oroka!<br>
You hold the Spear of Silenos! Your coming was foretold.<br>
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
</body></html>

View File

@@ -1,3 +1,3 @@
<html><body>Ketra Orc Intelligence Officer:<br> <html><body>Ketra Orc Intelligence Officer:<br>
This weapon cant be upgraded! Here is more power than ever! This weapon cannot be upgraded! Here is more power than ever!
</body></html> </body></html>

View File

@@ -1,4 +1,6 @@
<html><body>Ketra Orc Intelligence Officer:<br> <html><body>Ketra Orc Intelligence Officer:<br>
Dejakar Oroka!<br>
You hold the Spear of Silenos! Your coming was foretold.<br>
If you have the Scroll of Enchant Weapon made with the blood of Silenos, I will perform a sacred ceremony to enhance the spear!<br> If you have the Scroll of Enchant Weapon made with the blood of Silenos, I will perform a sacred ceremony to enhance the spear!<br>
If you wish, I can also bestow on you some of our tribe's powerful enhancement magic!<br> If you wish, I can also bestow on you some of our tribe's powerful enhancement magic!<br>
<a action="bypass -h Quest Q00144_PailakaInjuredDragon 32509-02.html">Enhance the weapon.</a><br> <a action="bypass -h Quest Q00144_PailakaInjuredDragon 32509-02.html">Enhance the weapon.</a><br>

View File

@@ -20,12 +20,14 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.ai.CtrlEvent;
import com.l2jmobius.gameserver.ai.CtrlIntention; import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.data.xml.impl.SkillData; import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.enums.QuestSound;
import com.l2jmobius.gameserver.instancemanager.InstanceManager; import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.L2World; import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.Location;
@@ -35,6 +37,7 @@ import com.l2jmobius.gameserver.model.actor.L2Summon;
import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PetInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PetInstance;
import com.l2jmobius.gameserver.model.holders.ItemChanceHolder;
import com.l2jmobius.gameserver.model.instancezone.Instance; import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld; import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.model.quest.Quest; import com.l2jmobius.gameserver.model.quest.Quest;
@@ -42,35 +45,16 @@ import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State; import com.l2jmobius.gameserver.model.quest.State;
import com.l2jmobius.gameserver.model.zone.L2ZoneType; import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.SpecialCamera;
import com.l2jmobius.gameserver.util.Util; import com.l2jmobius.gameserver.util.Util;
/** /**
* Pailaka Injured Dragon (based on same quest by Synerge?) * Pailaka Injured Dragon
* @author Pandragon * @author Pandragon
*/ */
public class Q00144_PailakaInjuredDragon extends Quest public class Q00144_PailakaInjuredDragon extends Quest
{ {
private static final int MIN_LEVEL = 73; // NPCs
private static final int MAX_LEVEL = 77;
private static final int MAX_SUMMON_LEVEL = 80;
private static final int EXIT_TIME = 5;
private static final int INSTANCE_ID = 45;
static final Location TELEPORT = new Location(125757, -40928, -3736);
// @formatter:off
// NO EXIT ZONES
private static final Map<Integer, int[]> NOEXIT_ZONES = new HashMap<>();
static
{
NOEXIT_ZONES.put(200001, new int[]{123167, -45743, -3023});
NOEXIT_ZONES.put(200002, new int[]{117783, -46398, -2560});
NOEXIT_ZONES.put(200003, new int[]{116791, -51556, -2584});
NOEXIT_ZONES.put(200004, new int[]{117993, -52505, -2480});
NOEXIT_ZONES.put(200005, new int[]{113226, -44080, -2776});
NOEXIT_ZONES.put(200006, new int[]{110326, -45016, -2444});
NOEXIT_ZONES.put(200007, new int[]{118341, -55951, -2280});
NOEXIT_ZONES.put(200008, new int[]{110127, -41562, -2332});
}
// Npcs
private static final int KETRA_ORC_SHAMAN = 32499; private static final int KETRA_ORC_SHAMAN = 32499;
private static final int KETRA_ORC_SUPPORTER = 32502; private static final int KETRA_ORC_SUPPORTER = 32502;
private static final int KETRA_ORC_SUPPORTER2 = 32512; private static final int KETRA_ORC_SUPPORTER2 = 32512;
@@ -114,15 +98,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
// Rewards // Rewards
private static final int PSHIRT = 13296; private static final int PSHIRT = 13296;
private static final int SCROLL_OF_ESCAPE = 736; private static final int SCROLL_OF_ESCAPE = 736;
private static int buff_counter = 5;
// Arrays // Arrays
private static final int[] NPCS =
{
KETRA_ORC_SHAMAN,
KETRA_ORC_SUPPORTER,
KETRA_ORC_INTELIGENCE_OFFICER,
KETRA_ORC_SUPPORTER2
};
private static final int[] WALL_MONSTERS = private static final int[] WALL_MONSTERS =
{ {
// 1st Row Mobs // 1st Row Mobs
@@ -148,6 +124,11 @@ public class Q00144_PailakaInjuredDragon extends Quest
VARKA_SILENOS_MEDIUM, VARKA_SILENOS_MEDIUM,
VARKA_SILENOS_PRIEST VARKA_SILENOS_PRIEST
}; };
private static final List<ItemChanceHolder> DROPLIST = new ArrayList<>();
{
DROPLIST.add(new ItemChanceHolder(HEAL_POTION, 80));
DROPLIST.add(new ItemChanceHolder(SHIELD_POTION, 30));
}
private static final int[] OTHER_MONSTERS = private static final int[] OTHER_MONSTERS =
{ {
ANTYLOPE_1, ANTYLOPE_1,
@@ -165,6 +146,18 @@ public class Q00144_PailakaInjuredDragon extends Quest
SHIELD_POTION, SHIELD_POTION,
HEAL_POTION HEAL_POTION
}; };
// @formatter:off
private static final Map<Integer, int[]> NOEXIT_ZONES = new HashMap<>();
{
NOEXIT_ZONES.put(200001, new int[]{123167, -45743, -3023});
NOEXIT_ZONES.put(200002, new int[]{117783, -46398, -2560});
NOEXIT_ZONES.put(200003, new int[]{116791, -51556, -2584});
NOEXIT_ZONES.put(200004, new int[]{117993, -52505, -2480});
NOEXIT_ZONES.put(200005, new int[]{113226, -44080, -2776});
NOEXIT_ZONES.put(200006, new int[]{110326, -45016, -2444});
NOEXIT_ZONES.put(200007, new int[]{118341, -55951, -2280});
NOEXIT_ZONES.put(200008, new int[]{110127, -41562, -2332});
}
private static final int[][] BUFFS = private static final int[][] BUFFS =
{ {
{4357,2}, // Haste Lv2 {4357,2}, // Haste Lv2
@@ -180,56 +173,45 @@ public class Q00144_PailakaInjuredDragon extends Quest
{4354,4}, // Vampiric Rage Lv4 {4354,4}, // Vampiric Rage Lv4
{4347,6} // Blessed Body Lv6 {4347,6} // Blessed Body Lv6
}; };
private static final ArrayList<PailakaDrop> DROPLIST = new ArrayList<>();
static
{
DROPLIST.add(new PailakaDrop(HEAL_POTION, 80));
DROPLIST.add(new PailakaDrop(SHIELD_POTION, 30));
}
private static final int[][] HP_HERBS_DROPLIST = private static final int[][] HP_HERBS_DROPLIST =
{ {
// itemId, count, chance // itemId, count, chance
{ 8601, 1, 40 }, { 8600, 1, 70 } { 8601, 1, 40 },
{ 8600, 1, 70 }
}; };
private static final int[][] MP_HERBS_DROPLIST = private static final int[][] MP_HERBS_DROPLIST =
{ {
// itemId, count, chance // itemId, count, chance
{ 8604, 1, 40 }, { 8603, 1, 70 } { 8604, 1, 40 },
{ 8603, 1, 70 }
}; };
// @formatter:on // @formatter:on
static final Location TELEPORT = new Location(125757, -40928, -3736);
private static final int MIN_LEVEL = 73;
private static final int MAX_LEVEL = 77;
private static final int MAX_SUMMON_LEVEL = 80;
private static final int EXIT_TIME = 5;
private static final int INSTANCE_ID = 45;
private int buff_counter = 5;
public Q00144_PailakaInjuredDragon() public Q00144_PailakaInjuredDragon()
{ {
super(144); super(144);
addStartNpc(KETRA_ORC_SHAMAN); addStartNpc(KETRA_ORC_SHAMAN, KETRA_ORC_INTELIGENCE_OFFICER);
addFirstTalkId(KETRA_ORC_SUPPORTER, KETRA_ORC_INTELIGENCE_OFFICER, KETRA_ORC_SUPPORTER2);
addTalkId(KETRA_ORC_SHAMAN, KETRA_ORC_SUPPORTER, KETRA_ORC_INTELIGENCE_OFFICER, KETRA_ORC_SUPPORTER2);
addSpawnId(WALL_MONSTERS);
addKillId(WALL_MONSTERS);
addKillId(OTHER_MONSTERS);
addKillId(LATANA); addKillId(LATANA);
addSeeCreatureId(LATANA);
_questItemIds = ITEMS; addEnterZoneId(NOEXIT_ZONES.keySet());
registerQuestItems(ITEMS);
for (int npcId : NPCS)
{
addTalkId(npcId);
}
for (int mobId : OTHER_MONSTERS)
{
addKillId(mobId);
}
for (int mobId : WALL_MONSTERS)
{
addSpawnId(mobId);
addKillId(mobId);
}
for (int zoneid : NOEXIT_ZONES.keySet())
{
addEnterZoneId(zoneid);
}
} }
@Override @Override
public final String onAdvEvent(String event, L2Npc npc, L2PcInstance player) public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{ {
final QuestState qs = getQuestState(player, false); final QuestState qs = getQuestState(player, false);
if (qs == null) if (qs == null)
@@ -237,7 +219,6 @@ public class Q00144_PailakaInjuredDragon extends Quest
return null; return null;
} }
final int cond = qs.getCond();
if (event.equals("enter")) if (event.equals("enter"))
{ {
enterInstance(player); enterInstance(player);
@@ -250,7 +231,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
} }
else if (event.equals("32499-02.htm")) else if (event.equals("32499-02.htm"))
{ {
if (cond == 0) if (qs.getCond() == 0)
{ {
qs.startQuest(); qs.startQuest();
} }
@@ -287,6 +268,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
takeItems(player, SPEAR, -1); takeItems(player, SPEAR, -1);
takeItems(player, STAGE1, -1); takeItems(player, STAGE1, -1);
giveItems(player, ENCHSPEAR, 1); giveItems(player, ENCHSPEAR, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_MIDDLE.getPacket()); // TODO: Set proper cond.
return "32509-02.html"; return "32509-02.html";
} }
} }
@@ -305,10 +287,8 @@ public class Q00144_PailakaInjuredDragon extends Quest
takeItems(player, ENCHSPEAR, -1); takeItems(player, ENCHSPEAR, -1);
takeItems(player, STAGE2, -1); takeItems(player, STAGE2, -1);
giveItems(player, LASTSPEAR, 1); giveItems(player, LASTSPEAR, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_MIDDLE.getPacket()); // TODO: Set proper cond.
// Spawns Latana.
addSpawn(LATANA, 105732, -41787, -1782, 35742, false, 0, false, npc.getInstanceId()); addSpawn(LATANA, 105732, -41787, -1782, 35742, false, 0, false, npc.getInstanceId());
return "32509-03.html"; return "32509-03.html";
} }
} }
@@ -348,6 +328,98 @@ public class Q00144_PailakaInjuredDragon extends Quest
qs.exitQuest(false, true); qs.exitQuest(false, true);
} }
else if (event.equals("LATANA_INTRO_CAMERA_START"))
{
npc.setScriptValue(1);
npc.abortAttack();
npc.abortCast();
npc.setIsInvul(true);
npc.setIsImmobilized(true);
npc.disableAllSkills();
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.abortAttack();
player.abortCast();
player.stopMove(null);
player.setTarget(null);
if (player.hasSummon())
{
player.getSummon().abortAttack();
player.getSummon().abortCast();
player.getSummon().stopMove(null);
player.getSummon().getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
}
player.sendPacket(new SpecialCamera(npc, 600, 200, 5, 0, 15000, 10000, (-10), 8, 1, 1, 1));
startQuestTimer("LATANA_INTRO_CAMERA_2", 2000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_2"))
{
player.sendPacket(new SpecialCamera(npc, 400, 200, 5, 4000, 15000, 10000, (-10), 8, 1, 1, 0));
startQuestTimer("LATANA_INTRO_CAMERA_3", 4000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_3"))
{
player.sendPacket(new SpecialCamera(npc, 300, 195, 4, 1500, 15000, 10000, (-5), 10, 1, 1, 0));
startQuestTimer("LATANA_INTRO_CAMERA_4", 1700, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_4"))
{
player.sendPacket(new SpecialCamera(npc, 130, 2, 5, 0, 15000, 10000, 0, 0, 1, 0, 1));
startQuestTimer("LATANA_INTRO_CAMERA_5", 2000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_5"))
{
player.sendPacket(new SpecialCamera(npc, 220, 0, 4, 800, 15000, 10000, 5, 10, 1, 0, 0));
startQuestTimer("LATANA_INTRO_CAMERA_6", 2000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_6"))
{
player.sendPacket(new SpecialCamera(npc, 250, 185, 5, 4000, 15000, 10000, (-5), 10, 1, 1, 0));
startQuestTimer("LATANA_INTRO_CAMERA_7", 4000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_7"))
{
player.sendPacket(new SpecialCamera(npc, 200, 0, 5, 2000, 15000, 10000, 0, 25, 1, 0, 0));
startQuestTimer("LATANA_INTRO_CAMERA_8", 4530, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_8"))
{
npc.doCast(SkillData.getInstance().getSkill(5759, 1));
player.sendPacket(new SpecialCamera(npc, 300, (-3), 5, 3500, 15000, 6000, 0, 6, 1, 0, 0));
startQuestTimer("LATANA_INTRO_CAMERA_9", 10000, npc, player);
return null;
}
else if (event.equals("LATANA_INTRO_CAMERA_9"))
{
npc.setIsInvul(false);
npc.setIsImmobilized(false);
npc.enableAllSkills();
npc.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, player);
return null;
}
else if (event.equals("LATANA_DEATH_CAMERA_START"))
{
player.sendPacket(new SpecialCamera(npc, 450, 200, 3, 0, 15000, 10000, (-15), 20, 1, 1, 1));
startQuestTimer("LATANA_DEATH_CAMERA_1", 100, npc, player);
return null;
}
else if (event.equals("LATANA_DEATH_CAMERA_1"))
{
player.sendPacket(new SpecialCamera(npc, 350, 200, 5, 5600, 15000, 10000, (-15), 10, 1, 1, 0));
startQuestTimer("LATANA_DEATH_CAMERA_2", 5600, npc, player);
return null;
}
else if (event.equals("LATANA_DEATH_CAMERA_2"))
{
player.sendPacket(new SpecialCamera(npc, 360, 200, 5, 1000, 15000, 2000, (-15), 10, 1, 1, 0));
return null;
}
else if (event.startsWith("buff")) else if (event.startsWith("buff"))
{ {
if (buff_counter > 0) if (buff_counter > 0)
@@ -358,37 +430,20 @@ public class Q00144_PailakaInjuredDragon extends Quest
} }
return "32509-05.html"; return "32509-05.html";
} }
else if (event.equals("latana_animation"))
{
npc.abortAttack();
npc.abortCast();
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.abortAttack();
player.abortCast();
player.stopMove(null);
if (player.hasSummon())
{
player.getSummon().abortAttack();
player.getSummon().abortCast();
player.getSummon().stopMove(null);
}
return null;
}
else if (event.equals("latana_animation2"))
{
npc.doCast(SkillData.getInstance().getSkill(5759, 1));
npc.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, player);
return null;
}
return event; return event;
} }
@Override @Override
public final String onTalk(L2Npc npc, L2PcInstance player) public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
return npc.getId() + ".html";
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{ {
final QuestState qs = getQuestState(player, true); final QuestState qs = getQuestState(player, true);
final int cond = qs.getCond();
switch (npc.getId()) switch (npc.getId())
{ {
case KETRA_ORC_SHAMAN: case KETRA_ORC_SHAMAN:
@@ -417,11 +472,11 @@ public class Q00144_PailakaInjuredDragon extends Quest
{ {
return "32499-over.html"; return "32499-over.html";
} }
if (cond == 1) if (qs.isCond(1))
{ {
return "32499-06.html"; return "32499-06.html";
} }
else if (cond >= 2) else if (qs.getCond() >= 2)
{ {
return "32499-09.html"; return "32499-09.html";
} }
@@ -439,35 +494,30 @@ public class Q00144_PailakaInjuredDragon extends Quest
} }
case KETRA_ORC_SUPPORTER: case KETRA_ORC_SUPPORTER:
{ {
if (cond > 2) if (qs.getCond() > 2)
{ {
return "32502-04.html"; return "32502-04.html";
} }
return "32502-00.html"; return "32502-00.html";
} }
case KETRA_ORC_INTELIGENCE_OFFICER:
{
return "32509-00.html";
}
case KETRA_ORC_SUPPORTER2: case KETRA_ORC_SUPPORTER2:
{ {
if (qs.getState() == State.COMPLETED) if (qs.getState() == State.COMPLETED)
{ {
return "32512-03.html"; return "32512-03.html";
} }
else if (cond == 4) else if (qs.isCond(4))
{ {
return "32512-01.html"; return "32512-01.html";
} }
break; break;
} }
} }
return getNoQuestMsg(player); return getNoQuestMsg(player);
} }
@Override @Override
public final String onKill(L2Npc npc, L2PcInstance player, boolean isSummon) public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
{ {
final QuestState qs = player.getQuestState(getName()); final QuestState qs = player.getQuestState(getName());
if ((qs == null) || (qs.getState() != State.STARTED)) if ((qs == null) || (qs.getState() != State.STARTED))
@@ -486,6 +536,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE1, 1); giveItems(player, STAGE1, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_MEDIUM); spawnMageBehind(npc, player, VARKA_SILENOS_MEDIUM);
@@ -499,6 +550,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE1, 1); giveItems(player, STAGE1, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_PRIEST); spawnMageBehind(npc, player, VARKA_SILENOS_PRIEST);
@@ -512,6 +564,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE1, 1); giveItems(player, STAGE1, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_SHAMAN); spawnMageBehind(npc, player, VARKA_SILENOS_SHAMAN);
@@ -526,6 +579,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, SPEAR) && !hasQuestItems(player, STAGE1) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE1, 1); giveItems(player, STAGE1, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_SEER); spawnMageBehind(npc, player, VARKA_SILENOS_SEER);
@@ -540,6 +594,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE2, 1); giveItems(player, STAGE2, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_MAGNUS); spawnMageBehind(npc, player, VARKA_SILENOS_MAGNUS);
@@ -553,6 +608,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE2, 1); giveItems(player, STAGE2, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, DISCIPLE_OF_PROPHET); spawnMageBehind(npc, player, DISCIPLE_OF_PROPHET);
@@ -566,6 +622,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE2, 1); giveItems(player, STAGE2, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_HEAD_MAGUS); spawnMageBehind(npc, player, VARKA_HEAD_MAGUS);
@@ -579,6 +636,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25)) if (qs.isCond(3) && hasQuestItems(player, ENCHSPEAR) && !hasQuestItems(player, STAGE2) && (Rnd.get(100) < 25))
{ {
giveItems(player, STAGE2, 1); giveItems(player, STAGE2, 1);
player.sendPacket(QuestSound.ITEMSOUND_QUEST_ITEMGET.getPacket());
} }
// Spawns Mage Type silenos behind the one that was killed. // Spawns Mage Type silenos behind the one that was killed.
spawnMageBehind(npc, player, VARKA_SILENOS_GREAT_SEER); spawnMageBehind(npc, player, VARKA_SILENOS_GREAT_SEER);
@@ -589,7 +647,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
case LATANA: case LATANA:
{ {
qs.setCond(4, true); qs.setCond(4, true);
// Spawns Ketra Orc Supporter. startQuestTimer("LATANA_DEATH_CAMERA_START", 1000, npc, player);
addSpawn(KETRA_ORC_SUPPORTER2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, false, npc.getInstanceId()); addSpawn(KETRA_ORC_SUPPORTER2, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, false, npc.getInstanceId());
break; break;
} }
@@ -612,6 +670,182 @@ public class Q00144_PailakaInjuredDragon extends Quest
return super.onKill(npc, player, isSummon); return super.onKill(npc, player, isSummon);
} }
// Spawns Mage Type silenos behind the one that was killed. Aggro against the player that kill the mob.
private void spawnMageBehind(L2Npc npc, L2PcInstance player, int mageId)
{
final double rads = Math.toRadians(Util.convertHeadingToDegree(npc.getSpawn().getHeading()) + 180);
final int mageX = (int) (npc.getX() + (150 * Math.cos(rads)));
final int mageY = (int) (npc.getY() + (150 * Math.sin(rads)));
final L2Npc mageBack = addSpawn(mageId, mageX, mageY, npc.getZ(), npc.getSpawn().getHeading(), false, 0, true, npc.getInstanceId());
mageBack.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, player, 1000);
}
// This function will check if there is other mob alive in this wall of mobs. If all mobs in the first row are dead then despawn the second row mobs, the mages.
private void checkIfLastInWall(L2Npc npc)
{
final Collection<L2Npc> knowns = L2World.getInstance().getVisibleObjects(npc, L2Npc.class, 700);
for (L2Npc npcs : knowns)
{
if (npcs.isDead())
{
continue;
}
switch (npc.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
switch (npcs.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
return;
}
}
break;
}
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
switch (npcs.getId())
{
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
return;
}
}
break;
}
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
switch (npcs.getId())
{
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
return;
}
}
break;
}
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
switch (npcs.getId())
{
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
return;
}
}
break;
}
}
}
// We didnt find any mob on the first row alive, so despawn the second row mobs.
for (L2Character npcs : knowns)
{
if (npcs.isDead())
{
continue;
}
switch (npc.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
switch (npcs.getId())
{
case VARKA_SILENOS_MEDIUM:
case VARKA_SILENOS_PRIEST:
{
npcs.abortCast();
npcs.deleteMe();
break;
}
}
break;
}
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
switch (npcs.getId())
{
case VARKA_SILENOS_SHAMAN:
case VARKA_SILENOS_SEER:
{
npcs.abortCast();
npcs.deleteMe();
break;
}
}
break;
}
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
switch (npcs.getId())
{
case VARKA_SILENOS_MAGNUS:
case DISCIPLE_OF_PROPHET:
{
npcs.abortCast();
npcs.deleteMe();
break;
}
}
break;
}
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
switch (npcs.getId())
{
case VARKA_HEAD_MAGUS:
case VARKA_SILENOS_GREAT_SEER:
{
npcs.abortCast();
npcs.deleteMe();
break;
}
}
break;
}
}
}
}
@Override
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
{
if (creature.isPlayer() && npc.isScriptValue(0))
{
final QuestState qs = getQuestState(creature.getActingPlayer(), false);
if ((qs == null) || (qs.getState() != State.STARTED) || isSummon)
{
return null;
}
startQuestTimer("LATANA_INTRO_CAMERA_START", 600, npc, creature.getActingPlayer());
}
return super.onSeeCreature(npc, creature, isSummon);
}
@Override @Override
public String onSpawn(L2Npc npc) public String onSpawn(L2Npc npc)
{ {
@@ -658,192 +892,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
// Spawns Mage Type silenos behind the one that was killed. Aggro against the player that kill the mob. private void dropHerb(L2Npc mob, L2PcInstance player, int[][] drop)
private final void spawnMageBehind(L2Npc npc, L2PcInstance player, int mageId)
{
final double rads = Math.toRadians(Util.convertHeadingToDegree(npc.getSpawn().getHeading()) + 180);
final int mageX = (int) (npc.getX() + (150 * Math.cos(rads)));
final int mageY = (int) (npc.getY() + (150 * Math.sin(rads)));
final L2Npc mageBack = addSpawn(mageId, mageX, mageY, npc.getZ(), npc.getSpawn().getHeading(), false, 0, true, npc.getInstanceId());
mageBack.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, player, 1000);
}
// This function will check if there is other mob alive in this wall of mobs. If all mobs in the first row are dead then despawn the second row mobs, the mages.
private final void checkIfLastInWall(L2Npc npc)
{
final Collection<L2Character> knowns = L2World.getInstance().getVisibleObjects(npc, L2Character.class, 700);
for (L2Character npcs : knowns)
{
if (!(npcs instanceof L2Npc) || npcs.isDead())
{
continue;
}
final L2Npc knownNpc = (L2Npc) npcs;
switch (npc.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
return;
}
}
break;
}
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
switch (knownNpc.getId())
{
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
return;
}
}
break;
}
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
return;
}
}
break;
}
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
return;
}
}
break;
}
}
}
// We didnt find any mob on the first row alive, so despawn the second row mobs.
for (L2Character npcs : knowns)
{
if (!(npcs instanceof L2Npc) || npcs.isDead())
{
continue;
}
final L2Npc knownNpc = (L2Npc) npcs;
switch (npc.getId())
{
case VARKA_SILENOS_FOOTMAN:
case VARKA_SILENOS_RECRUIT:
case VARKA_SILENOS_WARRIOR:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_MEDIUM:
case VARKA_SILENOS_PRIEST:
{
knownNpc.abortCast();
knownNpc.deleteMe();
break;
}
}
break;
}
case VARKA_ELITE_GUARD:
case VARKAS_COMMANDER:
case VARKA_SILENOS_OFFICER:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_SHAMAN:
case VARKA_SILENOS_SEER:
{
knownNpc.abortCast();
knownNpc.deleteMe();
break;
}
}
break;
}
case VARKA_SILENOS_GREAT_MAGUS:
case VARKA_SILENOS_GENERAL:
case VARKAS_PROPHET:
{
switch (knownNpc.getId())
{
case VARKA_SILENOS_MAGNUS:
case DISCIPLE_OF_PROPHET:
{
knownNpc.abortCast();
knownNpc.deleteMe();
break;
}
}
break;
}
case VARKA_SILENOS_HEAD_GUARD:
case PROPHET_GUARD:
{
switch (knownNpc.getId())
{
case VARKA_HEAD_MAGUS:
case VARKA_SILENOS_GREAT_SEER:
{
knownNpc.abortCast();
knownNpc.deleteMe();
break;
}
}
break;
}
}
}
}
private static class PailakaDrop
{
private final int _itemId;
private final int _chance;
public PailakaDrop(int itemId, int chance)
{
_itemId = itemId;
_chance = chance;
}
public int getItemID()
{
return _itemId;
}
public int getChance()
{
return _chance;
}
}
private static void dropHerb(L2Npc mob, L2PcInstance player, int[][] drop)
{ {
final int chance = Rnd.get(100); final int chance = Rnd.get(100);
for (int[] element : drop) for (int[] element : drop)
@@ -856,35 +905,35 @@ public class Q00144_PailakaInjuredDragon extends Quest
} }
} }
private static void dropItem(L2Npc mob, L2PcInstance player) private void dropItem(L2Npc mob, L2PcInstance player)
{ {
// To make random drops, we shuffle the droplist every time its used. // To make random drops, we shuffle the droplist every time its used.
Collections.shuffle(DROPLIST); Collections.shuffle(DROPLIST);
for (PailakaDrop pd : DROPLIST) for (ItemChanceHolder drop : DROPLIST)
{ {
if (Rnd.get(100) < pd.getChance()) if (Rnd.get(100) < drop.getChance())
{ {
((L2MonsterInstance) mob).dropItem(player, pd.getItemID(), Rnd.get(1, 6)); ((L2MonsterInstance) mob).dropItem(player, drop.getId(), Rnd.get(1, 6));
return; return;
} }
} }
} }
private static void giveBuff(L2Npc npc, L2PcInstance player, int skillId, int level) private void giveBuff(L2Npc npc, L2PcInstance player, int skillId, int level)
{ {
buff_counter--;
npc.setTarget(player); npc.setTarget(player);
npc.doCast(SkillData.getInstance().getSkill(skillId, level)); npc.doCast(SkillData.getInstance().getSkill(skillId, level));
buff_counter--;
} }
private static void teleportPlayer(L2PcInstance player, int[] coords, int instanceId) private void teleportPlayer(L2PcInstance player, int[] coords, int instanceId)
{ {
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE); player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
player.setInstanceId(instanceId); player.setInstanceId(instanceId);
player.teleToLocation(coords[0], coords[1], coords[2], true); player.teleToLocation(coords[0], coords[1], coords[2], true);
} }
private final synchronized void enterInstance(L2PcInstance player) private synchronized void enterInstance(L2PcInstance player)
{ {
// Check for existing instances for this player. // Check for existing instances for this player.
InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player); InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player);
@@ -920,7 +969,7 @@ public class Q00144_PailakaInjuredDragon extends Quest
} }
// Checks if the summon or pet that the player has can be used. // Checks if the summon or pet that the player has can be used.
private final void checkMaxSummonLevel(L2PcInstance player) private void checkMaxSummonLevel(L2PcInstance player)
{ {
final L2Summon pet = player.getSummon(); final L2Summon pet = player.getSummon();
if (pet instanceof L2PetInstance) if (pet instanceof L2PetInstance)