Some syncs with l2jserver.
Also QuestState cleanup.
This commit is contained in:
122
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/BlackdaggerWing.java
vendored
Normal file
122
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/BlackdaggerWing.java
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
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;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Blackdagger Wing AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class BlackdaggerWing extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int BLACKDAGGER_WING = 25721;
|
||||
// Skills
|
||||
private static final SkillHolder POWER_STRIKE = new SkillHolder(6833, 1);
|
||||
private static final SkillHolder RANGE_MAGIC_ATTACK = new SkillHolder(6834, 1);
|
||||
// Variables
|
||||
private static final String MID_HP_FLAG = "MID_HP_FLAG";
|
||||
private static final String POWER_STRIKE_CAST_COUNT = "POWER_STRIKE_CAST_COUNT";
|
||||
// Timers
|
||||
private static final String DAMAGE_TIMER = "DAMAGE_TIMER";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
private static final double MID_HP_PERCENTAGE = 0.50;
|
||||
|
||||
public BlackdaggerWing()
|
||||
{
|
||||
super(BlackdaggerWing.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(BLACKDAGGER_WING);
|
||||
addSeeCreatureId(BLACKDAGGER_WING);
|
||||
addSpellFinishedId(BLACKDAGGER_WING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * MID_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MID_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(MID_HP_FLAG, true);
|
||||
startQuestTimer(DAMAGE_TIMER, 10000, npc, attacker);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
|
||||
{
|
||||
if (npc.getVariables().getBoolean(MID_HP_FLAG, false))
|
||||
{
|
||||
final L2Character mostHated = ((L2Attackable) npc).getMostHated();
|
||||
if ((mostHated != null) && mostHated.isPlayer() && (mostHated != creature))
|
||||
{
|
||||
if (getRandom(5) < 1)
|
||||
{
|
||||
addSkillCastDesire(npc, creature, RANGE_MAGIC_ATTACK, 99999);
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.onSeeCreature(npc, creature, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
|
||||
{
|
||||
if (skill.getId() == POWER_STRIKE.getSkillId())
|
||||
{
|
||||
npc.getVariables().set(POWER_STRIKE_CAST_COUNT, npc.getVariables().getInt(POWER_STRIKE_CAST_COUNT) + 1);
|
||||
if (npc.getVariables().getInt(POWER_STRIKE_CAST_COUNT) > 3)
|
||||
{
|
||||
addSkillCastDesire(npc, player, RANGE_MAGIC_ATTACK, 99999);
|
||||
npc.getVariables().set(POWER_STRIKE_CAST_COUNT, 0);
|
||||
}
|
||||
}
|
||||
return super.onSpellFinished(npc, player, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (DAMAGE_TIMER.equals(event))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK);
|
||||
startQuestTimer(DAMAGE_TIMER, 30000, npc, player);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new BlackdaggerWing();
|
||||
}
|
||||
}
|
||||
136
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/BleedingFly.java
vendored
Normal file
136
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/BleedingFly.java
vendored
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Bleeding Fly AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class BleedingFly extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int BLEEDING_FLY = 25720;
|
||||
private static final int PARASITIC_LEECH = 25734;
|
||||
// Skills
|
||||
private static final SkillHolder SUMMON_PARASITE_LEECH = new SkillHolder(6832, 1);
|
||||
private static final SkillHolder NPC_ACUMEN_LVL_3 = new SkillHolder(6915, 3);
|
||||
// Variables
|
||||
private static final String MID_HP_FLAG = "MID_HP_FLAG";
|
||||
private static final String LOW_HP_FLAG = "LOW_HP_FLAG";
|
||||
private static final String MID_HP_MINION_COUNT = "MID_HP_MINION_COUNT";
|
||||
private static final String LOW_HP_MINION_COUNT = "LOW_HP_MINION_COUNT";
|
||||
// Timers
|
||||
private static final String TIMER_MID_HP = "TIMER_MID_HP";
|
||||
private static final String TIMER_LOW_HP = "TIMER_LOW_HP";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
private static final double MID_HP_PERCENTAGE = 0.50;
|
||||
private static final double MIN_HP_PERCENTAGE = 0.25;
|
||||
|
||||
public BleedingFly()
|
||||
{
|
||||
super(BleedingFly.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(BLEEDING_FLY);
|
||||
addSpawnId(BLEEDING_FLY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
npc.getVariables().set(MID_HP_MINION_COUNT, 5);
|
||||
npc.getVariables().set(LOW_HP_MINION_COUNT, 10);
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * MID_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MID_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(MID_HP_FLAG, true);
|
||||
startQuestTimer(TIMER_MID_HP, 1000, npc, null);
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(LOW_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(MID_HP_FLAG, false);
|
||||
npc.getVariables().set(LOW_HP_FLAG, true);
|
||||
startQuestTimer(TIMER_LOW_HP, 1000, npc, null);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (npc.isDead())
|
||||
{
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
if (TIMER_MID_HP.equals(event))
|
||||
{
|
||||
if (npc.getVariables().getInt(MID_HP_MINION_COUNT) > 0)
|
||||
{
|
||||
npc.getVariables().set(MID_HP_MINION_COUNT, npc.getVariables().getInt(MID_HP_MINION_COUNT) - 1);
|
||||
addSkillCastDesire(npc, npc, SUMMON_PARASITE_LEECH, 99999);
|
||||
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
|
||||
|
||||
if (npc.getVariables().getBoolean(MID_HP_FLAG, false))
|
||||
{
|
||||
startQuestTimer(TIMER_MID_HP, 140000, npc, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (TIMER_LOW_HP.equals(event))
|
||||
{
|
||||
if (npc.getVariables().getInt(LOW_HP_MINION_COUNT) > 0)
|
||||
{
|
||||
npc.getVariables().set(LOW_HP_MINION_COUNT, npc.getVariables().getInt(LOW_HP_MINION_COUNT) - 1);
|
||||
addSkillCastDesire(npc, npc, SUMMON_PARASITE_LEECH, 99999);
|
||||
addSkillCastDesire(npc, npc, NPC_ACUMEN_LVL_3, 99999);
|
||||
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
|
||||
addSpawn(PARASITIC_LEECH, npc.getX() + getRandom(150), npc.getY() + getRandom(150), npc.getZ(), npc.getHeading(), false, 0);
|
||||
|
||||
if (npc.getVariables().getBoolean(LOW_HP_FLAG, false))
|
||||
{
|
||||
startQuestTimer(TIMER_LOW_HP, 80000, npc, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new BleedingFly();
|
||||
}
|
||||
}
|
||||
68
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/DustRider.java
vendored
Normal file
68
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/DustRider.java
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Dust Rider AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class DustRider extends AbstractNpcAI
|
||||
{
|
||||
private static final int DUST_RIDER = 25719;
|
||||
// Skills
|
||||
private static final SkillHolder NPC_HASTE_LVL_3 = new SkillHolder(6914, 3);
|
||||
// Variables
|
||||
private static final String CAST_FLAG = "CAST_FLAG";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
private static final double MIN_HP_PERCENTAGE = 0.30;
|
||||
|
||||
public DustRider()
|
||||
{
|
||||
super(DustRider.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(DUST_RIDER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if (!npc.getVariables().getBoolean(CAST_FLAG, false) && (npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)))
|
||||
{
|
||||
npc.getVariables().set(CAST_FLAG, true);
|
||||
addSkillCastDesire(npc, npc, NPC_HASTE_LVL_3, 99999);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new DustRider();
|
||||
}
|
||||
}
|
||||
134
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/EmeraldHorn.java
vendored
Normal file
134
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/EmeraldHorn.java
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
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;
|
||||
import com.l2jmobius.gameserver.model.skills.Skill;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Emerald Horn AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class EmeraldHorn extends AbstractNpcAI
|
||||
{
|
||||
private static final int EMERALD_HORN = 25718;
|
||||
// Skills
|
||||
private static final SkillHolder REFLECT_ATTACK = new SkillHolder(6823, 1);
|
||||
private static final SkillHolder PIERCING_STORM = new SkillHolder(6824, 1);
|
||||
private static final SkillHolder BLEED_LVL_1 = new SkillHolder(6825, 1);
|
||||
private static final SkillHolder BLEED_LVL_2 = new SkillHolder(6825, 2);
|
||||
// Variables
|
||||
private static final String HIGH_DAMAGE_FLAG = "HIGH_DAMAGE_FLAG";
|
||||
private static final String TOTAL_DAMAGE_COUNT = "TOTAL_DAMAGE_COUNT";
|
||||
private static final String CAST_FLAG = "CAST_FLAG";
|
||||
// Timers
|
||||
private static final String DAMAGE_TIMER_15S = "DAMAGE_TIMER_15S";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
|
||||
public EmeraldHorn()
|
||||
{
|
||||
super(EmeraldHorn.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(EMERALD_HORN);
|
||||
addSpellFinishedId(EMERALD_HORN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if (npc.isAffectedBySkill(REFLECT_ATTACK.getSkillId()))
|
||||
{
|
||||
if (npc.getVariables().getBoolean(CAST_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(TOTAL_DAMAGE_COUNT, npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) + damage);
|
||||
}
|
||||
}
|
||||
|
||||
if (npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) > 5000)
|
||||
{
|
||||
addSkillCastDesire(npc, attacker, BLEED_LVL_2, 99999);
|
||||
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
|
||||
npc.getVariables().set(CAST_FLAG, false);
|
||||
npc.getVariables().set(HIGH_DAMAGE_FLAG, true);
|
||||
}
|
||||
|
||||
if (npc.getVariables().getInt(TOTAL_DAMAGE_COUNT) > 10000)
|
||||
{
|
||||
addSkillCastDesire(npc, attacker, BLEED_LVL_1, 99999);
|
||||
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
|
||||
npc.getVariables().set(CAST_FLAG, false);
|
||||
npc.getVariables().set(HIGH_DAMAGE_FLAG, true);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
|
||||
{
|
||||
if (getRandom(5) < 1)
|
||||
{
|
||||
npc.getVariables().set(TOTAL_DAMAGE_COUNT, 0);
|
||||
npc.getVariables().set(CAST_FLAG, true);
|
||||
addSkillCastDesire(npc, npc, REFLECT_ATTACK, 99999);
|
||||
startQuestTimer(DAMAGE_TIMER_15S, 15 * 1000, npc, player);
|
||||
}
|
||||
return super.onSpellFinished(npc, player, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (DAMAGE_TIMER_15S.equals(event))
|
||||
{
|
||||
if (!npc.getVariables().getBoolean(HIGH_DAMAGE_FLAG, false))
|
||||
{
|
||||
final L2Character mostHated = ((L2Attackable) npc).getMostHated();
|
||||
if (mostHated != null)
|
||||
{
|
||||
if (mostHated.isDead())
|
||||
{
|
||||
((L2Attackable) npc).stopHating(mostHated);
|
||||
}
|
||||
else
|
||||
{
|
||||
addSkillCastDesire(npc, mostHated, PIERCING_STORM, 99999);
|
||||
}
|
||||
}
|
||||
}
|
||||
npc.getVariables().set(CAST_FLAG, false);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new EmeraldHorn();
|
||||
}
|
||||
}
|
||||
112
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/MuscleBomber.java
vendored
Normal file
112
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/MuscleBomber.java
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Muscle Bomber AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class MuscleBomber extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int MUSCLE_BOMBER = 25724;
|
||||
private static final int DRAKOS_ASSASSIN = 22823;
|
||||
// Skills
|
||||
private static final SkillHolder ENHANCE_LVL_1 = new SkillHolder(6842, 1);
|
||||
private static final SkillHolder ENHANCE_LVL_2 = new SkillHolder(6842, 2);
|
||||
// Variables
|
||||
private static final String HIGH_HP_FLAG = "HIGH_HP_FLAG";
|
||||
private static final String MED_HP_FLAG = "MED_HP_FLAG";
|
||||
private static final String LIMIT_FLAG = "LIMIT_FLAG";
|
||||
// Timers
|
||||
private static final String TIMER_SUMMON = "TIMER_SUMMON";
|
||||
private static final String TIMER_LIMIT = "TIMER_LIMIT";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
private static final double HIGH_HP_PERCENTAGE = 0.80;
|
||||
private static final double MED_HP_PERCENTAGE = 0.50;
|
||||
|
||||
public MuscleBomber()
|
||||
{
|
||||
super(MuscleBomber.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(MUSCLE_BOMBER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * HIGH_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(HIGH_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(HIGH_HP_FLAG, true);
|
||||
addSkillCastDesire(npc, npc, ENHANCE_LVL_1, 99999);
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * MED_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(MED_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(MED_HP_FLAG, true);
|
||||
addSkillCastDesire(npc, npc, ENHANCE_LVL_2, 99999);
|
||||
startQuestTimer(TIMER_SUMMON, 60000, npc, attacker);
|
||||
startQuestTimer(TIMER_LIMIT, 300000, npc, attacker);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case TIMER_LIMIT:
|
||||
{
|
||||
npc.getVariables().set(LIMIT_FLAG, true);
|
||||
break;
|
||||
}
|
||||
case TIMER_SUMMON:
|
||||
{
|
||||
if (!npc.isDead() && !npc.getVariables().getBoolean(LIMIT_FLAG, false))
|
||||
{
|
||||
if (player != null)
|
||||
{
|
||||
addAttackDesire(addSpawn(DRAKOS_ASSASSIN, npc.getX() + getRandom(100), npc.getY() + getRandom(10), npc.getZ(), npc.getHeading(), false, 0), player);
|
||||
addAttackDesire(addSpawn(DRAKOS_ASSASSIN, npc.getX() + getRandom(100), npc.getY() + getRandom(10), npc.getZ(), npc.getHeading(), false, 0), player);
|
||||
}
|
||||
startQuestTimer(TIMER_SUMMON, 60000, npc, player);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new MuscleBomber();
|
||||
}
|
||||
}
|
||||
134
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/ShadowSummoner.java
vendored
Normal file
134
L2J_Mobius_HighFive/dist/game/data/scripts/ai/individual/ShadowSummoner.java
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* 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.individual;
|
||||
|
||||
import com.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
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;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Shadow Summoner AI.
|
||||
* @author Zoey76
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class ShadowSummoner extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int SHADOW_SUMMONER = 25722;
|
||||
private static final int DEMONS_BANQUET_1 = 25730;
|
||||
private static final int DEMONS_BANQUET_2 = 25731;
|
||||
// Skills
|
||||
private static final SkillHolder SUMMON_SKELETON = new SkillHolder(6835, 1);
|
||||
// Variables
|
||||
private static final String LOW_HP_FLAG = "LOW_HP_FLAG";
|
||||
private static final String LIMIT_FLAG = "LIMIT_FLAG";
|
||||
// Timers
|
||||
private static final String SUMMON_TIMER = "SUMMON_TIMER";
|
||||
private static final String FEED_TIMER = "FEED_TIMER";
|
||||
private static final String LIMIT_TIMER = "LIMIT_TIMER";
|
||||
private static final String DELAY_TIMER = "DELAY_TIMER";
|
||||
// Misc
|
||||
private static final int MAX_CHASE_DIST = 2500;
|
||||
private static final double MIN_HP_PERCENTAGE = 0.25;
|
||||
|
||||
public ShadowSummoner()
|
||||
{
|
||||
super(ShadowSummoner.class.getSimpleName(), "ai/individual");
|
||||
addAttackId(SHADOW_SUMMONER);
|
||||
addSeeCreatureId(SHADOW_SUMMONER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (Util.calculateDistance(npc, npc.getSpawn(), false, false) > MAX_CHASE_DIST)
|
||||
{
|
||||
npc.teleToLocation(npc.getSpawn().getX(), npc.getSpawn().getY(), npc.getSpawn().getZ());
|
||||
}
|
||||
|
||||
if ((npc.getCurrentHp() < (npc.getMaxHp() * MIN_HP_PERCENTAGE)) && !npc.getVariables().getBoolean(LOW_HP_FLAG, false))
|
||||
{
|
||||
npc.getVariables().set(LOW_HP_FLAG, true);
|
||||
startQuestTimer(SUMMON_TIMER, 1000, npc, attacker);
|
||||
startQuestTimer(FEED_TIMER, 30000, npc, attacker);
|
||||
startQuestTimer(LIMIT_TIMER, 600000, npc, attacker);
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
|
||||
{
|
||||
if (!creature.isPlayer())
|
||||
{
|
||||
if (creature.getId() == DEMONS_BANQUET_2)
|
||||
{
|
||||
((L2Attackable) npc).clearAggroList();
|
||||
addAttackDesire(npc, creature, 99999);
|
||||
}
|
||||
}
|
||||
return super.onSeeCreature(npc, creature, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (npc.isDead())
|
||||
{
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
if (SUMMON_TIMER.equals(event))
|
||||
{
|
||||
if (!npc.getVariables().getBoolean(LIMIT_FLAG, false))
|
||||
{
|
||||
startQuestTimer(DELAY_TIMER, 5000, npc, player);
|
||||
startQuestTimer(SUMMON_TIMER, 30000, npc, player);
|
||||
}
|
||||
}
|
||||
else if (FEED_TIMER.equals(event))
|
||||
{
|
||||
if (!npc.getVariables().getBoolean(LIMIT_FLAG, false))
|
||||
{
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK);
|
||||
startQuestTimer(FEED_TIMER, 30000, npc, player);
|
||||
}
|
||||
}
|
||||
else if (LIMIT_TIMER.equals(event))
|
||||
{
|
||||
npc.getVariables().set(LIMIT_FLAG, true);
|
||||
}
|
||||
else if (DELAY_TIMER.equals(event))
|
||||
{
|
||||
addSkillCastDesire(npc, npc, SUMMON_SKELETON, 99999);
|
||||
final L2Npc demonsBanquet = addSpawn(getRandom(2) < 1 ? DEMONS_BANQUET_1 : DEMONS_BANQUET_2, npc.getX() + 150, npc.getY() + 150, npc.getZ(), npc.getHeading(), false, 0);
|
||||
addAttackDesire(demonsBanquet, player, 10000);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new ShadowSummoner();
|
||||
}
|
||||
}
|
||||
@@ -39,13 +39,13 @@ public final class Alexandria extends AbstractNpcAI
|
||||
// Items
|
||||
private static final ItemHolder[] REQUIRED_ITEMS = new ItemHolder[]
|
||||
{
|
||||
new ItemHolder(57, 3550000),
|
||||
new ItemHolder(5094, 400),
|
||||
new ItemHolder(6471, 200),
|
||||
new ItemHolder(9814, 40),
|
||||
new ItemHolder(9815, 30),
|
||||
new ItemHolder(9816, 50),
|
||||
new ItemHolder(9817, 50),
|
||||
new ItemHolder(57, 7500000),
|
||||
new ItemHolder(5094, 50),
|
||||
new ItemHolder(6471, 25),
|
||||
new ItemHolder(9814, 4),
|
||||
new ItemHolder(9815, 3),
|
||||
new ItemHolder(9816, 5),
|
||||
new ItemHolder(9817, 5),
|
||||
};
|
||||
// Agathions
|
||||
private static final QuestItemHolder[] LITTLE_DEVILS = new QuestItemHolder[]
|
||||
@@ -97,7 +97,7 @@ public final class Alexandria extends AbstractNpcAI
|
||||
for (QuestItemHolder agathion : AGATHIONS.get(event))
|
||||
{
|
||||
chance3 += agathion.getChance();
|
||||
if ((chance >= chance2) && (chance2 < chance3))
|
||||
if ((chance2 <= chance) && (chance < chance3))
|
||||
{
|
||||
if (takeAllItems(player, REQUIRED_ITEMS))
|
||||
{
|
||||
|
||||
8
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-01.htm
vendored
Normal file
8
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-01.htm
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Asamah:<br>
|
||||
I am Asamah, son of Mushika, chief of the Elroki tribe. These are our lands. In them lies perhaps our last hope to return to our ancient ancestral home. But these days are evil, and our hope is waning before this threat.<br>
|
||||
Our strength has run out like water from a broken pot, and although my ancestors would be shamed to ask for aid, I believe only an outsider like yourself can save us now.<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Quest</a><br>
|
||||
<a action="bypass -h Quest Asamah 32115-03.htm">Find out how to use the capture skill.</a><br>
|
||||
<a action="bypass -h npc_%objectId%_multisell 577">Equip the trap.</a><br>
|
||||
<a action="bypass -h npc_%objectId%_multisell 578">Buy</a>
|
||||
</body></html>
|
||||
7
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-02.htm
vendored
Normal file
7
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-02.htm
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Asamah:<br>
|
||||
I am Asamah, son of Mushika, chief of the Elroki tribe. These are our lands. In them lies perhaps our last hope to return to our ancient ancestral home. But these days are evil, and our hope is waning before this threat.<br>
|
||||
Our strength has run out like water from a broken pot, and although my ancestors would be shamed to ask for aid, I believe only an outsider like yourself can save us now.<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Quest</a><br>
|
||||
<a action="bypass -h Quest Asamah 32115-03.htm">Find out how to use the capture skill.</a><br>
|
||||
<a action="bypass -h npc_%objectId%_multisell 578">Buy</a>
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-03.htm
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-03.htm
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Asamah:<br>
|
||||
If you have a trap, then you may use at least 3 types of capture skills. You can only use a capture skill on the predatory Tyrannosaurus.<br>
|
||||
If you are capturing a Tyrannosaurus for the first time, you will use the <font color="LEVEL">Kabokula</font> technique most among the three capture skills. But you cannot completely capture this powerful predatory dinosaur with just one skill type!<br>
|
||||
At this point, watch the Tyrannosaurus' reactions and use the proper skill to maintain its state of captivity. Nothing is a better teacher than your own experience, but since you have come all this way, I will tell you the traditional capture method of the Elkrohki. Listen carefully.<br>
|
||||
<a action="bypass -h Quest Asamah 32115-04.htm">Next.</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-04.htm
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/32115-04.htm
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Asamah:<br>
|
||||
You must know which action to use when a Tyrannosaurus tries to cancel a capture skill. When the beast <font color="LEVEL">roars, shakes and writhes</font>, the appropriate capture skills to use are <font color="LEVEL">kabokula, tapirawa and shabonoba</font>. Watch each action of the Tyrannosaurus carefully and respond with the correct skill.<br>
|
||||
Remember that using a capture skill consumes both capture stones and MP. Be sure to prepare enough of them both! May Shilen bless your efforts!
|
||||
</body></html>
|
||||
65
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/Asamah.java
vendored
Normal file
65
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Asamah/Asamah.java
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 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.npc.Asamah;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.quest.QuestState;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q00111_ElrokianHuntersProof.Q00111_ElrokianHuntersProof;
|
||||
|
||||
/**
|
||||
* Asamah AI.
|
||||
* @author Adry_85
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public final class Asamah extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int ASAMAH = 32115;
|
||||
|
||||
public Asamah()
|
||||
{
|
||||
super(Asamah.class.getSimpleName(), "ai/npc");
|
||||
addFirstTalkId(ASAMAH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
if (event.equals("32115-03.htm") || event.equals("32115-04.htm"))
|
||||
{
|
||||
htmltext = event;
|
||||
}
|
||||
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final QuestState st = player.getQuestState(Q00111_ElrokianHuntersProof.class.getSimpleName());
|
||||
return ((st != null) && (st.isCompleted())) ? "32115-01.htm" : "32115-02.htm";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Asamah();
|
||||
}
|
||||
}
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/DragonVortex/32871-02.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/DragonVortex/32871-02.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dragon Vortex:<br>
|
||||
You can't summon the monster this soon. Please wait a little.
|
||||
</body></html>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Dragon Vortex:<br>
|
||||
No high commanding dragon can be summoned at this time, since they are already summoned.
|
||||
</body></html>
|
||||
@@ -1,5 +1,6 @@
|
||||
<html><body>Dragon Vortex:<br>
|
||||
A mysterious vortex which has the power to summon one of Antharas's high commanding dragons. To call forth one of these creatures you must use a <font color="LEVEL">Large Dragon Bone</font> to entice it.<br>
|
||||
Summoned Dragons: <font color="LEVEL">Emerald Horn, Dust Rider, Bleeding Fly, Blackdagger Wing, Shadow Summoner, Spike Slasher, & Muscle Bomber</font><br>
|
||||
<a action="bypass -h Quest DragonVortex Spawn">Use a Large Dragon Bone</a>
|
||||
A mysterious vortex which has the power to summon one of Antharas' high commanding dragons.<br>
|
||||
To call forth one of these creatures, you must use a <font color="LEVEL">Large Dragon Bone</font>.<br>
|
||||
Dragons to be summoned: <font color="LEVEL">Emerald Horn Dust Rider Bleeding Fly Blackdagger Wing Shadow Summoner Spike Slasher Muscle Bomber</font><br>
|
||||
<a action="bypass -h Quest DragonVortex RAIDBOSS">Use a Large Dragon Bone</a>
|
||||
</body></html>
|
||||
@@ -16,11 +16,7 @@
|
||||
*/
|
||||
package ai.npc.DragonVortex;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.gameserver.datatables.SpawnTable;
|
||||
import com.l2jmobius.gameserver.model.L2Spawn;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
|
||||
@@ -28,158 +24,131 @@ import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Dragon Vortex AI.
|
||||
* @author UnAfraid, improved by Adry_85 & DreamStage
|
||||
* @author Adry_85
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public final class DragonVortex extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int VORTEX = 32871;
|
||||
private static final int DRAGON_VORTEX = 32871;
|
||||
// Raids
|
||||
private static final int[][] RAIDS =
|
||||
{
|
||||
{
|
||||
25718, // Emerald Horn 29.2%
|
||||
292
|
||||
},
|
||||
{
|
||||
25719, // Dust Rider 22.4%
|
||||
224
|
||||
},
|
||||
{
|
||||
25720, // Bleeding Fly 17.6%
|
||||
176
|
||||
},
|
||||
{
|
||||
25721, // Blackdagger Wing 11.6%
|
||||
116
|
||||
},
|
||||
{
|
||||
25723, // Spike Slasher 9.2%
|
||||
92
|
||||
},
|
||||
{
|
||||
25722, // Shadow Summoner 5.6%
|
||||
56
|
||||
},
|
||||
{
|
||||
25724, // Muscle Bomber 4.4%
|
||||
44
|
||||
}
|
||||
};
|
||||
private static final int EMERALD_HORN = 25718;
|
||||
private static final int DUST_RIDER = 25719;
|
||||
private static final int BLEEDING_FLY = 25720;
|
||||
private static final int BLACKDAGGER_WING = 25721;
|
||||
private static final int SHADOW_SUMMONER = 25722;
|
||||
private static final int SPIKE_SLASHER = 25723;
|
||||
private static final int MUSCLE_BOMBER = 25724;
|
||||
// Item
|
||||
private static final int LARGE_DRAGON_BONE = 17248;
|
||||
// Misc
|
||||
private static final int DESPAWN_DELAY = 1800000; // 30min
|
||||
// Variables
|
||||
private static final String I_QUEST0 = "I_QUEST0";
|
||||
// Locations
|
||||
private static final Location SPOT_1 = new Location(92744, 114045, -3072);
|
||||
private static final Location SPOT_2 = new Location(110112, 124976, -3624);
|
||||
private static final Location SPOT_3 = new Location(121637, 113657, -3792);
|
||||
private static final Location SPOT_4 = new Location(109346, 111849, -3040);
|
||||
|
||||
private DragonVortex()
|
||||
{
|
||||
super(DragonVortex.class.getSimpleName(), "ai/npc");
|
||||
addStartNpc(VORTEX);
|
||||
addFirstTalkId(VORTEX);
|
||||
addTalkId(VORTEX);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return "32871.html";
|
||||
addStartNpc(DRAGON_VORTEX);
|
||||
addFirstTalkId(DRAGON_VORTEX);
|
||||
addTalkId(DRAGON_VORTEX);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if ("Spawn".equals(event))
|
||||
switch (event)
|
||||
{
|
||||
if (hasQuestItems(player, LARGE_DRAGON_BONE))
|
||||
case "RAIDBOSS":
|
||||
{
|
||||
final int chance = getRandom(1000);
|
||||
final List<int[]> unspawnedRaids = new ArrayList<>();
|
||||
final List<int[]> unspawnedCandidates = new ArrayList<>();
|
||||
int raidChanceIncrease = 0;
|
||||
|
||||
// Iterate over all Raids and check which ones are currently spawned, sum spawned Raids chance for unspawnedRaids List distribution
|
||||
for (int[] raidsList : RAIDS)
|
||||
if (hasQuestItems(player, LARGE_DRAGON_BONE))
|
||||
{
|
||||
final int raidChance = raidsList[1];
|
||||
if (checkIfNpcSpawned(raidsList[0]))
|
||||
if (!npc.getVariables().getBoolean(I_QUEST0, false))
|
||||
{
|
||||
raidChanceIncrease += raidChance;
|
||||
takeItems(player, LARGE_DRAGON_BONE, 1);
|
||||
final int random = getRandom(100);
|
||||
int raid = 0;
|
||||
if (random < 3)
|
||||
{
|
||||
raid = MUSCLE_BOMBER;
|
||||
}
|
||||
else if (random < 8)
|
||||
{
|
||||
raid = SHADOW_SUMMONER;
|
||||
}
|
||||
else if (random < 15)
|
||||
{
|
||||
raid = SPIKE_SLASHER;
|
||||
}
|
||||
else if (random < 25)
|
||||
{
|
||||
raid = BLACKDAGGER_WING;
|
||||
}
|
||||
else if (random < 45)
|
||||
{
|
||||
raid = BLEEDING_FLY;
|
||||
}
|
||||
else if (random < 67)
|
||||
{
|
||||
raid = DUST_RIDER;
|
||||
}
|
||||
else
|
||||
{
|
||||
raid = EMERALD_HORN;
|
||||
}
|
||||
|
||||
Location LOC = null;
|
||||
switch (npc.getX())
|
||||
{
|
||||
case 92225:
|
||||
{
|
||||
LOC = SPOT_1;
|
||||
break;
|
||||
}
|
||||
case 110116:
|
||||
{
|
||||
LOC = SPOT_2;
|
||||
break;
|
||||
}
|
||||
case 121172:
|
||||
{
|
||||
LOC = SPOT_3;
|
||||
break;
|
||||
}
|
||||
case 108924:
|
||||
{
|
||||
LOC = SPOT_4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
npc.getVariables().set(I_QUEST0, true);
|
||||
addSpawn(raid, LOC, false, 0, true);
|
||||
startQuestTimer("CANSPAWN", 60000, npc, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
unspawnedRaids.add(new int[]
|
||||
{
|
||||
raidsList[0],
|
||||
raidChance
|
||||
});
|
||||
return "32871-02.html";
|
||||
}
|
||||
}
|
||||
|
||||
// If there are unspawnedRaids onto the new List, distribute the amount of increased chances for each one and spawn a new Raid from the new chances
|
||||
if (!unspawnedRaids.isEmpty())
|
||||
else
|
||||
{
|
||||
final int unspawnedRaidsSize = unspawnedRaids.size();
|
||||
final int chanceIncrease = (raidChanceIncrease / unspawnedRaidsSize);
|
||||
int raidChanceValue = 0;
|
||||
|
||||
for (int[] unspawnedRaidsList : unspawnedRaids)
|
||||
{
|
||||
raidChanceValue += unspawnedRaidsList[1] + chanceIncrease;
|
||||
unspawnedCandidates.add(new int[]
|
||||
{
|
||||
unspawnedRaidsList[0],
|
||||
raidChanceValue
|
||||
});
|
||||
}
|
||||
|
||||
for (int[] unspawnedCandidatesList : unspawnedCandidates)
|
||||
{
|
||||
if (chance <= unspawnedCandidatesList[1])
|
||||
{
|
||||
spawnRaid(unspawnedCandidatesList[0], npc, player);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return "32871-01.html";
|
||||
}
|
||||
return "32871-noboss.html";
|
||||
break;
|
||||
}
|
||||
case "CANSPAWN":
|
||||
{
|
||||
npc.getVariables().set(I_QUEST0, false);
|
||||
break;
|
||||
}
|
||||
return "32871-no.html";
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used for spawning a Dragon Vortex Raid and take a Large Dragon Bone from the Player
|
||||
* @param raidId
|
||||
* @param npc
|
||||
* @param player
|
||||
*/
|
||||
public void spawnRaid(int raidId, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final L2Spawn spawnDat = addSpawn(raidId, npc.getX() + getRandom(-500, 500), npc.getY() + getRandom(-500, 500), npc.getZ() + 10, 0, false, DESPAWN_DELAY, true).getSpawn();
|
||||
SpawnTable.getInstance().addNewSpawn(spawnDat, false);
|
||||
takeItems(player, LARGE_DRAGON_BONE, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used for checking if npc is spawned
|
||||
* @param npcId
|
||||
* @return if npc is spawned
|
||||
*/
|
||||
public boolean checkIfNpcSpawned(int npcId)
|
||||
{
|
||||
for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(npcId))
|
||||
{
|
||||
final L2Npc spawnedWarpgate = spawn.getLastSpawn();
|
||||
if ((spawnedWarpgate != null))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new DragonVortex();
|
||||
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-01.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-01.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>
|
||||
(This one is different than the ones I saw before. This one is isolated, and somehow sad looking.<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Look around.</a>
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-02.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-02.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
(It's a stone statue that looks like a human being. Otherwise it looks normal.)
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-03.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-03.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>
|
||||
(This is Kier, a member of Jinia Guild who was turned into an ice sculpture by the Ice Queen Freya.)<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Look around the ice sculpture.</a>
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-04.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/32022-04.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
(A former member of the Jinia Guild. Now he's an ice sculpture of Kier by the Ice Queen.)
|
||||
</body></html>
|
||||
76
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/Kier.java
vendored
Normal file
76
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Kier/Kier.java
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* 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.npc.Kier;
|
||||
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.quest.QuestState;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q00115_TheOtherSideOfTruth.Q00115_TheOtherSideOfTruth;
|
||||
import quests.Q10283_RequestOfIceMerchant.Q10283_RequestOfIceMerchant;
|
||||
|
||||
/**
|
||||
* Kier AI.
|
||||
* @author Adry_85
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public final class Kier extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int KIER = 32022;
|
||||
|
||||
private Kier()
|
||||
{
|
||||
super(Kier.class.getSimpleName(), "ai/npc");
|
||||
addFirstTalkId(KIER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
final QuestState st_Q00115 = player.getQuestState(Q00115_TheOtherSideOfTruth.class.getSimpleName());
|
||||
if (st_Q00115 == null)
|
||||
{
|
||||
htmltext = "32022-02.html";
|
||||
}
|
||||
else if (!st_Q00115.isCompleted())
|
||||
{
|
||||
htmltext = "32022-01.html";
|
||||
}
|
||||
|
||||
final QuestState st_Q10283 = player.getQuestState(Q10283_RequestOfIceMerchant.class.getSimpleName());
|
||||
if (st_Q10283 != null)
|
||||
{
|
||||
if (st_Q10283.isMemoState(2))
|
||||
{
|
||||
htmltext = "32022-03.html";
|
||||
}
|
||||
else if (st_Q10283.isCompleted())
|
||||
{
|
||||
htmltext = "32022-04.html";
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Kier();
|
||||
}
|
||||
}
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714-01.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714-01.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Gatekeeper Asher:<br>
|
||||
Since the the seal was broken, various trees on the island have begun to "leak" large amounts of Mana, drawing it out from reserves far underground.<br>
|
||||
It is now possible to regenerate MP simply by standing near some of these large trees!
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714-02.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714-02.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Gatekeeper Asher:<br>
|
||||
You don't have enough money.<br>
|
||||
Teleporting to Rune Township requires 50,000 Adena.
|
||||
</body></html>
|
||||
7
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714.html
vendored
Normal file
7
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/32714.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Gatekeeper Asher:<br>
|
||||
For thousands of years, Primeval Isle had been sealed to prevent its inhabitants from leaving through this Gate. Now, however, adventurers' activities seem to have finally weakened the seal enough to permit departures.<br>
|
||||
You may now teleport to the mainland, but only to Rune Township. Would you like to do so?<br>
|
||||
<a action="bypass -h Quest Asher teleport">Teleport to Rune Township (50,000 Adena).</a><br>
|
||||
<a action="bypass -h Quest Asher 32714-01.html">Ask about the effects of the weakened seal.</a><br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
|
||||
</body></html>
|
||||
73
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/Asher.java
vendored
Normal file
73
L2J_Mobius_HighFive/dist/game/data/scripts/ai/npc/Teleports/Asher/Asher.java
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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.npc.Teleports.Asher;
|
||||
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Asher AI.
|
||||
* @author Adry_85
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public class Asher extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int ASHER = 32714;
|
||||
// Location
|
||||
private static final Location LOCATION = new Location(43835, -47749, -792);
|
||||
// Misc
|
||||
private static final int ADENA = 50000;
|
||||
|
||||
private Asher()
|
||||
{
|
||||
super(Asher.class.getSimpleName(), "ai/npc/Teleports");
|
||||
addFirstTalkId(ASHER);
|
||||
addStartNpc(ASHER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
if (event.equals("teleport"))
|
||||
{
|
||||
if (player.getAdena() >= ADENA)
|
||||
{
|
||||
player.teleToLocation(LOCATION);
|
||||
takeItems(player, Inventory.ADENA_ID, ADENA);
|
||||
}
|
||||
else
|
||||
{
|
||||
return "32714-02.html";
|
||||
}
|
||||
}
|
||||
else if (event.equals("32714-01.html"))
|
||||
{
|
||||
return event;
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Asher();
|
||||
}
|
||||
}
|
||||
@@ -196,6 +196,11 @@ public abstract class AbstractInstance extends AbstractNpcAI
|
||||
|
||||
protected abstract void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance);
|
||||
|
||||
protected boolean checkConditions(L2PcInstance player, int templateId)
|
||||
{
|
||||
return checkConditions(player);
|
||||
}
|
||||
|
||||
protected boolean checkConditions(L2PcInstance player)
|
||||
{
|
||||
return true;
|
||||
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-02.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-02.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
One of your party members is not a member of the clan who owns the castle...
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-03.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-03.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
It is already in use. Once training has begun, you must wait 4 hours before entering.
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-04.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-04.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
You cannot enter the Prison 2 hours prior to a siege. Access will be granted once the siege ends. Also, you can't access the underground dungeon until a castle lord announces the siege after the battle.
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-05.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403-05.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>
|
||||
The threat to civic order in the territory is a great deal more pressing than a training session in the prison.<br> (You cannot enter the prison without a contract with the fortress.)
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403.html
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/36403.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Prison Manager:<br>
|
||||
This is a dangerous place. Don't come around here unless you're ready for a fight!<br><br>
|
||||
<a action="bypass -h npc_%objectId%_Chat 0">"I heard a rumor about Rim Pailaka."</a><br>
|
||||
<a action="bypass -h Quest CastleDungeon">"I want to enter the prison."</a><br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
|
||||
</body></html>
|
||||
233
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/CastleDungeon.java
vendored
Normal file
233
L2J_Mobius_HighFive/dist/game/data/scripts/instances/CastleDungeon/CastleDungeon.java
vendored
Normal file
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
* 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 instances.CastleDungeon;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.l2jmobius.gameserver.instancemanager.FortManager;
|
||||
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||
import com.l2jmobius.gameserver.model.L2Party;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.entity.Castle;
|
||||
import com.l2jmobius.gameserver.model.entity.Fort;
|
||||
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
|
||||
import com.l2jmobius.gameserver.util.Util;
|
||||
|
||||
import instances.AbstractInstance;
|
||||
|
||||
/**
|
||||
* Castle Dungeon instance zone.
|
||||
* @author Adry_85
|
||||
* @since 2.6.0.0
|
||||
*/
|
||||
public final class CastleDungeon extends AbstractInstance
|
||||
{
|
||||
protected class CDWorld extends InstanceWorld
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Locations
|
||||
private static final Location[] ENTER_LOC =
|
||||
{
|
||||
new Location(12188, -48770, -3008),
|
||||
new Location(12218, -48770, -3008),
|
||||
new Location(12248, -48770, -3008),
|
||||
};
|
||||
|
||||
private static final Location RAIDS_LOC = new Location(11793, -49190, -3008, 0);
|
||||
// Misc
|
||||
private static final Map<Integer, Integer> CASTLE_DUNGEON = new HashMap<>();
|
||||
private static final Map<Integer, List<Integer>> FORTRESS = new HashMap<>();
|
||||
static
|
||||
{
|
||||
CASTLE_DUNGEON.put(36403, 13); // Gludio
|
||||
CASTLE_DUNGEON.put(36404, 14); // Dion
|
||||
CASTLE_DUNGEON.put(36405, 15); // Giran
|
||||
CASTLE_DUNGEON.put(36406, 16); // Oren
|
||||
CASTLE_DUNGEON.put(36407, 17); // Aden
|
||||
CASTLE_DUNGEON.put(36408, 18); // Innadril
|
||||
CASTLE_DUNGEON.put(36409, 19); // Goddard
|
||||
CASTLE_DUNGEON.put(36410, 20); // Rune
|
||||
CASTLE_DUNGEON.put(36411, 21); // Schuttgart
|
||||
FORTRESS.put(1, Arrays.asList(101, 102, 112, 113)); // Gludio Castle
|
||||
FORTRESS.put(2, Arrays.asList(103, 112, 114, 115)); // Dion Castle
|
||||
FORTRESS.put(3, Arrays.asList(104, 114, 116, 118, 119)); // Giran Castle
|
||||
FORTRESS.put(4, Arrays.asList(105, 113, 115, 116, 117)); // Oren Castle
|
||||
FORTRESS.put(5, Arrays.asList(106, 107, 117, 118)); // Aden Castle
|
||||
FORTRESS.put(6, Arrays.asList(108, 119)); // Innadril Castle
|
||||
FORTRESS.put(7, Arrays.asList(109, 117, 120)); // Goddard Castle
|
||||
FORTRESS.put(8, Arrays.asList(110, 120, 121)); // Rune Castle
|
||||
FORTRESS.put(9, Arrays.asList(111, 121)); // Schuttgart Castle
|
||||
}
|
||||
|
||||
// Raid Bosses
|
||||
protected static final int[] RAIDS1 =
|
||||
{
|
||||
25546, // Rhianna the Traitor
|
||||
25549, // Tesla the Deceiver
|
||||
25552, // Soul Hunter Chakundel
|
||||
};
|
||||
protected static final int[] RAIDS2 =
|
||||
{
|
||||
25553, // Durango the Crusher
|
||||
25554, // Brutus the Obstinate
|
||||
25557, // Ranger Karankawa
|
||||
25560, // Sargon the Mad
|
||||
};
|
||||
protected static final int[] RAIDS3 =
|
||||
{
|
||||
25563, // Beautiful Atrielle
|
||||
25566, // Nagen the Tomboy
|
||||
25569, // Jax the Destroyer
|
||||
};
|
||||
|
||||
public CastleDungeon()
|
||||
{
|
||||
super(CastleDungeon.class.getSimpleName());
|
||||
addFirstTalkId(CASTLE_DUNGEON.keySet());
|
||||
addStartNpc(CASTLE_DUNGEON.keySet());
|
||||
addTalkId(CASTLE_DUNGEON.keySet());
|
||||
addKillId(RAIDS1);
|
||||
addKillId(RAIDS2);
|
||||
addKillId(RAIDS3);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance)
|
||||
{
|
||||
if (firstEntrance)
|
||||
{
|
||||
if (player.getParty() == null)
|
||||
{
|
||||
teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
|
||||
world.addAllowed(player.getObjectId());
|
||||
}
|
||||
else
|
||||
{
|
||||
for (L2PcInstance partyMember : player.getParty().getMembers())
|
||||
{
|
||||
teleportPlayer(partyMember, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
|
||||
world.addAllowed(partyMember.getObjectId());
|
||||
}
|
||||
}
|
||||
|
||||
world.setStatus(0);
|
||||
spawnRaid((CDWorld) world);
|
||||
}
|
||||
else
|
||||
{
|
||||
teleportPlayer(player, ENTER_LOC[getRandom(ENTER_LOC.length)], world.getInstanceId());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
return "36403.html";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
|
||||
{
|
||||
InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
|
||||
if (tmpworld instanceof CDWorld)
|
||||
{
|
||||
CDWorld world = (CDWorld) tmpworld;
|
||||
if (Util.contains(RAIDS3, npc.getId()))
|
||||
{
|
||||
finishInstance(world);
|
||||
}
|
||||
else
|
||||
{
|
||||
world.incStatus();
|
||||
spawnRaid(world);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final L2Party party = player.getParty();
|
||||
if (party == null)
|
||||
{
|
||||
return "36403-01.html";
|
||||
}
|
||||
|
||||
final Castle castle = npc.getCastle();
|
||||
if (castle.getSiege().isInProgress())
|
||||
{
|
||||
return "36403-04.html";
|
||||
}
|
||||
|
||||
if ((npc.isMyLord(player) || ((player.getClan() != null) && (npc.getCastle().getResidenceId() == player.getClan().getCastleId()) && (player.getClan().getCastleId() > 0))))
|
||||
{
|
||||
final int numFort = ((castle.getResidenceId() == 1) || (castle.getResidenceId() == 5)) ? 2 : 1;
|
||||
final List<Integer> fort = FORTRESS.get(castle.getResidenceId());
|
||||
for (int i = 0; i < numFort; i++)
|
||||
{
|
||||
final Fort fortress = FortManager.getInstance().getFortById(fort.get(i));
|
||||
if (fortress.getFortState() == 0)
|
||||
{
|
||||
return "36403-05.html";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (L2PcInstance partyMember : party.getMembers())
|
||||
{
|
||||
if ((partyMember.getClan() == null) || (partyMember.getClan().getCastleId() != castle.getResidenceId()))
|
||||
{
|
||||
return "36403-02.html";
|
||||
}
|
||||
|
||||
if (System.currentTimeMillis() < InstanceManager.getInstance().getInstanceTime(partyMember.getObjectId(), CASTLE_DUNGEON.get(npc.getId())))
|
||||
{
|
||||
return "36403-03.html";
|
||||
}
|
||||
}
|
||||
|
||||
enterInstance(player, new CDWorld(), "CastleDungeon.xml", CASTLE_DUNGEON.get(npc.getId()));
|
||||
return super.onTalk(npc, player);
|
||||
}
|
||||
|
||||
protected void spawnRaid(CDWorld world)
|
||||
{
|
||||
int spawnId;
|
||||
if (world.getStatus() == 0)
|
||||
{
|
||||
spawnId = RAIDS1[getRandom(RAIDS1.length)];
|
||||
}
|
||||
else if (world.getStatus() == 1)
|
||||
{
|
||||
spawnId = RAIDS2[getRandom(RAIDS2.length)];
|
||||
}
|
||||
else
|
||||
{
|
||||
spawnId = RAIDS3[getRandom(RAIDS3.length)];
|
||||
}
|
||||
|
||||
addSpawn(spawnId, RAIDS_LOC, false, 0, false, world.getInstanceId());
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@ import instances.AbstractInstance;
|
||||
import quests.Q10292_SevenSignsGirlOfDoubt.Q10292_SevenSignsGirlOfDoubt;
|
||||
import quests.Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom;
|
||||
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
|
||||
import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
|
||||
import quests.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal;
|
||||
|
||||
/**
|
||||
* Elcadia's Tent instance zone.
|
||||
@@ -35,12 +35,17 @@ import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
|
||||
*/
|
||||
public final class ElcadiasTent extends AbstractInstance
|
||||
{
|
||||
protected class ETWorld extends InstanceWorld
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// NPCs
|
||||
private static final int ELCADIA = 32784;
|
||||
private static final int GRUFF_LOOKING_MAN = 32862;
|
||||
// Locations
|
||||
private static final Location START_LOC = new Location(89706, -238074, -9632, 0, 0);
|
||||
private static final Location EXIT_LOC = new Location(43316, -87986, -2832, 0, 0);
|
||||
private static final Location START_LOC = new Location(89797, -238081, -9632);
|
||||
private static final Location EXIT_LOC = new Location(43347, -87923, -2820);
|
||||
// Misc
|
||||
private static final int TEMPLATE_ID = 158;
|
||||
|
||||
@@ -57,17 +62,17 @@ public final class ElcadiasTent extends AbstractInstance
|
||||
{
|
||||
if (npc.getId() == GRUFF_LOOKING_MAN)
|
||||
{
|
||||
final QuestState GirlOfDoubt = talker.getQuestState(Q10292_SevenSignsGirlOfDoubt.class.getSimpleName());
|
||||
final QuestState ForbiddenBook = talker.getQuestState(Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.class.getSimpleName());
|
||||
final QuestState Monastery = talker.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
|
||||
final QuestState PowerOfSeal = talker.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName());
|
||||
if (((GirlOfDoubt != null) && GirlOfDoubt.isStarted()) //
|
||||
|| ((GirlOfDoubt != null) && GirlOfDoubt.isCompleted() && (ForbiddenBook == null)) //
|
||||
|| ((ForbiddenBook != null) && ForbiddenBook.isStarted()) //
|
||||
|| ((ForbiddenBook != null) && ForbiddenBook.isCompleted() && (Monastery == null)) //
|
||||
|| ((PowerOfSeal != null) && PowerOfSeal.isStarted()))
|
||||
final QuestState Q10292 = talker.getQuestState(Q10292_SevenSignsGirlOfDoubt.class.getSimpleName());
|
||||
final QuestState Q10293 = talker.getQuestState(Q10293_SevenSignsForbiddenBookOfTheElmoreAdenKingdom.class.getSimpleName());
|
||||
final QuestState Q10294 = talker.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
|
||||
final QuestState Q10296 = talker.getQuestState(Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.class.getSimpleName());
|
||||
if (((Q10292 != null) && Q10292.isStarted()) //
|
||||
|| ((Q10292 != null) && Q10292.isCompleted() && (Q10293 == null)) //
|
||||
|| ((Q10293 != null) && Q10293.isStarted()) //
|
||||
|| ((Q10293 != null) && Q10293.isCompleted() && (Q10294 == null)) //
|
||||
|| ((Q10296 != null) && (Q10296.getMemoState() > 2) && (Q10296.getMemoState() < 4)))
|
||||
{
|
||||
enterInstance(talker, "ElcadiasTent.xml", TEMPLATE_ID);
|
||||
enterInstance(talker, new ETWorld(), "ElcadiasTent.xml", TEMPLATE_ID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ package instances;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import instances.CastleDungeon.CastleDungeon;
|
||||
import instances.CavernOfThePirateCaptain.CavernOfThePirateCaptain;
|
||||
import instances.ChambersOfDelusion.ChamberOfDelusionEast;
|
||||
import instances.ChambersOfDelusion.ChamberOfDelusionNorth;
|
||||
@@ -42,12 +43,10 @@ import instances.Kamaloka.Kamaloka;
|
||||
import instances.LibraryOfSages.LibraryOfSages;
|
||||
import instances.MithrilMine.MithrilMine;
|
||||
import instances.MonasteryOfSilence1.MonasteryOfSilence1;
|
||||
import instances.MonasteryOfSilence2.MonasteryOfSilence2;
|
||||
import instances.NornilsGarden.NornilsGarden;
|
||||
import instances.NornilsGardenQuest.NornilsGardenQuest;
|
||||
import instances.PailakaDevilsLegacy.PailakaDevilsLegacy;
|
||||
import instances.PailakaSongOfIceAndFire.PailakaSongOfIceAndFire;
|
||||
import instances.RimKamaloka.RimKamaloka;
|
||||
import instances.SanctumOftheLordsOfDawn.SanctumOftheLordsOfDawn;
|
||||
|
||||
/**
|
||||
@@ -60,6 +59,7 @@ public final class InstanceLoader
|
||||
|
||||
private static final Class<?>[] SCRIPTS =
|
||||
{
|
||||
CastleDungeon.class,
|
||||
CavernOfThePirateCaptain.class,
|
||||
CrystalCaverns.class,
|
||||
DarkCloudMansion.class,
|
||||
@@ -83,12 +83,10 @@ public final class InstanceLoader
|
||||
LibraryOfSages.class,
|
||||
MithrilMine.class,
|
||||
MonasteryOfSilence1.class,
|
||||
MonasteryOfSilence2.class,
|
||||
NornilsGarden.class,
|
||||
NornilsGardenQuest.class,
|
||||
PailakaDevilsLegacy.class,
|
||||
PailakaSongOfIceAndFire.class,
|
||||
RimKamaloka.class,
|
||||
SanctumOftheLordsOfDawn.class,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<html><html>Sister of Silence Eris:<br>
|
||||
Finally we meet, Successors of Fate. In the end, the endless Bridle of Eternity will be back where it belongs.<br>
|
||||
<a action="bypass -h Quest MonasteryOfSilence1 EXIT">"I'd like to go outside."</a><br>
|
||||
<a action="bypass -h npc_%objectId%_Quest">Quest</a>
|
||||
</body></html>
|
||||
@@ -1,3 +1,3 @@
|
||||
<html><body>Teleportation Device: Move to East Watcher's Room.<br><br>
|
||||
<html><body>Teleportation Device: Move to East Watcher's Room.<br>
|
||||
<a action="bypass -h Quest MonasteryOfSilence1 EAST">Move to East Watcher's Room</a>
|
||||
</body></html>
|
||||
@@ -1,3 +1,3 @@
|
||||
<html><body>Teleportation Device: Move to West Watcher's Room.<br><br>
|
||||
<html><body>Teleportation Device: Move to West Watcher's Room.<br>
|
||||
<a action="bypass -h Quest MonasteryOfSilence1 WEST">Move to West Watcher's Room</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/instances/MonasteryOfSilence1/32843-01.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/instances/MonasteryOfSilence1/32843-01.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Tomb of Saintess:<br>
|
||||
You look at the tomb, and see these words.<br>
|
||||
"For the Saintess Solina, who devoted all her life to serve Einhasad and the Elmoreden Kingdom...to be remembered forever by those she saved and those who loved her...may punishing find the feet of those who ignored Solina's teachings."<br>
|
||||
This is not Solina's real tomb.
|
||||
</body></html>
|
||||
@@ -16,16 +16,22 @@
|
||||
*/
|
||||
package instances.MonasteryOfSilence1;
|
||||
|
||||
import com.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import com.l2jmobius.gameserver.enums.ChatType;
|
||||
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||
import com.l2jmobius.gameserver.model.Location;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Attackable;
|
||||
import com.l2jmobius.gameserver.model.actor.L2Npc;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.holders.SkillHolder;
|
||||
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
|
||||
import com.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import com.l2jmobius.gameserver.network.NpcStringId;
|
||||
|
||||
import instances.AbstractInstance;
|
||||
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
|
||||
import quests.Q10295_SevenSignsSolinasTomb.Q10295_SevenSignsSolinasTomb;
|
||||
import quests.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal;
|
||||
|
||||
/**
|
||||
* Monastery of Silence instance zone.
|
||||
@@ -36,6 +42,8 @@ public final class MonasteryOfSilence1 extends AbstractInstance
|
||||
protected static final class MoSWorld extends InstanceWorld
|
||||
{
|
||||
protected L2Npc elcadia = null;
|
||||
protected int deadTombGuardianCount = 0;
|
||||
protected int deadSolinaGuardianCount = 0;
|
||||
}
|
||||
|
||||
// NPCs
|
||||
@@ -51,6 +59,24 @@ public final class MonasteryOfSilence1 extends AbstractInstance
|
||||
private static final int TELEPORT_CONTROL_DEVICE2 = 32818;
|
||||
private static final int TELEPORT_CONTROL_DEVICE3 = 32819;
|
||||
private static final int TELEPORT_CONTROL_DEVICE4 = 32820;
|
||||
private static final int TOMB_OF_THE_SAINTESS = 32843;
|
||||
// Monsters
|
||||
private static final int TRAINEE_OF_REST = 27403;
|
||||
private static final int SUPPLICANT_OF_REST = 27404;
|
||||
private static final int ETIS_VAN_ETINA = 18949;
|
||||
private static final int SOLINAS_GUARDIAN_1 = 18952;
|
||||
private static final int SOLINAS_GUARDIAN_2 = 18953;
|
||||
private static final int SOLINAS_GUARDIAN_3 = 18954;
|
||||
private static final int SOLINAS_GUARDIAN_4 = 18955;
|
||||
private static final int GUARDIAN_OF_THE_TOMB_1 = 18956;
|
||||
private static final int GUARDIAN_OF_THE_TOMB_2 = 18957;
|
||||
private static final int GUARDIAN_OF_THE_TOMB_3 = 18958;
|
||||
private static final int GUARDIAN_OF_THE_TOMB_4 = 18959;
|
||||
// Items
|
||||
private static final int SCROLL_OF_ABSTINENCE = 17228;
|
||||
private static final int SHIELD_OF_SACRIFICE = 17229;
|
||||
private static final int SWORD_OF_HOLY_SPIRIT = 17230;
|
||||
private static final int STAFF_OF_BLESSING = 17231;
|
||||
// Skills
|
||||
private static final SkillHolder[] BUFFS =
|
||||
{
|
||||
@@ -59,28 +85,109 @@ public final class MonasteryOfSilence1 extends AbstractInstance
|
||||
new SkillHolder(6730, 1), // Greater Battle Heal of Elcadia
|
||||
};
|
||||
// Locations
|
||||
private static final Location START_LOC = new Location(120710, -86971, -3392);
|
||||
private static final Location EXIT_LOC = new Location(115983, -87351, -3397, 0, 0);
|
||||
private static final Location START_LOC = new Location(120717, -86879, -3424);
|
||||
private static final Location EXIT_LOC = new Location(115983, -87351, -3397);
|
||||
private static final Location CENTRAL_ROOM_LOC = new Location(85794, -249788, -8320);
|
||||
private static final Location SOUTH_WATCHERS_ROOM_LOC = new Location(85798, -246566, -8320);
|
||||
private static final Location WEST_WATCHERS_ROOM_LOC = new Location(82531, -249405, -8320);
|
||||
private static final Location EAST_WATCHERS_ROOM_LOC = new Location(88665, -249784, -8320);
|
||||
private static final Location NORTH_WATCHERS_ROOM_LOC = new Location(85792, -252336, -8320);
|
||||
private static final Location BACK_LOC = new Location(120710, -86971, -3392);
|
||||
// NpcString
|
||||
private static final NpcStringId[] ELCADIA_DIALOGS =
|
||||
private static final Location START_LOC_Q10295 = new Location(45545, -249423, -6788);
|
||||
private static final Location CASKET_ROOM_LOC = new Location(56033, -252944, -6792);
|
||||
private static final Location SOLINAS_RESTING_PLACE_LOC = new Location(55955, -250394, -6792);
|
||||
private static final Location DIRECTORS_ROOM_LOC = new Location(120717, -86879, -3424);
|
||||
private static final Location GUARDIAN_OF_THE_TOMB_1_LOC = new Location(55498, -252781, -6752, 0);
|
||||
private static final Location GUARDIAN_OF_THE_TOMB_2_LOC = new Location(55520, -252160, -6752, 0);
|
||||
private static final Location GUARDIAN_OF_THE_TOMB_3_LOC = new Location(56635, -252776, -6752, -32180);
|
||||
private static final Location GUARDIAN_OF_THE_TOMB_4_LOC = new Location(56672, -252156, -6754, 32252);
|
||||
private static final Location SOLINAS_GUARDIAN_1_LOC = new Location(45399, -253051, -6765, 16584);
|
||||
private static final Location SOLINAS_GUARDIAN_2_LOC = new Location(48736, -249632, -6768, -32628);
|
||||
private static final Location SOLINAS_GUARDIAN_3_LOC = new Location(45392, -246303, -6768, -16268);
|
||||
private static final Location SOLINAS_GUARDIAN_4_LOC = new Location(42016, -249648, -6764, 0);
|
||||
private static final Location ELCADIA_LOC = new Location(115927, -87005, -3392);
|
||||
private static final Location SPACE_LOC = new Location(76736, -241021, -10780);
|
||||
private static final Location ETIS_VAN_ETINA_LOC = new Location(76625, -240824, -10832, 0);
|
||||
private static final Location[] SLAVE_SPAWN_1_LOC =
|
||||
{
|
||||
new Location(55680, -252832, -6752),
|
||||
new Location(55825, -252792, -6752),
|
||||
new Location(55687, -252718, -6752),
|
||||
new Location(55824, -252679, -6752),
|
||||
};
|
||||
private static final Location[] SLAVE_SPAWN_2_LOC =
|
||||
{
|
||||
new Location(55672, -252099, -6751),
|
||||
new Location(55810, -252262, -6752),
|
||||
new Location(55824, -252112, -6752),
|
||||
new Location(55669, -252227, -6752),
|
||||
};
|
||||
private static final Location[] SLAVE_SPAWN_3_LOC =
|
||||
{
|
||||
new Location(56480, -252833, -6751),
|
||||
new Location(56481, -252725, -6752),
|
||||
new Location(56368, -252787, -6752),
|
||||
new Location(56368, -252669, -6752),
|
||||
};
|
||||
private static final Location[] SLAVE_SPAWN_4_LOC =
|
||||
{
|
||||
new Location(56463, -252225, -6751),
|
||||
new Location(56469, -252108, -6752),
|
||||
new Location(56336, -252168, -6752),
|
||||
new Location(56336, -252288, -6752),
|
||||
};
|
||||
// NpcString
|
||||
private static final NpcStringId[] ELCADIA_DIALOGS_Q010294 =
|
||||
{
|
||||
NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK,
|
||||
NpcStringId.WE_MUST_SEARCH_HIGH_AND_LOW_IN_EVERY_ROOM_FOR_THE_READING_DESK_THAT_CONTAINS_THE_BOOK_WE_SEEK,
|
||||
NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU
|
||||
NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU,
|
||||
NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK
|
||||
};
|
||||
|
||||
private static final NpcStringId[] ELCADIA_DIALOGS_Q010295 =
|
||||
{
|
||||
NpcStringId.THE_GUARDIAN_OF_THE_SEAL_DOESN_T_SEEM_TO_GET_INJURED_AT_ALL_UNTIL_THE_BARRIER_IS_DESTROYED,
|
||||
NpcStringId.THE_DEVICE_LOCATED_IN_THE_ROOM_IN_FRONT_OF_THE_GUARDIAN_OF_THE_SEAL_IS_DEFINITELY_THE_BARRIER_THAT_CONTROLS_THE_GUARDIAN_S_POWER,
|
||||
NpcStringId.TO_REMOVE_THE_BARRIER_YOU_MUST_FIND_THE_RELICS_THAT_FIT_THE_BARRIER_AND_ACTIVATE_THE_DEVICE
|
||||
};
|
||||
// Misc
|
||||
private static final int TEMPLATE_ID = 151;
|
||||
// Doors
|
||||
private static final int TOMB_DOOR = 21100018;
|
||||
private static final int[] DOORS =
|
||||
{
|
||||
21100014,
|
||||
21100001,
|
||||
21100006,
|
||||
21100010,
|
||||
21100003,
|
||||
21100008,
|
||||
21100012,
|
||||
21100016,
|
||||
21100002,
|
||||
21100015,
|
||||
21100005,
|
||||
21100004,
|
||||
21100009,
|
||||
21100007,
|
||||
21100013,
|
||||
21100011
|
||||
};
|
||||
|
||||
private static final int[] FAKE_TOMB_DOORS =
|
||||
{
|
||||
21100101,
|
||||
21100102,
|
||||
21100103,
|
||||
21100104
|
||||
};
|
||||
|
||||
public MonasteryOfSilence1()
|
||||
{
|
||||
super(MonasteryOfSilence1.class.getSimpleName());
|
||||
addFirstTalkId(TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
|
||||
addFirstTalkId(TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4);
|
||||
addKillId(SOLINAS_GUARDIAN_1, SOLINAS_GUARDIAN_2, SOLINAS_GUARDIAN_3, SOLINAS_GUARDIAN_4, GUARDIAN_OF_THE_TOMB_1, GUARDIAN_OF_THE_TOMB_2, GUARDIAN_OF_THE_TOMB_3, GUARDIAN_OF_THE_TOMB_4, ETIS_VAN_ETINA);
|
||||
addSpawnId(ERIS_EVIL_THOUGHTS, TOMB_OF_THE_SAINTESS);
|
||||
addStartNpc(ODD_GLOBE, TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
|
||||
addTalkId(ODD_GLOBE, ERIS_EVIL_THOUGHTS, RELIC_GUARDIAN, RELIC_WATCHER1, RELIC_WATCHER2, RELIC_WATCHER3, RELIC_WATCHER4, TELEPORT_CONTROL_DEVICE1, TELEPORT_CONTROL_DEVICE2, TELEPORT_CONTROL_DEVICE3, TELEPORT_CONTROL_DEVICE4, ERIS_EVIL_THOUGHTS);
|
||||
}
|
||||
@@ -99,91 +206,338 @@ public final class MonasteryOfSilence1 extends AbstractInstance
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final InstanceWorld tmpworld = InstanceManager.getInstance().getPlayerWorld(player);
|
||||
if (!(tmpworld instanceof MoSWorld))
|
||||
final InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
|
||||
if (tmpworld instanceof MoSWorld)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final MoSWorld world = (MoSWorld) tmpworld;
|
||||
switch (event)
|
||||
{
|
||||
case "TELE2":
|
||||
final MoSWorld world = (MoSWorld) tmpworld;
|
||||
switch (event)
|
||||
{
|
||||
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, 0, world.getInstanceId());
|
||||
startQuestTimer("START_MOVIE", 2000, npc, player);
|
||||
break;
|
||||
}
|
||||
case "EXIT":
|
||||
{
|
||||
cancelQuestTimer("FOLLOW", npc, player);
|
||||
teleportPlayer(player, EXIT_LOC, 0);
|
||||
world.elcadia.deleteMe();
|
||||
break;
|
||||
}
|
||||
case "START_MOVIE":
|
||||
{
|
||||
player.showQuestMovie(24);
|
||||
break;
|
||||
}
|
||||
case "BACK":
|
||||
{
|
||||
teleportPlayer(player, BACK_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(BACK_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "EAST":
|
||||
{
|
||||
teleportPlayer(player, EAST_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(EAST_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "WEST":
|
||||
{
|
||||
teleportPlayer(player, WEST_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(WEST_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "NORTH":
|
||||
{
|
||||
teleportPlayer(player, NORTH_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(NORTH_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "SOUTH":
|
||||
{
|
||||
teleportPlayer(player, SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(SOUTH_WATCHERS_ROOM_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "CENTER":
|
||||
{
|
||||
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "FOLLOW":
|
||||
{
|
||||
npc.setIsRunning(true);
|
||||
npc.getAI().startFollow(player);
|
||||
if (player.isInCombat())
|
||||
case "TELE2":
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.YOUR_WORK_HERE_IS_DONE_SO_RETURN_TO_THE_CENTRAL_GUARDIAN);
|
||||
npc.setTarget(player);
|
||||
npc.doCast(BUFFS[getRandom(BUFFS.length)].getSkill());
|
||||
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, world.getInstanceId(), 0);
|
||||
startQuestTimer("START_MOVIE", 2000, npc, player);
|
||||
break;
|
||||
}
|
||||
else
|
||||
case "EXIT":
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS[getRandom(ELCADIA_DIALOGS.length)]);
|
||||
cancelQuestTimer("FOLLOW", npc, player);
|
||||
cancelQuestTimer("DIALOG", npc, player);
|
||||
teleportPlayer(player, EXIT_LOC, 0);
|
||||
world.elcadia.deleteMe();
|
||||
break;
|
||||
}
|
||||
case "START_MOVIE":
|
||||
{
|
||||
player.showQuestMovie(24);
|
||||
break;
|
||||
}
|
||||
case "BACK":
|
||||
{
|
||||
teleportPlayer(player, BACK_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(BACK_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "EAST":
|
||||
{
|
||||
teleportPlayer(player, EAST_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(EAST_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "WEST":
|
||||
{
|
||||
teleportPlayer(player, WEST_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(WEST_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "NORTH":
|
||||
{
|
||||
teleportPlayer(player, NORTH_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(NORTH_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "SOUTH":
|
||||
{
|
||||
teleportPlayer(player, SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(SOUTH_WATCHERS_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "CENTER":
|
||||
{
|
||||
teleportPlayer(player, CENTRAL_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(CENTRAL_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "FOLLOW":
|
||||
{
|
||||
npc.setIsRunning(true);
|
||||
npc.getAI().startFollow(player);
|
||||
if (player.isInCombat())
|
||||
{
|
||||
npc.doCast(BUFFS[getRandom(BUFFS.length)].getSkill());
|
||||
}
|
||||
startQuestTimer("FOLLOW", 5000, npc, player);
|
||||
break;
|
||||
}
|
||||
case "DIALOG":
|
||||
{
|
||||
final QuestState st_Q10294 = player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
|
||||
final QuestState st_Q10295 = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
|
||||
if ((st_Q10294 != null) && st_Q10294.isStarted())
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS_Q010294[getRandom(ELCADIA_DIALOGS_Q010294.length)]);
|
||||
}
|
||||
if ((st_Q10295 != null) && st_Q10295.isMemoState(1))
|
||||
{
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, ELCADIA_DIALOGS_Q010295[getRandom(ELCADIA_DIALOGS_Q010295.length)]);
|
||||
}
|
||||
startQuestTimer("DIALOG", 10000, npc, player);
|
||||
break;
|
||||
}
|
||||
case "ENTER_Q10295":
|
||||
{
|
||||
teleportPlayer(player, START_LOC_Q10295, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(START_LOC_Q10295, world.getInstanceId(), 0);
|
||||
startQuestTimer("START_MOVIE_Q10295", 2000, npc, player);
|
||||
break;
|
||||
}
|
||||
case "START_MOVIE_Q10295":
|
||||
{
|
||||
player.showQuestMovie(26);
|
||||
break;
|
||||
}
|
||||
case "CASKET_ROOM":
|
||||
{
|
||||
teleportPlayer(player, CASKET_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(CASKET_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "SOLINAS_RESTING_PLACE":
|
||||
{
|
||||
teleportPlayer(player, SOLINAS_RESTING_PLACE_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(SOLINAS_RESTING_PLACE_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "ERIS_OFFICE":
|
||||
{
|
||||
teleportPlayer(player, START_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(START_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "OPEN_DOORS":
|
||||
{
|
||||
for (int doorId : DOORS)
|
||||
{
|
||||
openDoor(doorId, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "DIRECTORS_ROOM":
|
||||
{
|
||||
teleportPlayer(player, DIRECTORS_ROOM_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(DIRECTORS_ROOM_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "USE_SCROLL":
|
||||
{
|
||||
// TODO (Adry_85): Missing area debuff
|
||||
if (hasQuestItems(player, SCROLL_OF_ABSTINENCE))
|
||||
{
|
||||
takeItems(player, SCROLL_OF_ABSTINENCE, 1);
|
||||
addSpawn(SOLINAS_GUARDIAN_1, SOLINAS_GUARDIAN_1_LOC, false, 0, false, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "USE_SHIELD":
|
||||
{
|
||||
// TODO (Adry_85): Missing area debuff
|
||||
if (hasQuestItems(player, SHIELD_OF_SACRIFICE))
|
||||
{
|
||||
takeItems(player, SHIELD_OF_SACRIFICE, 1);
|
||||
addSpawn(SOLINAS_GUARDIAN_2, SOLINAS_GUARDIAN_2_LOC, false, 0, false, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "USE_SWORD":
|
||||
{
|
||||
// TODO (Adry_85): Missing area debuff
|
||||
if (hasQuestItems(player, SWORD_OF_HOLY_SPIRIT))
|
||||
{
|
||||
takeItems(player, SWORD_OF_HOLY_SPIRIT, 1);
|
||||
addSpawn(SOLINAS_GUARDIAN_3, SOLINAS_GUARDIAN_3_LOC, false, 0, false, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "USE_STAFF":
|
||||
{
|
||||
// TODO (Adry_85): Missing area debuff
|
||||
if (hasQuestItems(player, STAFF_OF_BLESSING))
|
||||
{
|
||||
takeItems(player, STAFF_OF_BLESSING, 1);
|
||||
addSpawn(SOLINAS_GUARDIAN_4, SOLINAS_GUARDIAN_4_LOC, false, 0, false, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "CLOSE_TOMB_DOORS":
|
||||
{
|
||||
for (int doorId : FAKE_TOMB_DOORS)
|
||||
{
|
||||
closeDoor(doorId, world.getInstanceId());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "TOMB_GUARDIAN_SPAWN":
|
||||
{
|
||||
for (int doorId : FAKE_TOMB_DOORS)
|
||||
{
|
||||
openDoor(doorId, world.getInstanceId());
|
||||
}
|
||||
|
||||
addSpawn(GUARDIAN_OF_THE_TOMB_1, GUARDIAN_OF_THE_TOMB_1_LOC, false, 0, false, world.getInstanceId());
|
||||
|
||||
for (Location LOC : SLAVE_SPAWN_1_LOC)
|
||||
{
|
||||
L2Attackable mob = (L2Attackable) addSpawn(TRAINEE_OF_REST, LOC, false, 0, false, world.getInstanceId());
|
||||
mob.setIsRunning(true);
|
||||
mob.addDamageHate(player, 0, 999);
|
||||
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
|
||||
}
|
||||
|
||||
addSpawn(GUARDIAN_OF_THE_TOMB_2, GUARDIAN_OF_THE_TOMB_2_LOC, false, 0, false, world.getInstanceId());
|
||||
|
||||
for (Location LOC : SLAVE_SPAWN_2_LOC)
|
||||
{
|
||||
L2Attackable mob = (L2Attackable) addSpawn(TRAINEE_OF_REST, LOC, false, 0, false, world.getInstanceId());
|
||||
mob.setIsRunning(true);
|
||||
mob.addDamageHate(player, 0, 999);
|
||||
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
|
||||
}
|
||||
|
||||
addSpawn(GUARDIAN_OF_THE_TOMB_3, GUARDIAN_OF_THE_TOMB_3_LOC, false, 0, false, world.getInstanceId());
|
||||
|
||||
for (Location LOC : SLAVE_SPAWN_3_LOC)
|
||||
{
|
||||
L2Attackable mob = (L2Attackable) addSpawn(SUPPLICANT_OF_REST, LOC, false, 0, false, world.getInstanceId());
|
||||
mob.setIsRunning(true);
|
||||
mob.addDamageHate(player, 0, 999);
|
||||
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
|
||||
}
|
||||
|
||||
addSpawn(GUARDIAN_OF_THE_TOMB_4, GUARDIAN_OF_THE_TOMB_4_LOC, false, 0, false, world.getInstanceId());
|
||||
|
||||
for (Location LOC : SLAVE_SPAWN_4_LOC)
|
||||
{
|
||||
L2Attackable mob = (L2Attackable) addSpawn(SUPPLICANT_OF_REST, LOC, false, 0, false, world.getInstanceId());
|
||||
mob.setIsRunning(true);
|
||||
mob.addDamageHate(player, 0, 999);
|
||||
mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
|
||||
}
|
||||
return "32843-01.html";
|
||||
}
|
||||
case "START_MOVIE_Q10296":
|
||||
{
|
||||
player.showQuestMovie(29);
|
||||
startQuestTimer("TELEPORT_SPACE", 60000, npc, player);
|
||||
world.elcadia.teleToLocation(ELCADIA_LOC, world.getInstanceId(), 0);
|
||||
break;
|
||||
}
|
||||
case "TELEPORT_SPACE":
|
||||
{
|
||||
teleportPlayer(player, SPACE_LOC, world.getInstanceId());
|
||||
world.elcadia.teleToLocation(SPACE_LOC, world.getInstanceId(), 0);
|
||||
addSpawn(ETIS_VAN_ETINA, ETIS_VAN_ETINA_LOC, false, 0, false, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
case "TELEPORT_TO_PLAYER":
|
||||
{
|
||||
world.elcadia.teleToLocation(player.getX(), player.getY(), player.getZ(), 0, world.getInstanceId());
|
||||
break;
|
||||
}
|
||||
startQuestTimer("FOLLOW", 10000, npc, player);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
|
||||
{
|
||||
InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
|
||||
if (tmpworld instanceof MoSWorld)
|
||||
{
|
||||
MoSWorld world = (MoSWorld) tmpworld;
|
||||
switch (npc.getId())
|
||||
{
|
||||
case GUARDIAN_OF_THE_TOMB_1:
|
||||
case GUARDIAN_OF_THE_TOMB_2:
|
||||
case GUARDIAN_OF_THE_TOMB_3:
|
||||
case GUARDIAN_OF_THE_TOMB_4:
|
||||
{
|
||||
world.deadTombGuardianCount++;
|
||||
if (world.deadTombGuardianCount == 4)
|
||||
{
|
||||
openDoor(TOMB_DOOR, world.getInstanceId());
|
||||
final QuestState st = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
|
||||
if ((st != null) && st.isMemoState(2))
|
||||
{
|
||||
st.setMemoState(3);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SOLINAS_GUARDIAN_1:
|
||||
case SOLINAS_GUARDIAN_2:
|
||||
case SOLINAS_GUARDIAN_3:
|
||||
case SOLINAS_GUARDIAN_4:
|
||||
{
|
||||
world.deadSolinaGuardianCount++;
|
||||
if (world.deadSolinaGuardianCount == 4)
|
||||
{
|
||||
player.showQuestMovie(27);
|
||||
final QuestState st = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
|
||||
if ((st != null) && st.isMemoState(1))
|
||||
{
|
||||
st.setMemoState(2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ETIS_VAN_ETINA:
|
||||
{
|
||||
player.showQuestMovie(30);
|
||||
world.elcadia.teleToLocation(ELCADIA_LOC, world.getInstanceId(), 0);
|
||||
startQuestTimer("TELEPORT_TO_PLAYER", 63000, npc, player);
|
||||
final QuestState st = player.getQuestState(Q10296_SevenSignsOneWhoSeeksThePowerOfTheSeal.class.getSimpleName());
|
||||
if ((st != null) && st.isMemoState(2))
|
||||
{
|
||||
st.setMemoState(3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onSpawn(L2Npc npc)
|
||||
{
|
||||
switch (npc.getId())
|
||||
{
|
||||
case ERIS_EVIL_THOUGHTS:
|
||||
{
|
||||
startQuestTimer("OPEN_DOORS", 1000, npc, null);
|
||||
break;
|
||||
}
|
||||
case TOMB_OF_THE_SAINTESS:
|
||||
{
|
||||
startQuestTimer("CLOSE_TOMB_DOORS", 1000, npc, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onTalk(L2Npc npc, L2PcInstance talker)
|
||||
{
|
||||
@@ -200,7 +554,8 @@ public final class MonasteryOfSilence1 extends AbstractInstance
|
||||
{
|
||||
world.elcadia.deleteMe();
|
||||
}
|
||||
world.elcadia = addSpawn(ELCADIA_INSTANCE, player.getX(), player.getY(), player.getZ(), 0, false, 0, false, player.getInstanceId());
|
||||
startQuestTimer("FOLLOW", 3000, world.elcadia, player);
|
||||
world.elcadia = addSpawn(ELCADIA_INSTANCE, player.getX(), player.getY(), player.getZ(), 0, false, 0, false, world.getInstanceId());
|
||||
startQuestTimer("FOLLOW", 5000, world.elcadia, player);
|
||||
startQuestTimer("DIALOG", 10000, world.elcadia, player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,535 +0,0 @@
|
||||
/*
|
||||
* 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 instances.MonasteryOfSilence2;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import com.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import com.l2jmobius.gameserver.datatables.SkillData;
|
||||
import com.l2jmobius.gameserver.enums.ChatType;
|
||||
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
|
||||
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.entity.Instance;
|
||||
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.network.NpcStringId;
|
||||
import com.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.NpcSay;
|
||||
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10294_SevenSignsToTheMonasteryOfSilence.Q10294_SevenSignsToTheMonasteryOfSilence;
|
||||
import quests.Q10295_SevenSignsSolinasTomb.Q10295_SevenSignsSolinasTomb;
|
||||
import quests.Q10296_SevenSignsPowerOfTheSeal.Q10296_SevenSignsPowerOfTheSeal;
|
||||
|
||||
public class MonasteryOfSilence2 extends AbstractNpcAI
|
||||
{
|
||||
// Values
|
||||
private static final int INSTANCE_ID = 151;
|
||||
// NPC's
|
||||
private static final int OddGlobe = 32815;
|
||||
private static final int Elcadia_First_Room = 32787;
|
||||
private static final int Elcadia_Support = 32785;
|
||||
private static final int ErissEvilThoughts = 32792;
|
||||
private static final int SolinasEvilThoughts = 32793;
|
||||
private static final int RelicGuardian = 32803;
|
||||
private static final int WestRelicWatcher = 32804;
|
||||
private static final int NorthRelicWatcher = 32805;
|
||||
private static final int EastRelicWatcher = 32806;
|
||||
private static final int SouthRelicWatcher = 32807;
|
||||
private static final int EtisVanEtina = 32808;
|
||||
private static final int WestTeleportControlDevice = 32816;
|
||||
private static final int NorthTeleportControlDevice = 32817;
|
||||
private static final int EastTeleportControlDevice = 32818;
|
||||
private static final int SouthTeleportControlDevice = 32819;
|
||||
private static final int JudeVanEtinasEvilThoughts = 32888;
|
||||
private static final int TeleportControlDevice1 = 32837;
|
||||
private static final int TeleportControlDevice2 = 32842;
|
||||
private static final int TombOfTheSaintess = 32843;
|
||||
private static final int AltarOfHallows_Staff = 32857;
|
||||
private static final int AltarOfHallows_Sword = 32858;
|
||||
private static final int AltarOfHallows_Scroll = 32859;
|
||||
private static final int AltarOfHallows_Shield = 32860;
|
||||
// Teleport's
|
||||
private static final int ENTER = 0;
|
||||
private static final int HOLYGRAL = 1;
|
||||
private static final int EXIT = 2;
|
||||
private static final int TW = 3;
|
||||
private static final int TN = 4;
|
||||
private static final int TE = 5;
|
||||
private static final int TS = 6;
|
||||
private static final int RTE = 7;
|
||||
private static final int RTG = 8;
|
||||
private static final int ENTER1 = 9;
|
||||
private static final int MTS = 10;
|
||||
private static final int MTS2 = 11;
|
||||
private static final int EE = 12;
|
||||
private static final int[][] TELEPORTS =
|
||||
{
|
||||
{
|
||||
120664,
|
||||
-86968,
|
||||
-3392
|
||||
}, // Enter
|
||||
{
|
||||
85937,
|
||||
-249618,
|
||||
-8320
|
||||
}, // HolyBurailOpen
|
||||
{
|
||||
115944,
|
||||
-86952,
|
||||
-3392
|
||||
}, // ExitInstance
|
||||
{
|
||||
82434,
|
||||
-249546,
|
||||
-8320
|
||||
}, // TeleWest
|
||||
{
|
||||
85691,
|
||||
-252426,
|
||||
-8320
|
||||
}, // TeleNorth
|
||||
{
|
||||
88573,
|
||||
-249556,
|
||||
-8320
|
||||
}, // TeleEast
|
||||
{
|
||||
85675,
|
||||
-246630,
|
||||
-8320
|
||||
}, // TeleSouth
|
||||
{
|
||||
120727,
|
||||
-86868,
|
||||
-3392
|
||||
}, // ReturnToEris
|
||||
{
|
||||
85937,
|
||||
-249618,
|
||||
-8320
|
||||
}, // ReturnToGuardian
|
||||
{
|
||||
45545,
|
||||
-249423,
|
||||
-6760
|
||||
}, // Enter1
|
||||
{
|
||||
56033,
|
||||
-252944,
|
||||
-6760
|
||||
}, // MoveToSaintness
|
||||
{
|
||||
55955,
|
||||
-250394,
|
||||
-6760
|
||||
}, // MoveToSaintness2
|
||||
{
|
||||
76707,
|
||||
-241022,
|
||||
-10832
|
||||
}
|
||||
// EtisEtina
|
||||
};
|
||||
|
||||
private static final int[] TALK =
|
||||
{
|
||||
OddGlobe,
|
||||
Elcadia_Support,
|
||||
WestTeleportControlDevice,
|
||||
NorthTeleportControlDevice,
|
||||
EastTeleportControlDevice,
|
||||
SouthTeleportControlDevice,
|
||||
RelicGuardian,
|
||||
WestRelicWatcher,
|
||||
NorthRelicWatcher,
|
||||
EastRelicWatcher,
|
||||
SouthRelicWatcher,
|
||||
ErissEvilThoughts,
|
||||
EtisVanEtina,
|
||||
JudeVanEtinasEvilThoughts,
|
||||
SolinasEvilThoughts,
|
||||
TeleportControlDevice1,
|
||||
TeleportControlDevice2,
|
||||
TombOfTheSaintess,
|
||||
AltarOfHallows_Staff,
|
||||
AltarOfHallows_Sword,
|
||||
AltarOfHallows_Scroll,
|
||||
AltarOfHallows_Shield
|
||||
};
|
||||
|
||||
private static final int[] MageBuff =
|
||||
{
|
||||
6725,
|
||||
6721,
|
||||
6722,
|
||||
6717
|
||||
};
|
||||
private static final int[] FighterBuff =
|
||||
{
|
||||
6714,
|
||||
6715,
|
||||
6716,
|
||||
6717
|
||||
};
|
||||
|
||||
private final HashMap<Integer, InstanceHolder> instanceWorlds = new HashMap<>();
|
||||
|
||||
public static class InstanceHolder
|
||||
{
|
||||
List<L2Npc> mobs = new ArrayList<>();
|
||||
}
|
||||
|
||||
private class MoSWorld2 extends InstanceWorld
|
||||
{
|
||||
public MoSWorld2()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public MonasteryOfSilence2()
|
||||
{
|
||||
super(MonasteryOfSilence2.class.getSimpleName(), "instances");
|
||||
addStartNpc(OddGlobe);
|
||||
addStartNpc(WestTeleportControlDevice);
|
||||
addStartNpc(NorthTeleportControlDevice);
|
||||
addStartNpc(EastTeleportControlDevice);
|
||||
addStartNpc(SouthTeleportControlDevice);
|
||||
for (int NPC : TALK)
|
||||
{
|
||||
addTalkId(NPC);
|
||||
}
|
||||
}
|
||||
|
||||
private void teleportPlayer(L2Npc npc, L2PcInstance player, int[] coords, int instanceId)
|
||||
{
|
||||
for (L2Character cha : player.getKnownList().getKnownCharacters())
|
||||
{
|
||||
if (cha.isNpc() && ((((L2Npc) cha).getId() == Elcadia_Support) || (((L2Npc) cha).getId() == Elcadia_First_Room)))
|
||||
{
|
||||
cha.deleteMe();
|
||||
}
|
||||
}
|
||||
|
||||
InstanceHolder holder = instanceWorlds.get(instanceId);
|
||||
if ((holder == null) && (instanceId > 0))
|
||||
{
|
||||
holder = new InstanceHolder();
|
||||
instanceWorlds.put(Integer.valueOf(instanceId), holder);
|
||||
}
|
||||
player.stopAllEffectsExceptThoseThatLastThroughDeath();
|
||||
player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
|
||||
player.setInstanceId(instanceId);
|
||||
player.teleToLocation(coords[0], coords[1], coords[2], false);
|
||||
cancelQuestTimer("check_follow", npc, player);
|
||||
if (holder != null)
|
||||
{
|
||||
for (L2Npc h : holder.mobs)
|
||||
{
|
||||
h.deleteMe();
|
||||
}
|
||||
holder.mobs.clear();
|
||||
}
|
||||
|
||||
if ((holder != null) && (instanceId > 0))
|
||||
{
|
||||
final L2Npc support = addSpawn(Elcadia_Support, player.getX(), player.getY(), player.getZ(), 0, false, 0L, false, player.getInstanceId());
|
||||
holder.mobs.add(support);
|
||||
startQuestTimer("check_follow", 3000, support, player);
|
||||
}
|
||||
}
|
||||
|
||||
protected void enterInstance(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(player);
|
||||
if (world != null)
|
||||
{
|
||||
if (!(world instanceof MoSWorld2))
|
||||
{
|
||||
player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_ENTERED_ANOTHER_INSTANCE_ZONE_THEREFORE_YOU_CANNOT_ENTER_CORRESPONDING_DUNGEON));
|
||||
return;
|
||||
}
|
||||
final Instance inst = InstanceManager.getInstance().getInstance(world.getInstanceId());
|
||||
if (inst != null)
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[ENTER], world.getInstanceId());
|
||||
}
|
||||
return;
|
||||
}
|
||||
final int instanceId = InstanceManager.getInstance().createDynamicInstance("MonasteryOfSilence.xml");
|
||||
|
||||
world = new MoSWorld2();
|
||||
world.setInstanceId(instanceId);
|
||||
world.setTemplateId(INSTANCE_ID);
|
||||
world.setStatus(0);
|
||||
InstanceManager.getInstance().addWorld(world);
|
||||
|
||||
world.addAllowed(player.getObjectId());
|
||||
|
||||
teleportPlayer(npc, player, TELEPORTS[ENTER], instanceId);
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
final String htmltext = getNoQuestMsg(player);
|
||||
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
|
||||
final QuestState qs = player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName());
|
||||
final QuestState qs1 = player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName());
|
||||
if (st == null)
|
||||
{
|
||||
st = newQuestState(player);
|
||||
}
|
||||
if ("check_follow".equals(event))
|
||||
{
|
||||
cancelQuestTimer("check_follow", npc, player);
|
||||
npc.getAI().stopFollow();
|
||||
npc.setIsRunning(true);
|
||||
npc.getAI().startFollow(player);
|
||||
if ((qs != null) && (qs.getCond() == 2))
|
||||
{
|
||||
if (getRandom(10) < 1)
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.IT_SEEMS_THAT_YOU_CANNOT_REMEMBER_TO_THE_ROOM_OF_THE_WATCHER_WHO_FOUND_THE_BOOK));
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.REMEMBER_THE_CONTENT_OF_THE_BOOKS_THAT_YOU_FOUND_YOU_CAN_T_TAKE_THEM_OUT_WITH_YOU));
|
||||
}
|
||||
}
|
||||
if ((qs != null) && (qs.getCond() == 3))
|
||||
{
|
||||
if (getRandom(8) < 1)
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.YOUR_WORK_HERE_IS_DONE_SO_RETURN_TO_THE_CENTRAL_GUARDIAN));
|
||||
}
|
||||
}
|
||||
if ((qs1 != null) && (qs1.getCond() == 1))
|
||||
{
|
||||
if (getRandom(5) < 1)
|
||||
{
|
||||
if (getRandom(10) < 1)
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.TO_REMOVE_THE_BARRIER_YOU_MUST_FIND_THE_RELICS_THAT_FIT_THE_BARRIER_AND_ACTIVATE_THE_DEVICE));
|
||||
}
|
||||
else if (getRandom(15) < 1)
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.THE_GUARDIAN_OF_THE_SEAL_DOESN_T_SEEM_TO_GET_INJURED_AT_ALL_UNTIL_THE_BARRIER_IS_DESTROYED));
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), NpcStringId.THE_DEVICE_LOCATED_IN_THE_ROOM_IN_FRONT_OF_THE_GUARDIAN_OF_THE_SEAL_IS_DEFINITELY_THE_BARRIER_THAT_CONTROLS_THE_GUARDIAN_S_POWER));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (player.getCurrentHp() < (player.getMaxHp() * 0.8D))
|
||||
{
|
||||
npc.setTarget(player);
|
||||
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6724, 1));
|
||||
}
|
||||
if (player.getCurrentMp() < (player.getMaxMp() * 0.5D))
|
||||
{
|
||||
npc.setTarget(player);
|
||||
npc.doSimultaneousCast(SkillData.getInstance().getSkill(6728, 1));
|
||||
}
|
||||
startQuestTimer("check_follow", 20000, npc, player);
|
||||
return "";
|
||||
}
|
||||
else if ("enter".equals(event))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
if (npc.getId() == ErissEvilThoughts)
|
||||
{
|
||||
if ("Enter1".equals(event))
|
||||
{
|
||||
if (qs1.getInt("seal_removed") != 1)
|
||||
{
|
||||
qs1.startQuestTimer("StartMovie", 1000);
|
||||
teleportPlayer(npc, player, TELEPORTS[ENTER1], player.getInstanceId());
|
||||
}
|
||||
else
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if ("Enter3".equals(event))
|
||||
{
|
||||
if ((qs.getInt("book_" + 32821) + qs.getInt("book_" + 32828) + qs.getInt("book_" + 32831) + qs.getInt("book_" + 32834)) != 4)
|
||||
{
|
||||
qs.startQuestTimer("OpenMovie", 4000);
|
||||
}
|
||||
teleportPlayer(npc, player, TELEPORTS[HOLYGRAL], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("video".equals(event))
|
||||
{
|
||||
player.showQuestMovie(29);
|
||||
startQuestTimer("teleport", 60000, npc, player);
|
||||
cancelQuestTimer("check_follow", npc, player);
|
||||
final InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
|
||||
if (holder != null)
|
||||
{
|
||||
for (L2Npc h : holder.mobs)
|
||||
{
|
||||
h.deleteMe();
|
||||
}
|
||||
holder.mobs.clear();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
else if ("teleport".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[EE], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if ("buff".equals(event))
|
||||
{
|
||||
if (player.isMageClass())
|
||||
{
|
||||
for (int h : MageBuff)
|
||||
{
|
||||
npc.setTarget(player);
|
||||
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int h : FighterBuff)
|
||||
{
|
||||
npc.setTarget(player);
|
||||
npc.doSimultaneousCast(SkillData.getInstance().getSkill(h, 1));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
else if ("Exit".equals(event))
|
||||
{
|
||||
cancelQuestTimer("check_follow", npc, player);
|
||||
final InstanceHolder holder = instanceWorlds.get(player.getInstanceId());
|
||||
if (holder != null)
|
||||
{
|
||||
for (L2Npc h : holder.mobs)
|
||||
{
|
||||
h.deleteMe();
|
||||
}
|
||||
holder.mobs.clear();
|
||||
}
|
||||
teleportPlayer(npc, player, TELEPORTS[EXIT], 0);
|
||||
return null;
|
||||
}
|
||||
else if ("TeleWest".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[TW], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if (event.equalsIgnoreCase("TeleNorth"))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[TN], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("TeleEast".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[TE], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("TeleSouth".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[TS], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("ReturnToEris".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[RTE], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("ReturnToGuardian".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[RTG], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("MoveToSaintess".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[MTS], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
else if ("MoveToSaintess2".equals(event))
|
||||
{
|
||||
teleportPlayer(npc, player, TELEPORTS[MTS2], player.getInstanceId());
|
||||
return null;
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onTalk(L2Npc npc, L2PcInstance player)
|
||||
{
|
||||
String htmltext = getNoQuestMsg(player);
|
||||
QuestState st = player.getQuestState(MonasteryOfSilence2.class.getSimpleName());
|
||||
if (st == null)
|
||||
{
|
||||
st = newQuestState(player);
|
||||
}
|
||||
final int npcId = npc.getId();
|
||||
if (npcId == OddGlobe)
|
||||
{
|
||||
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.STARTED))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
if ((player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()) != null) && (player.getQuestState(Q10294_SevenSignsToTheMonasteryOfSilence.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) == null))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() != State.COMPLETED))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
if ((player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()) != null) && (player.getQuestState(Q10295_SevenSignsSolinasTomb.class.getSimpleName()).getState() == State.COMPLETED) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) == null))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
if ((player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()) != null) && (player.getQuestState(Q10296_SevenSignsPowerOfTheSeal.class.getSimpleName()).getState() != State.COMPLETED))
|
||||
{
|
||||
enterInstance(npc, player);
|
||||
return null;
|
||||
}
|
||||
htmltext = "<html><body>Odd Globe:<br>The huge mechanism in the form of the globe. Around silent cottons are heard and in air presence of any unknown energy, which which in a way doesn't come under to your influence is felt.</body></html>";
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new MonasteryOfSilence2();
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
First, I'll tell you about the enemies. <font color="LEVEL"> Kanabion </font> - not just a monster, a creature that appeared as a result of the connection of evil and darkness.<br>
|
||||
Our goal - to destroy them and prevent the spread Kamaloki the territory of Aden.<br>
|
||||
If you kill enough Kanabionov, then we'll give you some ammunition. In time we'll assign you a rank <font color="LEVEL"> from D to S </font> depending on your results.<br>
|
||||
Or we can return collected by you from Kanabionov <font color="LEVEL"> Essences Kanabionov </font>. But in the real world there are no places where you can take advantage of them.<br>
|
||||
Give them to us, if you think that you do not need. We offer appropriate compensation.<br>
|
||||
And if you die around Kamaloki, no one can help you before time runs out or stay until the moment when all will be defeated. It's your dream.<br>
|
||||
Thus, our technology will allow you to be around Kamaloki within <font color="LEVEL"> 20 minutes </font>. Do not forget about it.
|
||||
</body></html>
|
||||
@@ -1,5 +0,0 @@
|
||||
<html><body>Pathfinder Agent:<br>
|
||||
Once you enter the Chamber of Delusion, you will find managers for each area. There are 6 total, entry to which is regulated in the individual manager. Ask each manager for more details.<br>
|
||||
If you've been to the Dimensional Rift, you will understand quickly.<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest DelusionTeleport">Challenge the Chamber of Delusion.</a>
|
||||
</body></html>
|
||||
@@ -1,10 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
We trackers sent from the Ivory Tower to confront the invasion nightmare. We are waiting for a traveler like you, will challenge the Darkness around Kamaloki.<br>
|
||||
Environs Kamaloki - it was an invasion of darkness through dreams. If we do not stop it, then people will die in my sleep.<br>
|
||||
We have developed a way to counter. If you are brave enough challenge a outskirts Kamaloki!<br>
|
||||
<a Action="bypass -h npc_%objectId%_Quest RimKamaloka"> Challenge outlying Kamaloka</a><br>
|
||||
<a Action="bypass -h npc_%objectId%_Chat 1"> Ask about how to counter</a><br>
|
||||
<a Action="bypass -h npc_%objectId%_multisell 324840001"> Make a contribution in the form Essences Kanabiona </a> <br>
|
||||
<a Action="bypass -h npc_%objectId%_Quest 9011_KamalokaAch"> Check the list of the best achievements</a><br>
|
||||
<a action="bypass -h npc_%objectId%_Quest DelusionTeleport">Go to Chamber of Delusion.</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Battle is finished!<br>
|
||||
To you it seems strange that I appeared in you sleep? Don't warry! We, Pathfinders, are trained many skills, which heer occurs. I simply controlled your thoughts...<br>
|
||||
I shall describe to you, what you reached, and I shall help to get out from here.<br>
|
||||
With to know you results?<br>
|
||||
<a action="bypass -h npc_%objectId%_Quest RimKamaloka">To look results.</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 0">Enter Hall of Abyss (20~30 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 1">Enter Hall of Abyss (25~35 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,6 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 0">Enter Hall of Abyss (20~30 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 1">Enter Hall of Abyss (25~35 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Your result:<br>
|
||||
<center>Rank A</center><br>
|
||||
It is magnificent. You strongly lowered the rate of the intrusion through Kamaloka.<br>
|
||||
As in any other battle, the main thing to protect itself, when you inside the Environments of Kamaloka. We they must not attack rash.<br>
|
||||
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
|
||||
You do want to obtain the reward, which corresponds to your level?<br>
|
||||
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
|
||||
</body></html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Your result:<br>
|
||||
<center>Rank B</center><br>
|
||||
Very well. Your experience will help other to the finders of adventures.<br>
|
||||
Battle with Kanabions is deliberately weaker you.. You they are assured, it is worthwhile to enter precisely thus? We, pathfinders, consider that this is the simply waste of time.<br>
|
||||
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
|
||||
You do want to obtain the reward, which corresponds to your level?<br>
|
||||
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
|
||||
</body></html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Your result:<br>
|
||||
<center>Rank C</center><br>
|
||||
Good work. If the remaining finders adventures will show such results, this it will return to us hope.<br>
|
||||
It cannot be always rely on the aid of others. Sometimes for you it is necessary to act independently.<br>
|
||||
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
|
||||
You do want to obtain the reward, which corresponds to your level?<br>
|
||||
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
|
||||
</body></html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Your result:<br>
|
||||
<center>Rank D</center><br>
|
||||
This is poor result.<br>
|
||||
Me you seemed you will be better.<br>
|
||||
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
|
||||
Do you want to obtain the reward, which corresponds to your level?<br>
|
||||
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html> <body>Pathfinder:<br>
|
||||
Here's your reward. <br>
|
||||
We were able to collect some essences Kanabionov. Here, hold. <br>
|
||||
We are in the chronology of your activities. If you want, we will tell you how effective the activities around Kamaloka, and who made the biggest contribution to our common cause. <br>
|
||||
First, leave the area. <br>
|
||||
<a Action="bypass -h Quest RimKamaloka Exit"> Exit </a>
|
||||
</body> </html>
|
||||
@@ -1,9 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Your result:<br>
|
||||
<center>Rank S</center><br>
|
||||
This... These are the great reaching, is worthy of the heroes legends!<br>
|
||||
I see, you understood the essence of our matter and it is wonderful they managed the task assigned to you.<br>
|
||||
We, pathfinders, prepared reward for those, who it reached the impressive results, in order to in following time they could carry out task still better.<br>
|
||||
You do want to obtain the reward, which corresponds to your level?<br>
|
||||
<a action="bypass -h Quest RimKamaloka Reward">To obtain the reward.</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 2">Enter Hall of Abyss (30~40 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,8 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 3">Enter Hall of Abyss (35~45 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 4">Enter Hall of Abyss (40~50 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 5">Enter Hall of Abyss (45~55 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 6">Enter Hall of Abyss (50~60 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,7 +0,0 @@
|
||||
<html><body>Pathfinder:<br>
|
||||
Here is your reward.<br>
|
||||
We succeeded in gathering a little the essences devastated by you Kanabions. Here, you hold.<br>
|
||||
We conduct the chronology of your activity. If you want, we will describe to you, to what extent is effective activity in the Environments of Kamaloka, and who made the largest contribution to our common work.<br>
|
||||
First leave this place.<br>
|
||||
<a action="bypass -h Quest RimKamaloka Exit">To leave Kamaloka.</a>
|
||||
</body></html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
They are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 7">Enter Hall of Abyss (55~65 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 8">Enter Hall of Abyss (60~70 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 9">Enter Hall of Abyss (65~75 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 10">Enter Hall of Abyss (70~80 levels)</a>
|
||||
</body></html>
|
||||
@@ -1,8 +0,0 @@
|
||||
<html><body>Pathfinder Worker:<br>
|
||||
hey are this is what the Environment of Kamaloka. After the visit of the peace of dreams you you will not be able again to enter into it to the complete the restoration of soul. Know this.<br>
|
||||
(In the Environment of Kamaloka it is possible to enter <font color="LEVEL">only once a day</font>.)<br>
|
||||
<a action="bypass -h Quest RimKamaloka 5">Enter Hall of Abyss (45~55 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 6">Enter Hall of Abyss (50~60 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 7">Enter Hall of Abyss (55~65 levels)</a><br>
|
||||
<a action="bypass -h Quest RimKamaloka 8">Enter Hall of Abyss (60~70 levels)</a>
|
||||
</body></html>
|
||||
@@ -139,10 +139,10 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
final int xx = st2.getPlayer().getX();
|
||||
final int yy = st2.getPlayer().getY();
|
||||
final int zz = st2.getPlayer().getZ();
|
||||
final L2Npc Archon = st2.addSpawn(Mob[1], xx, yy, zz);
|
||||
final L2Npc Archon = addSpawn(Mob[1], xx, yy, zz, -1);
|
||||
addSpawn(st2, Archon);
|
||||
st2.set("spawned", "1");
|
||||
st2.startQuestTimer("Archon Hellisha has despawned", 600000, Archon);
|
||||
startQuestTimer("Archon Hellisha has despawned", 600000, Archon, player);
|
||||
autoChat(Archon, Text[13].replace("PLAYERNAME", st2.getPlayer().getName()));
|
||||
((L2Attackable) Archon).addDamageHate(st2.getPlayer(), 0, 99999);
|
||||
Archon.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, st2.getPlayer(), null);
|
||||
@@ -293,8 +293,8 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
{
|
||||
final L2Npc Mob_1 = addSpawn(Mob[0], npcSpawnLocations[0], false, 0);
|
||||
st.set("spawned", "1");
|
||||
st.startQuestTimer("Mob_1 Timer 1", 500, Mob_1);
|
||||
st.startQuestTimer("Mob_1 has despawned", 300000, Mob_1);
|
||||
startQuestTimer("Mob_1 Timer 1", 500, Mob_1, player);
|
||||
startQuestTimer("Mob_1 has despawned", 300000, Mob_1, player);
|
||||
addSpawn(st, Mob_1);
|
||||
htmltext = "7-02.htm";
|
||||
}
|
||||
@@ -331,10 +331,10 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
st.set("Mob_2", String.valueOf(Mob_2.getObjectId()));
|
||||
st.set("Quest0", "1");
|
||||
st.set("Quest1", "45");
|
||||
st.startRepeatingQuestTimer("Mob_3 Timer 1", 500, Mob_3);
|
||||
st.startQuestTimer("Mob_3 has despawned", 59000, Mob_3);
|
||||
st.startQuestTimer("Mob_2 Timer 1", 500, Mob_2);
|
||||
st.startQuestTimer("Mob_2 has despawned", 60000, Mob_2);
|
||||
startQuestTimer("Mob_3 Timer 1", 500, Mob_3, player, true);
|
||||
startQuestTimer("Mob_3 has despawned", 59000, Mob_3, player);
|
||||
startQuestTimer("Mob_2 Timer 1", 500, Mob_2, player);
|
||||
startQuestTimer("Mob_2 has despawned", 60000, Mob_2, player);
|
||||
htmltext = "10-02.htm";
|
||||
}
|
||||
else if (st.getInt("Quest1") == 45)
|
||||
@@ -387,7 +387,7 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
return null;
|
||||
case "Mob_2 Timer 1":
|
||||
autoChat(npc, Text[7].replace("PLAYERNAME", player.getName()));
|
||||
st.startQuestTimer("Mob_2 Timer 2", 1500, npc);
|
||||
startQuestTimer("Mob_2 Timer 2", 1500, npc, player);
|
||||
if (st.getInt("Quest1") == 45)
|
||||
{
|
||||
st.set("Quest1", "0");
|
||||
@@ -395,12 +395,12 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
return null;
|
||||
case "Mob_2 Timer 2":
|
||||
autoChat(npc, Text[8].replace("PLAYERNAME", player.getName()));
|
||||
st.startQuestTimer("Mob_2 Timer 3", 10000, npc);
|
||||
startQuestTimer("Mob_2 Timer 3", 10000, npc, player);
|
||||
return null;
|
||||
case "Mob_2 Timer 3":
|
||||
if (st.getInt("Quest0") == 0)
|
||||
{
|
||||
st.startQuestTimer("Mob_2 Timer 3", 13000, npc);
|
||||
startQuestTimer("Mob_2 Timer 3", 13000, npc, player);
|
||||
if (getRandomBoolean())
|
||||
{
|
||||
autoChat(npc, Text[9].replace("PLAYERNAME", player.getName()));
|
||||
@@ -429,7 +429,7 @@ public abstract class AbstractSagaQuest extends Quest
|
||||
}
|
||||
else
|
||||
{
|
||||
st.startQuestTimer("Mob_2 has despawned", 1000, npc);
|
||||
startQuestTimer("Mob_2 has despawned", 1000, npc, player);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ public class Q00021_HiddenTruth extends Quest
|
||||
final L2Npc ghost = addSpawn(GHOST_OF_VON_HELLMAN, GHOST_LOC, false, 0);
|
||||
ghost.broadcastPacket(new NpcSay(ghost.getObjectId(), ChatType.GENERAL, ghost.getId(), NpcStringId.WHO_AWOKE_ME));
|
||||
GHOST_SPAWNED = true;
|
||||
st.startQuestTimer("DESPAWN_GHOST", 1000 * 300, ghost);
|
||||
startQuestTimer("DESPAWN_GHOST", 1000 * 300, ghost, player);
|
||||
st.setCond(2);
|
||||
playSound(player, QuestSound.SKILLSOUND_HORROR_2);
|
||||
htmltext = event;
|
||||
@@ -297,7 +297,7 @@ public class Q00021_HiddenTruth extends Quest
|
||||
if (MOVE_ENDED)
|
||||
{
|
||||
htmltext = "31525-02.html";
|
||||
st.startQuestTimer("DESPAWN", 3000, npc);
|
||||
startQuestTimer("DESPAWN", 3000, npc, player);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -449,7 +449,7 @@ public class Q00021_HiddenTruth extends Quest
|
||||
final QuestState st = L2World.getInstance().getPlayer(npc.getScriptValue()).getQuestState(getName());
|
||||
if (st != null)
|
||||
{
|
||||
st.startQuestTimer("DESPAWN", 15000, npc);
|
||||
startQuestTimer("DESPAWN", 15000, npc, null);
|
||||
MOVE_ENDED = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,7 +175,7 @@ public final class Q00022_TragedyInVonHellmannForest extends Quest
|
||||
_tifarenOwner = player.getObjectId();
|
||||
final L2Npc ghost2 = addSpawn(GHOST_OF_PRIEST, PRIEST_LOC, true, 0);
|
||||
ghost2.setScriptValue(player.getObjectId());
|
||||
qs.startQuestTimer("DESPAWN_GHOST2", 1000 * 120, ghost2);
|
||||
startQuestTimer("DESPAWN_GHOST2", 1000 * 120, ghost2, player);
|
||||
ghost2.broadcastPacket(new NpcSay(ghost2.getObjectId(), ChatType.NPC_GENERAL, ghost2.getId(), NpcStringId.DID_YOU_CALL_ME_S1).addStringParameter(player.getName()));
|
||||
if (((cond == 5) || (cond == 6)) && hasQuestItems(player, LOST_SKULL_OF_ELF))
|
||||
{
|
||||
@@ -208,7 +208,7 @@ public final class Q00022_TragedyInVonHellmannForest extends Quest
|
||||
{
|
||||
qt.cancelAndRemove();
|
||||
npc.setScriptValue(0);
|
||||
qs.startQuestTimer("DESPAWN_GHOST2", 1000 * 3, npc);
|
||||
startQuestTimer("DESPAWN_GHOST2", 1000 * 3, npc, player);
|
||||
qs.setCond(8);
|
||||
htmltext = event;
|
||||
}
|
||||
@@ -267,8 +267,8 @@ public final class Q00022_TragedyInVonHellmannForest extends Quest
|
||||
if (qs.isCond(10) && (_soulWellNpc == null))
|
||||
{
|
||||
_soulWellNpc = addSpawn(SOUL_OF_WELL, SOUL_WELL_LOC, true, 0);
|
||||
qs.startQuestTimer("activateSoulOfWell", 90000, _soulWellNpc);
|
||||
qs.startQuestTimer("despawnSoulOfWell", 120000, _soulWellNpc);
|
||||
startQuestTimer("activateSoulOfWell", 90000, _soulWellNpc, player);
|
||||
startQuestTimer("despawnSoulOfWell", 120000, _soulWellNpc, player);
|
||||
_soulWellNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, player);
|
||||
playSound(player, QuestSound.SKILLSOUND_ANTARAS_FEAR);
|
||||
htmltext = event;
|
||||
|
||||
@@ -125,11 +125,11 @@ public class Q00242_PossessorOfAPreciousSoul2 extends Quest
|
||||
case "PURE_UNICORN":
|
||||
npc.getSpawn().stopRespawn();
|
||||
npc.deleteMe();
|
||||
final L2Npc npc_pure = st.addSpawn(PURE_UNICORN, 85884, -76588, -3470, 30000);
|
||||
final L2Npc npc_pure = addSpawn(PURE_UNICORN, 85884, -76588, -3470, 30000);
|
||||
startQuestTimer("FALLEN_UNICORN", 30000, npc_pure, player);
|
||||
return null;
|
||||
case "FALLEN_UNICORN":
|
||||
final L2Npc npc_fallen = st.addSpawn(FALLEN_UNICORN, 85884, -76588, -3470, 0);
|
||||
final L2Npc npc_fallen = addSpawn(FALLEN_UNICORN, 85884, -76588, -3470, 0);
|
||||
npc_fallen.getSpawn().startRespawn();
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ public final class Q00275_DarkWingedSpies extends Quest
|
||||
}
|
||||
else if ((count > 10) && (count < 66) && (getRandom(100) < 10))
|
||||
{
|
||||
st.addSpawn(VARANGKAS_TRACKER);
|
||||
addSpawn(VARANGKAS_TRACKER, killer);
|
||||
giveItems(killer, VARANGKAS_PARASITE, 1);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -101,7 +101,7 @@ public final class Q00276_TotemOfTheHestui extends Quest
|
||||
{
|
||||
if ((chance1 >= spawnChance.getId()) && (chance2 <= spawnChance.getCount()))
|
||||
{
|
||||
st.addSpawn(KASHA_BEAR_TOTEM);
|
||||
addSpawn(KASHA_BEAR_TOTEM, killer);
|
||||
takeItems(killer, KASHA_PARASITE, -1);
|
||||
chance3 = false;
|
||||
break;
|
||||
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-01.htm
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-01.htm
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Many aspire to join our guild. Many such as you only see the glamorous side of our profession.<br>
|
||||
Becoming a hunter is not an easy task. Only the very best and brightest are selected for membership in the Hunters Guild. A hunting license is only given to those who pass a very severe test.<br>
|
||||
Many give up before a week has passed. Does that sound like you?<br>
|
||||
(This quest is only for characters level 35 and above.)
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-02.htm
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-02.htm
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Many aspire to join our guild. Many such as you only see the glamorous side of our profession.<br>
|
||||
Becoming a hunter is not an easy task. Only the very best and brightest are selected for membership in the Hunters Guild. A hunting license is only given to those who pass a very severe test.<br>
|
||||
Many give up before a week has passed. Does that sound like you?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-03.htm">"I wish to take the test for the hunting license."</a>
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-03.htm
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-03.htm
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Did I hurt your feelings? Do you actually intend to try for the hunting license? If so, you must listen carefully to my words...<br>
|
||||
There are two types of hunters. Most hunters are 1-circle, but very skillful ones can obtain the 2-circle license by passing another test. Of course you must take the <font color="LEVEL">1-circle license test</font> first.<br>
|
||||
To pass this test, you must bring back at least three of the items on this list.<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">View the list</a>
|
||||
</body></html>
|
||||
9
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04.html
vendored
Normal file
9
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body>Hunters Guild Member Grey:<br>
|
||||
Next is the 1-circle hunter license test list. To pass the test, you have to bring at least three items from the list. Keep in mind that this is not just a simple treasure hunt but is a test to find out whether you have the nature and disposition of a hunter!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04a.html">40 scales of guardian basilisk</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04b.html">20 Karut Weeds</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04c.html">3 heads of raiders with the lord's bounty on their heads</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04d.html">Skin of Windsus Aleph</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04e.html">20 light-blue Spirit Ore</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04f.html">30 sea of spores seeds</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04a.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04a.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">40 scales of guardian basilisk</font>. They live in the <font color="LEVEL">Death Pass</font>.<br>
|
||||
I really shouldn't tell you this... Gathering information about the items is a part of the test. Count yourself lucky to have received this valuable one-time hint!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04b.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04b.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">20 Karut Weeds</font>, used in the research of mages. The leto Lizardman mediums carry them. You may find the Leto Lizardmen in the southern part of Oren.<br>
|
||||
Gathering information about the items is a part of the test. Count yourself lucky to have received this valuable one-time hint!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04c.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04c.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must kill the three evil outlaw Haka brothers and bring back their heads. They are named <font color="LEVEL">Haka, Jakja and Marka</font>. They are prefects of the Breka Orc tribe. They wantonly attack merchants' carriages, massacre citizens and set fire to their homes. There has been a bounty placed by on their heads by the Lord of Giran, therefore they have been laying low. But with the <font color="LEVEL">Breka Orc Warriors</font> destroyed, they are bound to appear seeking revenge.<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04d.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04d.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must bring the skin of the <font color="LEVEL">Windsus Aleph</font>. It is a particularly strong and vicious black boar, native to the Giran region. To find him you must go to the <font color="LEVEL">Death Pass</font> and hunt windsuses, eventually you will come across the Windsus Aleph. Your arrow must fly the moment you see its face!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04e.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04e.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">20 light-blue Spirit Ore</font>. These Spirit Ore are obtained by destroying <font color="LEVEL">manashen gargoyles or enchanted stone golems</font> in the area near the Ivory Tower. To protect their precious tower from interlopers, the mages apparently have inplanted Spirit Ore in the creatures of that area and are controlling them.<br>
|
||||
This is all I will say on this matter. If you are a true hunter, you must gather the information and find the items yourself. Don't expect any more hints!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04f.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-04f.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">30 Sea of Spores seeds</font>. These can be obtained by going to the Sea of Spores and killing the <font color="LEVEL">giant fungus</font>.<br>
|
||||
Of course, I should let you discover this for yourself, but I'm just an old softie... No more hints!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-05.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-05.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must obtain at least three items from the list in order to obtain the 1-circle hunting license. Keep in mind that this is not merely a treasure hunt but is a test to find out if you have what it takes to be a hunter!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-04.html">View list</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-06.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-06.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You have obtained the items from the list! I must admit that I doubted you at first, but I stand corrected! Well, you certainly qualify as a hunter. I hereby bestow on you the 1-circle hunting license. Welcome to the guild, new hunting brother!<br>
|
||||
Now you are qualified to perform the various tasks that come to our Hunters Guild. Please go and ask <font color="LEVEL">Guild Member Tor</font> over there for details.<br>
|
||||
Sometimes you will be assigned jobs by the guild, other times you'll be hired by individuals. Recently <font color="LEVEL">Cybellin</font> asked me to introduce him to a trustworthy hunter; would you like to meet him?
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07.html
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Welcome, my hunter brother. What can I do for you?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-07a.html">"Is there any work?"</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-07b.html">"I wish to test for the 2-circle hunter license."</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-15.html">"I wish to leave the Hunters Guild."</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07a.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07a.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
We get dozens of hunting requests every day. You should speak to <font color="LEVEL">Guild Member Tor</font> to find out what requests have currently come in. If there is a job that you like, you can accept it.<br>
|
||||
There is also the possibility of being hired by individuals. Recently <font color="LEVEL">Cybellin</font> asked me to introduce him to a trustworthy hunter. Would you care to meet him?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-07.html">"Go back"</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07b.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-07b.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You are already applying for the 2-circle hunting license? Nice to see that you don't lack ambition! But look. You're not ready. You do have some skills but you still need more important practical experience. For the time being, you should develop your talents while carrying out hunting requests.<br>
|
||||
(You can apply for the 2-circle license test after reaching level 45.)
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-08.html
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-08.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Welcome, my hunter brother. What can I do for you?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-08a.html">"Are there any jobs?"</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-09.html">"I wish to test for the 2-circle hunting license."</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-15.html">Leave the Hunters Guild</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-08a.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-08a.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
We get dozens of hunting requests every day. You should see <font color="LEVEL">Guild Member Tor</font>, he will know what requests have come in. If there is a job that you like, you can accept it.<br>
|
||||
Hunters are also hired by individuals, not just through the guild. Recently <font color="LEVEL">Cybellin</font> asked me to introduce him to a trustworthy hunter. Would you care to meet him?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-08.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-09.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-09.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
So, you wish to take the 2-circle hunting license test? Well I suppose you're up to giving it a try. As before, in the 2-circle test you must bring back at least three items written on the list. Of course, these items will be harder to obtain than those of the 1-circle test. Maybe you should look at the list first...<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">View list</a>
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-09a.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-09a.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Still taking the test, are you? Come and see me when you've finished.
|
||||
</body></html>
|
||||
9
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10.html
vendored
Normal file
9
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Here is the 2-circle hunting license test list. You must bring<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10a.html">20 Timak Orc Totems</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10b.html">20 skeins of trisalim cobweb</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10c.html">30 Ambrosius Fruits</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10d.html">20 Balefire Crystals</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10e.html">20 Imperial Arrowheads</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10f.html">The heads of 5 outlaw raiders</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10a.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10a.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">20 Timak Orc Totems</font>. To obtain them you must kill Timak Orc Warriors. You should have no trouble with this. Now go!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10b.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10b.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">20 trisalim cobwebs</font>. This should be no problem for you. Quickly now! Get them and come back to me!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10c.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10c.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">30 Ambrosius Fruits</font>. You are familiar with ambrosius, aren't you? It's a fruit somewhat like an apple that grows on valley treants in Enchanted Valley. This should be easy for you!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10d.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10d.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">twenty Balefire Crystals</font>. Actually, I didn't know what this was so I asked the sorcerers about it. They said it could be obtained if you kill a <font color="LEVEL">tairim</font> in the Cemetery. This hint should be of great value to you.<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10e.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10e.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must gather <font color="LEVEL">20 Imperial Arrowheads</font>. This should be easy for you. If you go to the <font color="LEVEL">National Cemetery</font> and kill the undead archers, you can obtain arrowheads made during the Elmoreden era. Are you up for it?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10f.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-10f.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You must kill five talk bugbear raiders and bring back their heads. Their names are Athu, Triska, Motura and Lanka, and they are led by one called Kalath. These <font color="LEVEL">talk bugbear warriors</font> have been attacking and pillaging merchant carriages. I'm sure you would deal with these outlaws even if it weren't a requirement of the test, wouldn't you?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">Go back</a>
|
||||
</body></html>
|
||||
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-11.html
vendored
Normal file
4
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-11.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
How is the hunt going? Once again, you must bring at least three items from the list. This should be well within your abilities. Good luck!<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-10.html">View list</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-12.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-12.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Good work! I knew that you would complete the test without much trouble. Now you are a respectable 2-circle hunter. Congratulations!<br>
|
||||
Now you are qualified for more dangerous hunts. Go see Guild Member Tor.<br>
|
||||
Or perhaps you should visit Cybellin. He is still looking for a good hunter...
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-14.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-14.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Hello, hunter brother. What can I do for you?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-14a.html">"Are there any jobs?"</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-15.html">"I wish to leave the Hunters Guild."</a>
|
||||
</body></html>
|
||||
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-14a.html
vendored
Normal file
5
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-14a.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
We get dozens of hunting requests every day. You should go to <font color="LEVEL">Guild Member Tor</font> to find out what requests have currently come in. If there is an assignment that appeals to you, you can accept it.<br>
|
||||
There are also individuals who wish to hire hunters. Recently <font color="LEVEL">Cybellin</font> asked me if I knew of a trustworthy hunter. Would you like to meet her?<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-14.html">Go back</a>
|
||||
</body></html>
|
||||
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-15.html
vendored
Normal file
6
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-15.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
You wish to leave the guild? Certainly you know that is impossible. Once you join this brotherhood you are in for life... Didn't you know that?... You should reconsider your decision...<br>
|
||||
... The fear in your eyes makes it impossible for me to keep a straight face! I'm joking, you idiot! Of course you can leave if that is what you really want... You must have a good reason...<br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-16.html">Leave</a><br>
|
||||
<a action="bypass -h Quest Q00335_TheSongOfTheHunter 30744-18.html">Cancel</a>
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-16.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-16.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Oh, too bad. There are not enough youngsters like you around these days... But if you have your heart set on leaving, then I won't stop you... May all of your wishes come true... May the divine protection of the gods be with you...
|
||||
</body></html>
|
||||
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-17.html
vendored
Normal file
3
L2J_Mobius_HighFive/dist/game/data/scripts/quests/Q00335_TheSongOfTheHunter/30744-17.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Guild Member Grey:<br>
|
||||
Oh, too bad. There aren't enough youngsters like you around these days... But if you have your mind made up, then I won't stop you... May all your wishes come true... Here is a small bonus for your work for the guild. You can use it for travel expenses. OK, well, this is goodbye. May the divine protection of the gods be with you...
|
||||
</body></html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user