Master Class branch.
This commit is contained in:
114
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/AbstractNpcAI.java
vendored
Normal file
114
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/AbstractNpcAI.java
vendored
Normal file
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.World;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.holders.MinionHolder;
|
||||
import org.l2jmobius.gameserver.model.quest.Quest;
|
||||
import org.l2jmobius.gameserver.util.Util;
|
||||
|
||||
/**
|
||||
* Abstract NPC AI class for datapack based AIs.
|
||||
* @author UnAfraid, Zoey76
|
||||
*/
|
||||
public abstract class AbstractNpcAI extends Quest
|
||||
{
|
||||
protected final Logger LOGGER = Logger.getLogger(getClass().getName());
|
||||
|
||||
public AbstractNpcAI()
|
||||
{
|
||||
super(-1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple on first talk event handler.
|
||||
*/
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
return npc.getId() + ".html";
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers the following events to the current script:<br>
|
||||
* <ul>
|
||||
* <li>ON_ATTACK</li>
|
||||
* <li>ON_KILL</li>
|
||||
* <li>ON_SPAWN</li>
|
||||
* <li>ON_SPELL_FINISHED</li>
|
||||
* <li>ON_SKILL_SEE</li>
|
||||
* <li>ON_FACTION_CALL</li>
|
||||
* <li>ON_AGGR_RANGE_ENTER</li>
|
||||
* </ul>
|
||||
* @param mobs
|
||||
*/
|
||||
public void registerMobs(int... mobs)
|
||||
{
|
||||
addAttackId(mobs);
|
||||
addKillId(mobs);
|
||||
addSpawnId(mobs);
|
||||
addSpellFinishedId(mobs);
|
||||
addSkillSeeId(mobs);
|
||||
addAggroRangeEnterId(mobs);
|
||||
addFactionCallId(mobs);
|
||||
}
|
||||
|
||||
public void spawnMinions(Npc npc, String spawnName)
|
||||
{
|
||||
for (MinionHolder is : npc.getParameters().getMinionList(spawnName))
|
||||
{
|
||||
addMinion((MonsterInstance) npc, is.getId());
|
||||
}
|
||||
}
|
||||
|
||||
protected void followNpc(Npc npc, int followedNpcId, int followingAngle, int minDistance, int maxDistance)
|
||||
{
|
||||
World.getInstance().forEachVisibleObject(npc, Npc.class, npcAround ->
|
||||
{
|
||||
if (npcAround.getId() != followedNpcId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final double distance = npc.calculateDistance3D(npcAround);
|
||||
if ((distance >= maxDistance) && npc.isScriptValue(0))
|
||||
{
|
||||
npc.setRunning();
|
||||
npc.setScriptValue(1);
|
||||
}
|
||||
else if ((distance <= (minDistance * 1.5)) && npc.isScriptValue(1))
|
||||
{
|
||||
npc.setWalking();
|
||||
npc.setScriptValue(0);
|
||||
}
|
||||
|
||||
final double course = Math.toRadians(followingAngle);
|
||||
final double radian = Math.toRadians(Util.convertHeadingToDegree(npcAround.getHeading()));
|
||||
final double nRadius = npc.getCollisionRadius() + npcAround.getCollisionRadius() + minDistance;
|
||||
final int x = npcAround.getLocation().getX() + (int) (Math.cos(Math.PI + radian + course) * nRadius);
|
||||
final int y = npcAround.getLocation().getY() + (int) (Math.sin(Math.PI + radian + course) * nRadius);
|
||||
final int z = npcAround.getLocation().getZ();
|
||||
npc.getAI().moveTo(new Location(x, y, z));
|
||||
});
|
||||
}
|
||||
}
|
141
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/CemeteryMonsters.java
vendored
Normal file
141
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/CemeteryMonsters.java
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* 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.areas.Aden;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.NpcSay;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Cemetery Monsters AI
|
||||
* @author Gigi
|
||||
* @date 2018-07-10 - [20:17:37]
|
||||
*/
|
||||
public class CemeteryMonsters extends AbstractNpcAI
|
||||
{
|
||||
private static final int CHIEF_QUARTERMASTER = 23296;
|
||||
private static final int ROYAL_QUARTERMASTER = 23298;
|
||||
private static final int PERSONAL_MAGICIAN = 23291;
|
||||
private static final int ADEN_RAIDER = 19455;
|
||||
|
||||
private static final int[] MONSTERS =
|
||||
{
|
||||
23290, // Royal Knight
|
||||
PERSONAL_MAGICIAN, // Personal Magician
|
||||
23292, // Royal Guard
|
||||
23293, // Royal Guard Captain
|
||||
23294, // Chief Magician
|
||||
23295, // Operations Manager
|
||||
CHIEF_QUARTERMASTER, // Chief Quartermaster
|
||||
23297, // Escort
|
||||
ROYAL_QUARTERMASTER, // Royal Quartermaster
|
||||
23299, // Operations Chief of the 7th Divisiony
|
||||
23300 // Commander of Operations
|
||||
};
|
||||
|
||||
private static final NpcStringId[] SHOUT_MSG =
|
||||
{
|
||||
NpcStringId.WHAT_IS_THIS_SO_DISORIENTING,
|
||||
NpcStringId.WHAT_WOULD_YOU_KNOW_OF_LOYALTY,
|
||||
NpcStringId.I_CANNOT_I_WILL_NOT_BACK_DOWN,
|
||||
NpcStringId.MY_STRENGTH_HAS_NOT_YET_FULLY_RETURNED,
|
||||
NpcStringId.DO_NOT_DEFILE_THIS_PLACE_WITH_YOUR_PRESENCE,
|
||||
NpcStringId.HEH_INTERESTING_TRICK_YOU_USE_THERE,
|
||||
NpcStringId.I_WILL_REMEMBER_YOU,
|
||||
NpcStringId.I_WILL_NOT_LOSE,
|
||||
NpcStringId.BEHOLD_MY_POWER,
|
||||
NpcStringId.HIS_MAJESTY_TRAVIS_HAS_ORDERED_IMMEDIATE_EXECUTION,
|
||||
NpcStringId.HOW_DARE_YOU_TRY_TO_HARM_ME_WITH_YOUR_EVIL_SCHEMES_2,
|
||||
NpcStringId.YOU_IDIOT_2,
|
||||
NpcStringId.FOOL,
|
||||
NpcStringId.REMEMBER_OUR_HISTORY_OUR_GLORIOUS_HISTORY,
|
||||
NpcStringId.WHO_ARE_YOU_YOU_WEREN_T_HERE_BEFORE,
|
||||
NpcStringId.I_DON_T_HAVE_MUCH_TIME_LEFT,
|
||||
NpcStringId.I_M_TEN_STEPS_AHEAD_OF_YOU_DON_T_BOTHER_TRYING,
|
||||
NpcStringId.MAY_ADEN_LIVE_ON_FOREVER,
|
||||
NpcStringId.YOU_WON_T_LAY_A_FINGER_ON_HIS_MAJESTY_TRAVIS,
|
||||
NpcStringId.I_WILL_AVENGE_MY_FALLEN_COMRADES,
|
||||
NpcStringId.I_DON_T_HAVE_MUCH_TIME_LEFT,
|
||||
NpcStringId.A_MOUNTAIN_OF_CORPSES,
|
||||
NpcStringId.I_WILL_DESTROY_YOU_JUST_AS_I_HAVE_DESTROYED_THE_ENEMY_FORCES,
|
||||
NpcStringId.WELL_WHAT_DO_YOU_KNOW_YOU_RE_GUTSIER_THAN_YOU_LOOK,
|
||||
NpcStringId.WE_WERE_THE_ONES_WHO_CLEANSED_THIS_PLACE_OF_EVIL_PESTS,
|
||||
NpcStringId.TODAY_S_YOUR_JUDGMENT_DAY,
|
||||
NpcStringId.A_LONG_SLUMBER_HAS_COME_TO_AN_END,
|
||||
NpcStringId.LOOK_UPON_THIS_GREAT_GRAVE_AND_TELL_ME_YOU_SEE_NOTHING,
|
||||
NpcStringId.YOU,
|
||||
NpcStringId.AGH_MY_EYE_MY_EYE,
|
||||
NpcStringId.SO_THIS_IS_THE_END,
|
||||
NpcStringId.NO_USE_TRYING_YOUR_PETTY_TRICKS,
|
||||
NpcStringId.FEEL_FOR_YOURSELF_THE_STRENGTH_OF_MY_WILL,
|
||||
NpcStringId.I_HEAR_HIS_MAJESTY_S_VOICE_I_HEAR_IT_EVERY_WAKING_MOMENT,
|
||||
};
|
||||
|
||||
private CemeteryMonsters()
|
||||
{
|
||||
addAttackId(MONSTERS);
|
||||
addKillId(CHIEF_QUARTERMASTER, ROYAL_QUARTERMASTER, PERSONAL_MAGICIAN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon)
|
||||
{
|
||||
if (getRandom(25) < 5)
|
||||
{
|
||||
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.NPC_GENERAL, npc.getId(), getRandomEntry(SHOUT_MSG)));
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
|
||||
{
|
||||
if (getRandom(100) < 5)
|
||||
{
|
||||
switch (npc.getId())
|
||||
{
|
||||
case CHIEF_QUARTERMASTER:
|
||||
case ROYAL_QUARTERMASTER:
|
||||
{
|
||||
killer.addExpAndSp(getRandom(15_000_000, 20_000_00), 0);
|
||||
npc.broadcastPacket(new ExShowScreenMessage(NpcStringId.S1_HAS_OBTAINED_BONUS_XP_FOR_DEFEATING_A_RARE_A_GRADE_SOLDIER, ExShowScreenMessage.BOTTOM_CENTER, 10000, false, killer.getName()));
|
||||
break;
|
||||
}
|
||||
case PERSONAL_MAGICIAN:
|
||||
{
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
final Npc raider = addSpawn(ADEN_RAIDER, killer, true, 180000, false);
|
||||
addAttackPlayerDesire(raider, killer);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new CemeteryMonsters();
|
||||
}
|
||||
}
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-01.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-01.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Subclass certification occurs at levels 65, 70, 75, and 80. New skills can be learned at each level.<br>
|
||||
You can learn skills regardless of your occupation.<br>
|
||||
Effects of the skills you learn through this certification can stack, even if you use the same skills.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Gallias 34514.html">Back</Button>
|
||||
</body></html>
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-02.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-02.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Dual class certification can be done when <font color="LEVEL">your main and dual class levels both hit 85, 90, 95, and 99</font>. You can get certificates by getting certified for each of them, and with the certificates, you get to learn skills.<br>
|
||||
Remember; <font color="LEVEL">skills you learned through dual certification only apply to main class and dual class</font>.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514.html">"Okay, I see."</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-03.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-03.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
I've given you the dual class achivement skill.<br1>
|
||||
I hope it helps you.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-04.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-04.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
It looks like you already have the book for the Dual Class achievement skill. There is no use of having multiple of them.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-05.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-05.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Only players that own a Dual Class may get the dual class achivement skill.
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-06.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-06.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Good idea. Those herbs aren't the easiest to come by. And that nasty black wizard in the Dragon Valley is the only one who knows how to formulate the thing, so I wasn't too excited about this either.<br>
|
||||
And everything you got certified for... it's kind of a waste, right?
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-07.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-07.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Well, I guess I'm not one to stop you if you want to give up.<br>
|
||||
After all, it's no easy feat to use the power of a subclass in a main class.
|
||||
</body></html>
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-08.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-08.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
So what do you want to do about dual class certification?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-09.html">"I want to learn certified dual class skills."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-10.html">"Actually, I'll just give up on the whole certification deal."</Button>
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-09.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-09.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
You can obtain new powers if <font color="LEVEL">your main class and dual class both exceed level 85</font>.<br1>
|
||||
You can't get these powers unless you are certified with your dual class and main class. i<br1>
|
||||
<font color="LEVEL">I'll help you obtain new powers if you have the certificates</font>.<br1>
|
||||
So, will you give me that dual class certificate and acquire the power contained within? <br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias learnDualSkill">"Of course!"</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-11.html">"Whoa, wait a minute. Give me some time to get ready."</Button>
|
||||
</body></html>
|
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-10.html
vendored
Normal file
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-10.html
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Dual class certification and skill learning are actually incredible feats.<br1>
|
||||
As you may know from the subclass experience you had before, but it's not just about effort. The enormous pressure it puts on your soul is beyond your imagination.<br1>
|
||||
I will be usin the special herbs again to seal the certified skills you learned.<br1>
|
||||
This time though, the herb will cost you about <font color="LEVEL">20 million Adena</font>. I have them handy, so just pay up and I can cancel that certification for you. <br1>
|
||||
If you cancel the certification, <font color="LEVEL">your current certification status disappears, and all the certificates and sealbooks you didn't learn skills with will be deleted</font>.<br1>
|
||||
So...what do you want to do?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias deleteDualSkill">"Yeah, I'll go ahead and cancel the certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-06.html">"I want to quit."</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-11.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-11.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Well, if you're not ready...I can't push you.<br1>
|
||||
Come again after you <font color="LEVEL">get your main and dual class levels to 85, 90, 95, and 99 and get certified</font>.
|
||||
</body></html>
|
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-12.html
vendored
Normal file
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-12.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
Subclass certification is handled at various different levels. If your skills are good enough, I can certify you.<br>
|
||||
When you are ready, bring the certification to me and I will help you learn new skills.<br>
|
||||
Now, what level of certification do you want?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias subCertify 0">"Level 65 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias subCertify 1">"Level 70 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias subCertify 2">"Level 75 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias subCertify 3">"Level 80 Skill Certification."</Button>
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-13.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-13.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
To receive a subclass certification, you must come to me in the subclass state.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-14.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-14.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
I wanted to give you your certificate once your subclass certification was completed, but you don't have sufficient free weight and inventory space. Return to me when 80% of your weight and inventory is free.
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-15.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-15.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
You have already received the certificate for this occupation.<br>
|
||||
I cannot give you any more certificates for your current occupation. If you wish to obtain another certificate, please come back as an occupation from another slot.<br>
|
||||
However, Ertheia are still connected to gods. So it would be meaningless for them to start a new life as a subclass, which also means that subclass certificates are meaningless for them.<br>
|
||||
(Ertheia cannot add a subclass or get a subclass certificate.)
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-16.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-16.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Subclass Ability Validation:<br>
|
||||
You are not yet ready to receive your level %level% certification. Work hard and come back later.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-17.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-17.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Subclass Ability Validation:<br>
|
||||
You have already received the certificate for this skill.
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-18.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-18.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
You want to be certified for Level %level%? Once you are certified, you can't be recertified unless you cancel the certification by jumping through some hoops first. Even if you delete the class and build up your skill, it's a no go. You OK with that?<br>
|
||||
Do you still want to receive certification?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias giveSubCertify %index%">"Yes."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-19.html">"Not really."</Button>
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-19.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-19.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
Choose carefully whether or not you decide to obtain certification. Once you have it, it will cost you a tremendous sum to cancel it.
|
||||
</body></html>
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-20.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-20.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Subclass Skill Certification:<br>
|
||||
This certification is to verify that your subclass has exceeded the required level.<br>
|
||||
When your mind is clear and you've decided how to proceed, come and see me and I'll provide you with an appropriate skill.<br>
|
||||
If you would like to cancel this certification, please let me know and I can cancel it.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-21.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-21.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
To draw the power of a subclass, you must <font color="LEVEL">set your current class the main class, and bring the certificate to me.</font> Also, if you want to change any subclass certified skill you have acquired, you must abandon the skills and certification of the certified subclass. <font color="LEVEL">To abandon the subclass skills and certification, come and talk to me while you're in your main class.</font>
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-22.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-22.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Sorry, but you need 10 million adena. You don't seem to have that much money.
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-23.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-23.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Hmm... you have neither a certified certificate, nor any skills you've learned from certification. What are you trying to cancel?<br>
|
||||
This herb is very rare and expensive, you don't want to use it unless it's necessary.
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-24.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-24.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
<font color="LEVEL">To get dual class certification, don't you think you should come as a dual class?</font><br>
|
||||
Please come back as a dual class.
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-25.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-25.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
Your inventory and weight slots are still full.<br>
|
||||
<font color="LEVEL">Come back when your inventory and weight slots are less than 80% full.</font>
|
||||
</body></html>
|
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-26.html
vendored
Normal file
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-26.html
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<html><body>Dual Class Certificate Manager:<br>
|
||||
You have to be at a <font color="LEVEL">high enough level for both main and subclass.</font> I can give you the certificate if you're strong enough.<br>
|
||||
After I give you the certificate, bring it back to me and I'll tell you about skills you can learn.<br>
|
||||
Now, what level of certification do you want?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 0">"Level 85 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 1">"Level 90 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 2">"Level 95 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 3">"Level 99 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 4">"Level 101 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 5">"Level 103 Skill Certification."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 6">"Level 105 Skill Certification."</Button>
|
||||
</body></html>
|
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-27.html
vendored
Normal file
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-27.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Haven't you already been certified for level <font color="LEVEL">%level%?</font><br1>
|
||||
Young ones these days...listen carefully.<br1>
|
||||
You can get <font color="LEVEL">certified a total of 7 times for the dual class - when your main and dual class levels are at 85, 90, 95, 99, 101, 103, and 105.</font><br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Gallias 34514-26.html">Get certified for a different level</Button>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Go back</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-28.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-28.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
It seems <font color="LEVEL">you are not yet qualified to get dual class certification for level %level%</font>.<br>
|
||||
You can get certified only when <font color="LEVEL">both your main class and dual class are level %level% or above</font>. So, come back after leveling up.
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-29.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-29.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
Congratulations.<br1>
|
||||
Let me give you a <font color="LEVEL">dual class certificate for level %level%.<br1>
|
||||
Come back with this certificate when you want to learn a dual certification skill.</font><br1>
|
||||
Keep in mind that <font color="LEVEL">you have to come back as your main class</font> to learn a dual certification skill.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Gallias 34514-26.html">Get certified for a different level</Button>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Go back</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-30.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-30.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
Just like subclass certification skills, you <font color="LEVEL">have to be your main class to learn dual certification skills</font>.<br1>
|
||||
Please come back as your main class.
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-31.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-31.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Dual Class Certificate Manager Gallias:<br>
|
||||
Hmm... You don't have a dual class certificate.<br1>
|
||||
<font color="LEVEL">To learn a dual certification skill, you need a dual class certificate</font>. Get certified!<br1>
|
||||
Luckily for you, I'm the person to talk to. Would you like to get certified?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-26.html">"Yes, I'll try it."</Button>
|
||||
</body></html>
|
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-32.html
vendored
Normal file
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-32.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
To re-seal the power of the dual certification skill you learned, I need herbs.<br1>
|
||||
I need more herbs for this than for sealing subclass certification skills.<br1>
|
||||
Let me see how much it will cost...<br>
|
||||
Hmm... Just the herbs cost <font color="LEVEL">20 million Adena</font>.<br1>
|
||||
Bring me <font color="LEVEL">20 million Adena</font>.
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-33.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-33.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Sub/Dual Class Certificate Manager Gallias:<br>
|
||||
You don't have any unsealed certification skills yet.<br1>
|
||||
Come back when you want to seal the power of unsealed certification skills.
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-35.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-35.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Dual Class Certificate Manager:<br>
|
||||
You can receive the Enhanced Dual Class Certifiacte <font color="LEVEL">if your main and dual classes</font> have reached the required level. If you have enough abilities, I can give oyu the certificate.<br>
|
||||
Once you have it, I'll teach you the skill you want to learn.<br>
|
||||
Which level certificate would you like?<br><br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 7">Lv. 107 Certificate</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 8">Lv. 109 Certificate</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias dualCertify 9">Lv. 110 Certificate</Button>
|
||||
</body></html>
|
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514.html
vendored
Normal file
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/34514.html
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<html><body>Dual Class Certificate Manager:<br>
|
||||
When you get the Dual Class after thorough training, special skills will become available to you.<br>
|
||||
After you reach a certain level, you can get <font color="LEVEL">Dual Class certification</font> and <font color="LEVEL">improved Dual Class certification</font>. It will help you to upgrade your skills. But keep in mind that the certifications are available only in dual class.<br>
|
||||
The certifications will allow you to learn <font color="LEVEL">Dual Class skills</font> for your Main Class.<br>
|
||||
Let's see if you took your training seriously.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-01.html">Ask about Dual Class certification.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-26.html">Receive Dual Class certification (Lv. 105)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-35.html">Receive improved Dual Class certification (Lv. 110)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-08.html">Learn or forget Dual Class skills</Button>
|
||||
</body></html>
|
475
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/Gallias.java
vendored
Normal file
475
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Gallias/Gallias.java
vendored
Normal file
@@ -0,0 +1,475 @@
|
||||
/*
|
||||
* 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.areas.Aden.Gallias;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.SkillData;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerLogin;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerSubChange;
|
||||
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
|
||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
import org.l2jmobius.gameserver.model.skills.Skill;
|
||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.RequestAcquireSkill;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Gallias AI. (Based on Trandon AI)
|
||||
* @author Mobius
|
||||
*/
|
||||
public class Gallias extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int NPC_ID = 34514;
|
||||
// Items
|
||||
private static final int SUB_CERTIFICATE = 10280;
|
||||
private static final int DUAL_CERTIFICATE = 36078;
|
||||
private static final int DUAL_CERTIFICATE_ENHANCED = 81731;
|
||||
private static final int ENERGY_OF_POWER = 80924;
|
||||
// Skills
|
||||
private static final int DUAL_CLASS_RENEWED_ENERGY_OF_POWER = 30820;
|
||||
// Misc @formatter:off
|
||||
private static final int[] SUB_SKILL_LEVELS = {65, 70, 75, 80};
|
||||
private static final int[] DUAL_SKILL_LEVELS = {85, 90, 95, 99, 101, 103, 105, 107, 109, 110};
|
||||
// @formatter:on
|
||||
private static final String SUB_CERTIFICATE_COUNT_VAR = "SUB_CERTIFICATE_COUNT";
|
||||
private static final String DUAL_CERTIFICATE_COUNT_VAR = "DUAL_CERTIFICATE_COUNT";
|
||||
|
||||
private Gallias()
|
||||
{
|
||||
addStartNpc(NPC_ID);
|
||||
addFirstTalkId(NPC_ID);
|
||||
addTalkId(NPC_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
final String[] substrings = event.split(" ");
|
||||
if (substrings.length < 1)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
String htmltext = substrings[0];
|
||||
switch (htmltext)
|
||||
{
|
||||
case "34514.html":
|
||||
case "34514-01.html":
|
||||
case "34514-02.html":
|
||||
case "34514-04.html":
|
||||
case "34514-05.html":
|
||||
case "34514-06.html":
|
||||
case "34514-07.html":
|
||||
case "34514-08.html":
|
||||
case "34514-09.html":
|
||||
case "34514-10.html":
|
||||
case "34514-11.html":
|
||||
case "34514-19.html":
|
||||
{
|
||||
break;
|
||||
}
|
||||
case "34514-03.html":
|
||||
{
|
||||
if (!player.hasDualClass())
|
||||
{
|
||||
htmltext = "34514-05.html";
|
||||
}
|
||||
else if (hasAtLeastOneQuestItem(player, ENERGY_OF_POWER) || (player.getKnownSkill(DUAL_CLASS_RENEWED_ENERGY_OF_POWER) != null))
|
||||
{
|
||||
htmltext = "34514-04.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
giveItems(player, ENERGY_OF_POWER, 1);
|
||||
htmltext = "34514-03.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "34514-12.html":
|
||||
{
|
||||
if (!player.isSubClassActive())
|
||||
{
|
||||
htmltext = "34514-13.html";
|
||||
}
|
||||
else if (!player.isInventoryUnder90(false) || (player.getWeightPenalty() >= 2))
|
||||
{
|
||||
htmltext = "34514-14.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "subCertify":
|
||||
{
|
||||
if ((substrings.length < 2) || !player.isSubClassActive())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int index = Integer.parseInt(substrings[1]);
|
||||
if ((index < 0) || (index > 3))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int level = SUB_SKILL_LEVELS[index];
|
||||
if (player.getLevel() < level)
|
||||
{
|
||||
htmltext = getHtm(player, "34514-16.html").replace("%level%", String.valueOf(level));
|
||||
}
|
||||
else if (player.getVariables().hasVariable(getSubSkillVariableName(player, level)))
|
||||
{
|
||||
htmltext = "34514-17.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = getHtm(player, "34514-18.html");
|
||||
htmltext = htmltext.replace("%level%", String.valueOf(level));
|
||||
htmltext = htmltext.replace("%index%", String.valueOf(index));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "giveSubCertify":
|
||||
{
|
||||
if ((substrings.length < 2) || !player.isSubClassActive())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int index = Integer.parseInt(substrings[1]);
|
||||
if ((index < 0) || (index > 3))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int level = SUB_SKILL_LEVELS[index];
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
if ((player.getLevel() < level) || vars.hasVariable(getSubSkillVariableName(player, level)))
|
||||
{
|
||||
htmltext = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
final int subId = player.getClassId().getId();
|
||||
final int currentCount = player.getVariables().getInt(SUB_CERTIFICATE_COUNT_VAR + subId, 0);
|
||||
if (currentCount < SUB_SKILL_LEVELS.length)
|
||||
{
|
||||
player.getVariables().set(SUB_CERTIFICATE_COUNT_VAR + subId, currentCount + 1);
|
||||
vars.set(getSubSkillVariableName(player, level), true);
|
||||
giveItems(player, SUB_CERTIFICATE, 1);
|
||||
}
|
||||
htmltext = "34514-20.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "learnSubSkill":
|
||||
{
|
||||
if (player.isSubClassActive() || !ownsAtLeastOneItem(player, SUB_CERTIFICATE))
|
||||
{
|
||||
htmltext = "34514-21.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
RequestAcquireSkill.showSubSkillList(player);
|
||||
htmltext = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "deleteSubSkill":
|
||||
{
|
||||
if (player.isSubClassActive())
|
||||
{
|
||||
htmltext = "34514-21.html";
|
||||
}
|
||||
else if (player.getAdena() < Config.FEE_DELETE_SUBCLASS_SKILLS)
|
||||
{
|
||||
htmltext = "34514-22.html";
|
||||
}
|
||||
else if (!hasSubCertificate(player))
|
||||
{
|
||||
htmltext = "34514-23.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = null; // TODO: Unknown html
|
||||
takeItems(player, SUB_CERTIFICATE, -1);
|
||||
player.getWarehouse().destroyItemByItemId("Quest", SUB_CERTIFICATE, -1, player, npc);
|
||||
takeItems(player, Inventory.ADENA_ID, Config.FEE_DELETE_SUBCLASS_SKILLS);
|
||||
for (SubClassHolder subclass : player.getSubClasses().values())
|
||||
{
|
||||
player.getVariables().remove(SUB_CERTIFICATE_COUNT_VAR + subclass.getClassId());
|
||||
}
|
||||
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
for (int i = 1; i <= 3; i++)
|
||||
{
|
||||
for (int lv : SUB_SKILL_LEVELS)
|
||||
{
|
||||
vars.remove("SubSkill-" + i + "-" + lv);
|
||||
}
|
||||
}
|
||||
takeSkills(player, "SubSkillList");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "34514-26.html":
|
||||
{
|
||||
// TODO: What happens when you have all dual certificates?
|
||||
if (!player.isDualClassActive())
|
||||
{
|
||||
htmltext = "34514-24.html";
|
||||
}
|
||||
else if (!player.isInventoryUnder90(false) || (player.getWeightPenalty() >= 2))
|
||||
{
|
||||
htmltext = "34514-25.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "34514-35.html":
|
||||
{
|
||||
// TODO: What happens when you have all dual certificates?
|
||||
if (!player.isDualClassActive())
|
||||
{
|
||||
htmltext = "34514-24.html";
|
||||
}
|
||||
else if (!player.isInventoryUnder90(false) || (player.getWeightPenalty() >= 2))
|
||||
{
|
||||
htmltext = "34514-25.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "dualCertify":
|
||||
{
|
||||
if ((substrings.length < 2) || !player.isDualClassActive())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int index = Integer.parseInt(substrings[1]);
|
||||
if ((index < 0) || (index > (DUAL_SKILL_LEVELS.length - 1)))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
final int level = DUAL_SKILL_LEVELS[index];
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
if (vars.hasVariable(getDualSkillVariableName(level)))
|
||||
{
|
||||
htmltext = getHtm(player, "34514-27.html");
|
||||
}
|
||||
else if ((player.getLevel() < level) || (player.getStat().getBaseLevel() < level))
|
||||
{
|
||||
htmltext = getHtm(player, "34514-28.html");
|
||||
}
|
||||
else
|
||||
{
|
||||
final int currentCount = player.getVariables().getInt(DUAL_CERTIFICATE_COUNT_VAR, 0);
|
||||
if (currentCount < DUAL_SKILL_LEVELS.length)
|
||||
{
|
||||
player.getVariables().set(DUAL_CERTIFICATE_COUNT_VAR, currentCount + 1);
|
||||
vars.set(getDualSkillVariableName(level), true);
|
||||
giveItems(player, level < 107 ? DUAL_CERTIFICATE : DUAL_CERTIFICATE_ENHANCED, 1);
|
||||
}
|
||||
htmltext = getHtm(player, "34514-29.html");
|
||||
}
|
||||
htmltext = htmltext.replace("%level%", String.valueOf(level));
|
||||
break;
|
||||
}
|
||||
case "learnDualSkill":
|
||||
{
|
||||
// TODO: What happens when you have all dual-certificates used?
|
||||
if (player.isSubClassActive())
|
||||
{
|
||||
htmltext = "34514-30.html";
|
||||
}
|
||||
else if (!ownsAtLeastOneItem(player, DUAL_CERTIFICATE) && !ownsAtLeastOneItem(player, DUAL_CERTIFICATE_ENHANCED))
|
||||
{
|
||||
htmltext = "34514-31.html";
|
||||
}
|
||||
else if ((player.getLevel() < DUAL_SKILL_LEVELS[0]) || (player.getStat().getBaseLevel() < DUAL_SKILL_LEVELS[0]))
|
||||
{
|
||||
// This case should not happen
|
||||
htmltext = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
RequestAcquireSkill.showDualSkillList(player);
|
||||
htmltext = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "deleteDualSkill":
|
||||
{
|
||||
if (player.isSubClassActive())
|
||||
{
|
||||
htmltext = "34514-30.html";
|
||||
}
|
||||
else if (player.getAdena() < Config.FEE_DELETE_DUALCLASS_SKILLS)
|
||||
{
|
||||
htmltext = "34514-32.html";
|
||||
}
|
||||
else if (!hasDualCertificate(player))
|
||||
{
|
||||
htmltext = "34514-33.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = null; // TODO: Unknown html
|
||||
takeItems(player, DUAL_CERTIFICATE, -1);
|
||||
takeItems(player, DUAL_CERTIFICATE_ENHANCED, -1);
|
||||
player.getWarehouse().destroyItemByItemId("Quest", DUAL_CERTIFICATE, -1, player, npc);
|
||||
player.getWarehouse().destroyItemByItemId("Quest", DUAL_CERTIFICATE_ENHANCED, -1, player, npc);
|
||||
takeItems(player, Inventory.ADENA_ID, Config.FEE_DELETE_DUALCLASS_SKILLS);
|
||||
player.getVariables().remove(DUAL_CERTIFICATE_COUNT_VAR);
|
||||
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
for (int lv : DUAL_SKILL_LEVELS)
|
||||
{
|
||||
vars.remove(getDualSkillVariableName(lv));
|
||||
}
|
||||
takeSkills(player, "DualSkillList");
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
htmltext = null;
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
// TODO: Move this to char skills
|
||||
@RegisterEvent(EventType.ON_PLAYER_SUB_CHANGE)
|
||||
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
|
||||
public void onSubChange(OnPlayerSubChange evt)
|
||||
{
|
||||
final PlayerInstance player = evt.getPlayer();
|
||||
if (player.isDualClassActive() || !player.isSubClassActive())
|
||||
{
|
||||
giveSkills(player, "DualSkillList");
|
||||
}
|
||||
giveSkills(player, "SubSkillList");
|
||||
}
|
||||
|
||||
@RegisterEvent(EventType.ON_PLAYER_LOGIN)
|
||||
@RegisterType(ListenerRegisterType.GLOBAL_PLAYERS)
|
||||
public void onLogin(OnPlayerLogin evt)
|
||||
{
|
||||
final PlayerInstance player = evt.getPlayer();
|
||||
if (player.isDualClassActive() || !player.isSubClassActive())
|
||||
{
|
||||
giveSkills(player, "DualSkillList");
|
||||
}
|
||||
giveSkills(player, "SubSkillList");
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if player has any sub certification
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private final boolean hasSubCertificate(PlayerInstance player)
|
||||
{
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
final Set<Integer> subs = player.getSubClasses().keySet();
|
||||
for (int index : subs)
|
||||
{
|
||||
for (int lv : SUB_SKILL_LEVELS)
|
||||
{
|
||||
if (vars.hasVariable("SubSkill-" + index + "-" + lv))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if player has any dual certification
|
||||
* @param player
|
||||
* @return
|
||||
*/
|
||||
private final boolean hasDualCertificate(PlayerInstance player)
|
||||
{
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
for (int lv : DUAL_SKILL_LEVELS)
|
||||
{
|
||||
if (vars.hasVariable(getDualSkillVariableName(lv)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private final String getSubSkillVariableName(PlayerInstance player, int level)
|
||||
{
|
||||
return "SubSkill-" + player.getClassIndex() + "-" + level;
|
||||
}
|
||||
|
||||
private final String getDualSkillVariableName(int level)
|
||||
{
|
||||
return "DualSkill-" + level;
|
||||
}
|
||||
|
||||
private final void takeSkills(PlayerInstance player, String type)
|
||||
{
|
||||
final PlayerVariables vars = player.getVariables();
|
||||
final String list = vars.getString(type, "");
|
||||
if (!list.isEmpty())
|
||||
{
|
||||
final String[] skills = list.split(";");
|
||||
for (String skill : skills)
|
||||
{
|
||||
final String[] str = skill.split("-");
|
||||
final Skill sk = SkillData.getInstance().getSkill(Integer.parseInt(str[0]), Integer.parseInt(str[1]));
|
||||
player.removeSkill(sk);
|
||||
}
|
||||
vars.remove(type);
|
||||
player.sendSkillList();
|
||||
}
|
||||
}
|
||||
|
||||
private final void giveSkills(PlayerInstance player, String type)
|
||||
{
|
||||
final String list = player.getVariables().getString(type, "");
|
||||
if (!list.isEmpty())
|
||||
{
|
||||
final String[] skills = list.split(";");
|
||||
for (String skill : skills)
|
||||
{
|
||||
final String[] str = skill.split("-");
|
||||
final Skill sk = SkillData.getInstance().getSkill(Integer.parseInt(str[0]), Integer.parseInt(str[1]));
|
||||
player.addSkill(sk, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Gallias();
|
||||
}
|
||||
}
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-01.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-01.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Herphah:<br>
|
||||
How about meeting <font color="LEVEL">Ruine </font>?<br>
|
||||
He's looking for men to search the <font color="LEVEL">Dimensional Rift</font>. There must be some problem in the <font color="LEVEL">Dimensional Rift</font>. If so, you can go wherever you want.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"I'd like to know about the Hunting Zone for growth."</Button>
|
||||
</body></html>
|
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-02.html
vendored
Normal file
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-02.html
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<html><body>Herphah:<br>
|
||||
Aden is a vast continent. you can easily find places helpful for your growth.<br>
|
||||
There are countless Hunting Zones. I can recommend the best of them. Which zones are you interested in?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-03.html">"Hunting Zones recommended for level 85 or lower."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-04.html">"Hunting Zones recommended for level 85 to 87."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-05.html">"Hunting Zones recommended for level 88 to 92."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-06.html">"Hunting Zones recommended for level 93 to 94."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-07.html">"Hunting Zones recommended for level 95 to 96."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-08.html">"Hunting Zones recommended for level 97 to 98."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-09.html">"Hunting Zones recommended for level 99 or higher."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-10.html">"Instanced Dungeon Hunting Zones recommended for each level."</Button>
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-03.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-03.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Herphah:<br>
|
||||
Hmm... Zones recommended for level 85 or lower?<br>
|
||||
The question is too broad. Aden is vast and has many hunting zones. But it's really hard to answer your question without knowing exactly what level is recommendable to you.<br>
|
||||
Ah! Right. Did you read the <font color="LEVEL">letters</font> from <font color="LEVEL">Kekropus</font> and <font color="LEVEL">Queen Navari</font>?<br>
|
||||
Some <font color="LEVEL">scrolls</font> must be regularly delivered to you. Worried that young adventurers grow fast but don't know what to do or what to aim for, Kekropus and Queen Navari have regularly sent you letters to tell where to go.<br>
|
||||
If you haven't read them, go to the bottom right. You see some scrolls. They are the letters from Kekropus or Queen Navari.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-04.html
vendored
Normal file
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-04.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Herphah:<br>
|
||||
Levels 85 to 87... You can do more things now.<br>
|
||||
How about visiting the <font color="LEVEL">Hamak Underground Ruins</font>? You see <font color="LEVEL">Gatekeeper Elisa</font> up there? She will teleport you to the <font color="LEVEL">Talking Island</font>. From there, Sayunes will send you to the <font color="LEVEL">Ruins od Ye Sagira</font>, where you can find <font color="LEVEL">Giant's Minion Hadel</font>. He will give you missions.<br>
|
||||
Alternatively, you can go to the <font color="LEVEL">Altar of Evil</font> andr the <font color="LEVEL">Blood Swampland</font>. <font color="LEVEL">gatekeeper Elisa</font> will teleport you to the <font color="LEVEL">Town of Gludio</font>. From there, <font color="LEVEL">Gatekeeper Bella</font> will send you to the <font color="LEVEL">Dark Elf Village</font>. Use the <font color="LEVEL">Teleport Device</font> in the village to teleport to the <font color="LEVEL">Blood Swampland</font>.<br>
|
||||
<font color="LEVEL">Black Wizard Lepathia</font> and <font color="LEVEL">Vollodos</font> there desperately need help. Their mission will be helpful for your growth.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-05.html
vendored
Normal file
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-05.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Herphah:<br>
|
||||
You mean those for levels 88 to 92?<br>
|
||||
Have you heard about the <font color="LEVEL">Fairy Settlement</font>? I recommend that zone. To get there, ask <font color="LEVEL">Gatekeeper Elisa</font> to teleport you to the <font color="LEVEL">Hunters Village</font>.<br>
|
||||
If you've never been there, you'd better perform the quest <font color="LEVEL">Shadow of Terror: Blackish Red Fog</font> Through <font color="LEVEL">Magmeld Delegation Leader Lada</font> before heading to the Fairy Settlement.<br>
|
||||
Then, <font color="LEVEL">Gatekeeper Sookie</font> in the <font color="LEVEL">Arms of Timiniel</font>. When you get there, ask <font color="LEVEL">Fairy Refugees</font> and <font color="LEVEL">Nerupa</font> what you have to do. The <font color="LEVEL">Mother Tree Guardians</font> has recently dispatched <font color="LEVEL">Rafini</font> to the Arms of Timiniel. <font color="LEVEL">Rafini</font> may need your help.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-06.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-06.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Herphah:<br>
|
||||
Of the zones for levels 93 to 94, the <font color="LEVEL">Isle of Souls</font> is the most important. The island has a long history with Kamaels. I'm sure that what happened in the Isle of Souls drove Kamaels to create the Giant Trackers.<br>
|
||||
If this is your first visit, ask <font color="LEVEL">Gatekeeper Elisa</font> to teleport you to the <font color="LEVEL">Town of Gludio</font>. From there go to the <font color="LEVEL">Gludin Village</font> through <font color="LEVEL">Gatekeeper Bella</font>. Receive the quest <font color="LEVEL">Mysterious Journey</font> from <font color="LEVEL">Head Blacksmith Tapoy</font> there and go to the <font color="LEVEL">Isle of Souls Harbor</font> through <font color="LEVEL">Gatekeeper Richlin</font> If you're been there, go to <font color="LEVEL">Kamael Village</font> through <font color="LEVEL">Gatekeeper Elisa</font>. Use the <font color="LEVEL">Teleport Device</font> there to teleport to the <font color="LEVEL">Isle of Souls Harbor</font>.<br>
|
||||
Once you arrive at the Isle of Souls, you can undertake from <font color="LEVEL">Hesed</font> the missions related with the quests <font color="LEVEL">Uncover the Secret</font> and <font color="LEVEL">More Aggressive Operation</font>.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-07.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-07.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Herphah:<br>
|
||||
There's a hunting zone for levels 95 to 96 not far from here.<br>
|
||||
Go up the stairs, and you will see <font color="LEVEL">Agent Georgio</font>. Ask him about the quest <font color="LEVEL">Kicking Out Unwelcome Guests</font>. He wil probably tell you to go to the <font color="LEVEL">Seal of Shilen</font>.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-08.html
vendored
Normal file
7
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-08.html
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<html><body>Herphah:<br>
|
||||
From levels 97 to 99... You should start to find appropriate zones on your own. I'd like to recommend three zones.<br>
|
||||
The first is the <font color="LEVEL">Cemetery</font>. It is the closest one of the three. Go to the <font color="LEVEL">Seal of Shilen</font> through the gatekeeper here, and find the <font color="LEVEL">Aden Vanguard Quartermaster</font>. He will give you missions related with <font color="LEVEL">the Fallen King's Men</font>.<br>
|
||||
The second is the <font color="LEVEL">Blazing Swamp</font>. It is not far from here. Go to the <font color="LEVEL">Blazing Swamp</font> through the gatekeeper and find a little unusual orc. Ask the orc about the quest <font color="LEVEL">Waiting for Pa'agrio</font>. Oh, don't worry. Some orcs are quite friendly.<br>
|
||||
The last is the <font color="LEVEL">Pagan Temple</font>. To get there, you should first go to the <font color="LEVEL">Town of Rune</font> through the gatekeeper. Find <font color="LEVEL">Priestess of Light Razen</font> inside the Pagan Temple and ask him about <font color="LEVEL">Triol's Movement</font>. He will tell you what to do.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-09.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-09.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Herphah:<br>
|
||||
You have to establish close relationships with many <font color="LEVEL">factions</font>.<br>
|
||||
First, for <font color="LEVEL">level 99</font>, I recommend the <font color="LEVEL">Blackbird Clan</font> in <font color="LEVEL">Hellbound</font> led by Leona Blackbird. If you are <font color="LEVEL">level 100</font>, I recommend you to go to the <font color="LEVEL">Giant's Cave</font>, where you can find the <font color="LEVEL">Giant Trackers</font>.<br>
|
||||
If you reach <font color="LEVEL">level 101</font>, go to the <font color="LEVEL">Atelia Fortress</font> and meet the <font color="LEVEL">Kingdom's Royal Guard</font>. it was establish by the order of King of Aden.<b>
|
||||
If you are <font color="LEVEL">level 102</font> or higher, help the <font color="LEVEL">Mother Tree Guardians</font> in the <font color="LEVEL">Enchanted Valley</font>. Or you can interact with the <font color="LEVEL">Unworldly Visitors</font> in the <font color="LEVEL">Guarden of Spirits</font>. You can also go to the <font color="LEVEL">Superion Fortress</font>, the final stronghold of the <font color="LEVEL">Giant Trackers</font>.<br>
|
||||
If you are <font color="LEVEL">level 103</font> or higher, go to the <font color="LEVEL">Shadow of the Mother Tree</font>. The <font color="LEVEL">Mother Tree Guardians</font> will be waiting for you in the Elven Village.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-10.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362-10.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Herphah:<br>
|
||||
Do you want to know the <font color="LEVEL">instanced dungeons</font> recommendable for each level?<br>
|
||||
Well, do you see the <font color="LEVEL">Kartia's Researcher</font> over there? The researcher can send you into the <font color="LEVEL">Kartia's Labyrinth</font>. From <font color="LEVEL">level 85 to level 90 and up to level 95</font>, you can enter there <font color="LEVEL">alone</font> or <font color="LEVEL">with other colleagues</font>.<br>
|
||||
For <font color="LEVEL">level 99 or higher</font>, I recommend the <font color="LEVEL">Nightmare Kamaloka</font> You can enter through <font color="LEVEL">Captain Kurtiz</font>. Or, you can go to the <font color="LEVEL">Town of Gludio</font> and ask <font color="LEVEL">Refugee Neti</font> about the <font color="LEVEL">Ashen Shadow Revolutionaries</font>. It's a little far, but I recommend <font color="LEVEL">Mystic Tavern</font> in the <font color="LEVEL">underground Gainak</font>.<br>
|
||||
If you are <font color="LEVEL">level 100</font>, raid the <font color="LEVEL">Command Post</font> in the <font color="LEVEL">Atelia Fortress</font>. If your level is higher, ask <font color="LEVEL">Agent Georgio</font> at the top of the stairs to teleport you to the <font color="LEVEL">Altar of Shilen</font>.<br>
|
||||
Are you above <font color="LEVEL">level 103</font>? If som I recommend you to create a <font color="LEVEL">coalition</font> and join the <font color="LEVEL">Spezion Epic Battle</font>. You have a great number of options.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-02.html">"Tell me more about the hunting zones."</Button>
|
||||
</body></html>
|
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362.html
vendored
Normal file
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/34362.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body>Herphah:<br>
|
||||
I traveled around the continent and decided to stay here for a while... Then, I saw you! What fate!<br>
|
||||
If you are wandering without knowing what to do, I can help you. How about starting the <font color="LEVEL">Way of Wandering Knight </font>?
|
||||
I also recommend visiting the Adventure Guild, which has many missions appropriate for you.<br>
|
||||
I'm now working with the <font color="LEVEL">Adventure Guild </font>so you can trust them.<br>
|
||||
Let me know if you need any advice.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Herphah 34362-01.html"><font color="LEVEL">"Is there any other ways of growth?"</font></button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
86
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/Herphah.java
vendored
Normal file
86
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Herphah/Herphah.java
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* 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.areas.Aden.Herphah;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Aden Faction Npc AI
|
||||
* @author NightBR
|
||||
* @date 2019-03-27
|
||||
*/
|
||||
public class Herphah extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int HERPHAH = 34362;
|
||||
// Misc
|
||||
@SuppressWarnings("unused")
|
||||
private static final String[] RANDOM_VOICE =
|
||||
{
|
||||
"Npcdialog1.herphah_ep50_greeting_1",
|
||||
"Npcdialog1.herphah_ep50_greeting_2",
|
||||
"Npcdialog1.herphah_ep50_greeting_3"
|
||||
};
|
||||
|
||||
private Herphah()
|
||||
{
|
||||
addStartNpc(HERPHAH);
|
||||
addTalkId(HERPHAH);
|
||||
addFirstTalkId(HERPHAH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "34362-01.html":
|
||||
case "34362-02.html":
|
||||
case "34362-03.html":
|
||||
case "34362-04.html":
|
||||
case "34362-05.html":
|
||||
case "34362-06.html":
|
||||
case "34362-07.html":
|
||||
case "34362-08.html":
|
||||
case "34362-09.html":
|
||||
case "34362-10.html":
|
||||
{
|
||||
return event;
|
||||
}
|
||||
default:
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
// Chance to broadcast at nearby players?
|
||||
// player.sendPacket(new PlaySound(RANDOM_VOICE[getRandom(3)]));
|
||||
return "34362.html";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Herphah();
|
||||
}
|
||||
}
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
A dual class lets you select another class besides your main class and to raise them to the same level.<br>
|
||||
There are restrictions to what types of classes you can select, through. Do you want to see if you meet the conditions?.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim 34513-02.html">"Yes, on with a dual class."</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-02.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-02.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
You do not meet the conditions to add a dual class. Come back when you're ready, or ask for something else.<br>
|
||||
(You must complete the following quest to add a dual class: <font color="LEVEL">Reawakened Fate</font>.)<br>
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-03.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-03.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
You already have a dual class, so you can't add another dual class.
|
||||
</body></html>
|
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-04.html
vendored
Normal file
3
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-04.html
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
You must be at least 105 level to add a dual class.
|
||||
</body></html>
|
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-05.html
vendored
Normal file
12
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-05.html
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
Which class would you like as your Dual Class?<br1>
|
||||
<font color="LEVEL">(A Level 85 Dual Class will be added, and the 3rd transfer skills provided will be based on Human class.)</font><br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_SIGEL_GROUP">"I want choose a the Sigel Knight class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_TIR_GROUP">"I want choose a the Tyrr Warrior class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_OTHEL_GROUP">"I want choose a the Othell Rogue class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_YR_GROUP">"I want choose a the Yul Archer class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_FEOH_GROUP">"I want choose a the Feoh Wizard class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_IS_GROUP">"I want choose a the Iss Enchanter class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_WYNN_GROUP">"I want choose a the Wynn Summoner class."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim addDualClass_SIXTH_EOLH_GROUP">"I want choose a the Aeore Healer class."</Button>
|
||||
</body></html>
|
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-06.html
vendored
Normal file
9
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-06.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<html><body scroll="no">
|
||||
<table border=0 cellpadding=0 cellspacing=0 width=292 height=358 background="L2UI_CH3.refinewnd_back_Pattern">
|
||||
<tr><td valign="top" align="center"><br><br><br><br>
|
||||
These are the classes available to you.<br1>
|
||||
You must choose which you want to be.<br><br>
|
||||
%dualclassList%
|
||||
</td></tr>
|
||||
</table>
|
||||
</body></html>
|
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-07.html
vendored
Normal file
5
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-07.html
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
<html><body>Dual Class Master Joachim:<br><br>
|
||||
Congratulations!<br>
|
||||
Your dual class has been added.<br>
|
||||
I look forward to your future endeavors with your new class!
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/34513.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Dual Class Master Joachim:<br>
|
||||
Hello, I'm helping Herphah help adventures. My name is Joachim.<br>
|
||||
Do you want to do something with dual classes? I can help you to a certain extend, but if you want to request something I can't do, please talk to <font color="LEVEL">Dual Class Master Rama</font> in <font color="LEVEL">Talking Island Village</font>.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim 34513-01.html">"On with a dual class! (all races)"</button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
244
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java
vendored
Normal file
244
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java
vendored
Normal file
@@ -0,0 +1,244 @@
|
||||
/*
|
||||
* 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.areas.Aden.Joachim;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.l2jmobius.gameserver.data.xml.CategoryData;
|
||||
import org.l2jmobius.gameserver.data.xml.ClassListData;
|
||||
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ClassId;
|
||||
import org.l2jmobius.gameserver.enums.SubclassInfoType;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.events.EventType;
|
||||
import org.l2jmobius.gameserver.model.events.ListenerRegisterType;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.Id;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent;
|
||||
import org.l2jmobius.gameserver.model.events.annotations.RegisterType;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcMenuSelect;
|
||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.AcquireSkillList;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExSubjobInfo;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
import quests.Q10590_ReawakenedFate.Q10590_ReawakenedFate;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
*/
|
||||
public class Joachim extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int JOACHIM = 34513;
|
||||
// Items
|
||||
private static final int CHAOS_POMANDER_DUAL_CLASS = 37375;
|
||||
private static final int PAULINAS_RGRADE_EQUIPMENT_SET = 46919;
|
||||
private static final Map<CategoryType, Integer> POWER_ITEMS = new EnumMap<>(CategoryType.class);
|
||||
static
|
||||
{
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_SIGEL_GROUP, 32264); // Abelius Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_TIR_GROUP, 32265); // Sapyros Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_OTHEL_GROUP, 32266); // Ashagen Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_YR_GROUP, 32267); // Cranigg Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_FEOH_GROUP, 32268); // Soltkreig Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_WYNN_GROUP, 32269); // Naviarope Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_IS_GROUP, 32270); // Leister Power
|
||||
POWER_ITEMS.put(CategoryType.SIXTH_EOLH_GROUP, 32271); // Laksis Power
|
||||
}
|
||||
// Misc
|
||||
private static final List<ClassId> DUAL_CLASS_LIST = new ArrayList<>();
|
||||
static
|
||||
{
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.SIGEL_PHOENIX_KNIGHT, ClassId.SIGEL_HELL_KNIGHT, ClassId.SIGEL_EVA_TEMPLAR, ClassId.SIGEL_SHILLIEN_TEMPLAR));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.TYRR_DUELIST, ClassId.TYRR_DREADNOUGHT, ClassId.TYRR_TITAN, ClassId.TYRR_GRAND_KHAVATARI, ClassId.TYRR_DOOMBRINGER));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.OTHELL_ADVENTURER, ClassId.OTHELL_WIND_RIDER, ClassId.OTHELL_GHOST_HUNTER, ClassId.OTHELL_FORTUNE_SEEKER));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.YUL_SAGITTARIUS, ClassId.YUL_MOONLIGHT_SENTINEL, ClassId.YUL_GHOST_SENTINEL, ClassId.YUL_TRICKSTER));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.FEOH_ARCHMAGE, ClassId.FEOH_SOULTAKER, ClassId.FEOH_MYSTIC_MUSE, ClassId.FEOH_STORM_SCREAMER, ClassId.FEOH_SOUL_HOUND));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.ISS_HIEROPHANT, ClassId.ISS_SWORD_MUSE, ClassId.ISS_SPECTRAL_DANCER, ClassId.ISS_DOOMCRYER));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.WYNN_ARCANA_LORD, ClassId.WYNN_ELEMENTAL_MASTER, ClassId.WYNN_SPECTRAL_MASTER));
|
||||
DUAL_CLASS_LIST.addAll(Arrays.asList(ClassId.AEORE_CARDINAL, ClassId.AEORE_EVA_SAINT, ClassId.AEORE_SHILLIEN_SAINT));
|
||||
}
|
||||
|
||||
private Joachim()
|
||||
{
|
||||
addStartNpc(JOACHIM);
|
||||
addTalkId(JOACHIM);
|
||||
addFirstTalkId(JOACHIM);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "34513-01.html":
|
||||
{
|
||||
final QuestState qs = player.getQuestState(Q10590_ReawakenedFate.class.getSimpleName());
|
||||
if ((qs == null) || !qs.isCompleted())
|
||||
{
|
||||
htmltext = "34513-02.html";
|
||||
}
|
||||
else if (player.hasDualClass())
|
||||
{
|
||||
htmltext = "34513-03.html";
|
||||
}
|
||||
else if (player.getLevel() < 105)
|
||||
{
|
||||
htmltext = "34513-04.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
htmltext = "34513-05.html";
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "addDualClass_SIXTH_SIGEL_GROUP":
|
||||
case "addDualClass_SIXTH_TIR_GROUP":
|
||||
case "addDualClass_SIXTH_OTHEL_GROUP":
|
||||
case "addDualClass_SIXTH_YR_GROUP":
|
||||
case "addDualClass_SIXTH_FEOH_GROUP":
|
||||
case "addDualClass_SIXTH_IS_GROUP":
|
||||
case "addDualClass_SIXTH_WYNN_GROUP":
|
||||
case "addDualClass_SIXTH_EOLH_GROUP":
|
||||
{
|
||||
final CategoryType cType = CategoryType.valueOf(event.replace("addDualClass_", ""));
|
||||
if (cType == null)
|
||||
{
|
||||
LOGGER.warning(getClass().getSimpleName() + ": Cannot parse CategoryType, event: " + event);
|
||||
}
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
final NpcHtmlMessage html = getNpcHtmlMessage(player, npc, "34513-06.html");
|
||||
for (ClassId dualClasses : getDualClasses(player, cType))
|
||||
{
|
||||
if (dualClasses != null)
|
||||
{
|
||||
sb.append("<button value=\"" + ClassListData.getInstance().getClass(dualClasses.getId()).getClassName() + "\" action=\"bypass -h menu_select?ask=1&reply=" + dualClasses.getId() + "\" width=\"200\" height=\"31\" back=\"L2UI_CT1.HtmlWnd_DF_Awake_Down\" fore=\"L2UI_CT1.HtmlWnd_DF_Awake\"><br>");
|
||||
}
|
||||
}
|
||||
html.replace("%dualclassList%", sb.toString());
|
||||
player.sendPacket(html);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
return "34513.html";
|
||||
}
|
||||
|
||||
private NpcHtmlMessage getNpcHtmlMessage(PlayerInstance player, Npc npc, String fileName)
|
||||
{
|
||||
final NpcHtmlMessage html = new NpcHtmlMessage(npc.getObjectId());
|
||||
final String text = getHtm(player, fileName);
|
||||
if (text == null)
|
||||
{
|
||||
LOGGER.info("Cannot find HTML file for " + Joachim.class.getSimpleName() + " AI: " + fileName);
|
||||
return null;
|
||||
}
|
||||
html.setHtml(text);
|
||||
return html;
|
||||
}
|
||||
|
||||
private List<ClassId> getDualClasses(PlayerInstance player, CategoryType cType)
|
||||
{
|
||||
final List<ClassId> tempList = new ArrayList<>();
|
||||
final int baseClassId = player.getBaseClass();
|
||||
final int dualClassId = player.getClassId().getId();
|
||||
for (ClassId temp : DUAL_CLASS_LIST)
|
||||
{
|
||||
if ((temp.getId() != baseClassId) && (temp.getId() != dualClassId) && ((cType == null) || CategoryData.getInstance().isInCategory(cType, temp.getId())))
|
||||
{
|
||||
tempList.add(temp);
|
||||
}
|
||||
}
|
||||
return tempList;
|
||||
}
|
||||
|
||||
@RegisterEvent(EventType.ON_NPC_MENU_SELECT)
|
||||
@RegisterType(ListenerRegisterType.NPC)
|
||||
@Id(JOACHIM)
|
||||
public void OnNpcMenuSelect(OnNpcMenuSelect event)
|
||||
{
|
||||
final PlayerInstance player = event.getTalker();
|
||||
final Npc npc = event.getNpc();
|
||||
final int ask = event.getAsk();
|
||||
|
||||
switch (ask)
|
||||
{
|
||||
case 1: // Reawaken (change dual class)
|
||||
{
|
||||
final int classId = event.getReply();
|
||||
if (player.isTransformed() || player.hasSummon() || player.hasDualClass() || !player.isAwakenedClass())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Validating classId
|
||||
if (!getDualClasses(player, null).contains(ClassId.getClassId(classId)))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (player.addSubClass(classId, 1, true))
|
||||
{
|
||||
player.abortCast();
|
||||
player.stopAllEffectsExceptThoseThatLastThroughDeath();
|
||||
player.stopAllEffects();
|
||||
player.stopCubics();
|
||||
player.setActiveClass(1);
|
||||
player.sendPacket(new ExSubjobInfo(player, SubclassInfoType.CLASS_CHANGED));
|
||||
player.sendPacket(getNpcHtmlMessage(player, npc, "34513-07.html"));
|
||||
SkillTreeData.getInstance().cleanSkillUponChangeClass(player);
|
||||
player.restoreDualSkills();
|
||||
player.sendPacket(new AcquireSkillList(player));
|
||||
player.sendSkillList();
|
||||
player.broadcastUserInfo();
|
||||
|
||||
// Item rewards
|
||||
player.addItem("subclass", CHAOS_POMANDER_DUAL_CLASS, 2, player, true);
|
||||
player.addItem("subclass", PAULINAS_RGRADE_EQUIPMENT_SET, 1, player, true);
|
||||
giveItems(player, getPowerItemId(player), 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int getPowerItemId(PlayerInstance player)
|
||||
{
|
||||
return POWER_ITEMS.entrySet().stream().filter(e -> player.isInCategory(e.getKey())).mapToInt(Entry::getValue).findFirst().orElse(0);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Joachim();
|
||||
}
|
||||
}
|
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Penny/34413.html
vendored
Normal file
8
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Penny/34413.html
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<html><body>Adventure Guildsman Penny:<br>
|
||||
Your ability is a reflection of your life. If you continue to do your best, your ability will grow.<br>
|
||||
Me? As you see, I don't have any talent for hunting, but I'm quite good at distributing tasks to adventures.<br>
|
||||
If you have a <font color="LEVEL">Medal of Honor </font>or a<font color="LEVEL"> Grand Medal of Honor </font>I'll raise your amity points, so let me know.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Penny medal"><font color="LEVEL">"I have a Medal of Honor."</font></button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Penny grand_medal"><font color="LEVEL">"I have a Grand Medal of Honor."</font></button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
79
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Penny/Penny.java
vendored
Normal file
79
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Penny/Penny.java
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* 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.areas.Aden.Penny;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Aden Faction Npc AI
|
||||
* @author NightBR
|
||||
* @date 2019-03-27
|
||||
*/
|
||||
public class Penny extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int PENNY = 34413;
|
||||
// Misc
|
||||
private static final String[] RANDOM_VOICE =
|
||||
{
|
||||
"Npcdialog1.peny_ep50_greeting_7",
|
||||
"Npcdialog1.peny_ep50_greeting_8",
|
||||
"Npcdialog1.peny_ep50_greeting_9"
|
||||
};
|
||||
|
||||
private Penny()
|
||||
{
|
||||
addStartNpc(PENNY);
|
||||
addTalkId(PENNY);
|
||||
addFirstTalkId(PENNY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "medal":
|
||||
{
|
||||
// Take medal / Give rep?
|
||||
return null;
|
||||
}
|
||||
case "grand_medal":
|
||||
{
|
||||
// Take medal / Give rep?
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
player.sendPacket(new PlaySound(3, RANDOM_VOICE[getRandom(3)], 0, 0, 0, 0, 0));
|
||||
return "34413.html";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Penny();
|
||||
}
|
||||
}
|
95
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Ruine/Ruine.java
vendored
Normal file
95
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Ruine/Ruine.java
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* 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.areas.Aden.Ruine;
|
||||
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Ruine AI
|
||||
* @author Gigi
|
||||
* @date 2017-02-18 - [20:14:22]
|
||||
*/
|
||||
public class Ruine extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int COD_ADEN_OFFICER = 34229;
|
||||
// Level checks
|
||||
private static final int MIN_LEVEL_CRACK = 95;
|
||||
private static final int MIN_LEVEL_RIFT = 100;
|
||||
// Teleports
|
||||
private static final Location DIMENSIONAL_CRACK = new Location(-119304, -182456, -6752);
|
||||
private static final Location DIMENSIONAL_RIFT = new Location(140629, 79672, -5424);
|
||||
|
||||
private Ruine()
|
||||
{
|
||||
addStartNpc(COD_ADEN_OFFICER);
|
||||
addFirstTalkId(COD_ADEN_OFFICER);
|
||||
addTalkId(COD_ADEN_OFFICER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "cod_aden_officer001.htm":
|
||||
case "cod_aden_officer004.htm":
|
||||
case "cod_aden_officer005.htm":
|
||||
{
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "crack_teleport":
|
||||
{
|
||||
if (player.getLevel() >= MIN_LEVEL_CRACK)
|
||||
{
|
||||
player.teleToLocation(DIMENSIONAL_CRACK);
|
||||
break;
|
||||
}
|
||||
htmltext = "cod_aden_officer003.htm";
|
||||
break;
|
||||
}
|
||||
case "rift_teleport":
|
||||
{
|
||||
if (player.getLevel() >= MIN_LEVEL_RIFT)
|
||||
{
|
||||
player.teleToLocation(DIMENSIONAL_RIFT);
|
||||
break;
|
||||
}
|
||||
htmltext = "cod_aden_officer003.htm";
|
||||
break;
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
return "cod_aden_officer001.htm";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Ruine();
|
||||
}
|
||||
}
|
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Ruine/cod_aden_officer001.htm
vendored
Normal file
10
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Ruine/cod_aden_officer001.htm
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<html><body>Dimension Seeker Ruine:<br>
|
||||
Nice to meet you. I am Dimension Seeker Ruine.<br>
|
||||
Many problems associated with the dimensions have been occurring nowadays. I have been asked by Aden Castle to investigate, and that is what brings me here.<br>
|
||||
Among the various issues relating to the dimension, the issues that I am involved with are the <font color="LEVEL">Dimensional Crack</font> and the <font color="LEVEL">Dimensional Rift</font>.<br>
|
||||
If you would like, I will send you to the <font color="LEVEL">Dimensional Crack</font> and the <font color="LEVEL">Dimensional Rift</font>. Please help me with searching the dimension.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Ruine cod_aden_officer004.htm">"Tell me about the Dimensional Crack."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Ruine cod_aden_officer005.htm">"Tell me about the Dimensional Rift."</Button>
|
||||
<Button ALIGN=LEFT ICON="TELEPORT" action="bypass -h Quest Ruine crack_teleport">"I want to teleport to the Dimensional Crack (Lv. 95+)."</Button>
|
||||
<Button ALIGN=LEFT ICON="TELEPORT" action="bypass -h Quest Ruine rift_teleport">"I want to teleport to the Dimensional Rift (Lv. 100+)."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,4 @@
|
||||
<html><body>Dimension Seeker Ruine:<br>
|
||||
Something has happened with the dimension, and I am investigating it at the moment. Could you please return later?<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Ruine cod_aden_officer001.htm">Back</Button>
|
||||
</body></html>
|
@@ -0,0 +1,4 @@
|
||||
<html><body>Dimension Seeker Ruine:<br>
|
||||
I don't think that you meet our qualifications for dimension seekers.<br>
|
||||
(Your level is too low.)
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Dimension Seeker Ruine:<br>
|
||||
The <font color="LEVEL">Dimensional Crack</font>, they say, is originally a labyrinth that was created by the influence of the Seven Signs. However, one day, it was closed shut. Because it happened before the Ertheia came into the Material Realm, we knew nothing of the Dimensional Crack.<br>
|
||||
We were investigating the warping of the dimension, which we discovered in Faeron Village. In the process, we found that the dimensional warp was linked to the Dimensional Crack, and that the Dimensional Crack was growing in the process.<br>
|
||||
Also, we found that the monsters that appear in the Dimensional Crack were similar to the monsters that had attacked Faeron Village, and started investigating this fact.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Ruine cod_aden_officer001.htm">Back</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Dimension Seeker Ruine:<br>
|
||||
<font color="LEVEL">The Dimensional Rift</font> was a phenomenon that was identified after the Dimensional Crack was discovered, during additional investigations of Aden Castle and the Ivory Tower. It all began when strange movement was detected in the sealed off Catacomb of the Witch.<br>
|
||||
Monsters began appearing in the Catacomb of the Witch. We felt they were out of place, and got to thinking that they might have something to do with the various recent events that have to do with the dimension. We therefore participated in the survey as well.<br>
|
||||
What we found was that as the Dimensional Crack grew, the Dimensional Rift which had existed previously had been growing. The Catacomb of the Witch has now been completely consumed by the Dimensional Rift. I don't know if this is a good or bad thing, but the Dimensional Rift has not expanded beyond the size of the Catacomb of the Witch. However, we could not leave the situation as it was, and thus we began our expedition of the Dimensional Rift.<br>
|
||||
The Dimensional Rift is even more dangerous than then Dimensional Crack. You must be even more careful there.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h Quest Ruine cod_aden_officer001.htm">Back</Button>
|
||||
</body></html>
|
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Tarti/34360.html
vendored
Normal file
4
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Tarti/34360.html
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
<html><body>Tarti:<br>
|
||||
What is it? Just tell me if you want to undertake the missions of Unworldly Visitors.<br>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
59
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Tarti/Tarti.java
vendored
Normal file
59
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/Aden/Tarti/Tarti.java
vendored
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.areas.Aden.Tarti;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.PlaySound;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Tarti AI
|
||||
* @author Gigi
|
||||
* @date 2019-08-17 - [22:44:02]
|
||||
*/
|
||||
public class Tarti extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int TARTI = 34360;
|
||||
// Misc
|
||||
private static final String[] TARTI_VOICE =
|
||||
{
|
||||
"Npcdialog1.tarti_ep50_greeting_8",
|
||||
"Npcdialog1.tarti_ep50_greeting_9",
|
||||
"Npcdialog1.tarti_ep50_greeting_10"
|
||||
};
|
||||
|
||||
private Tarti()
|
||||
{
|
||||
addStartNpc(TARTI);
|
||||
addFirstTalkId(TARTI);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onFirstTalk(Npc npc, PlayerInstance player)
|
||||
{
|
||||
player.sendPacket(new PlaySound(3, TARTI_VOICE[getRandom(3)], 0, 0, 0, 0, 0));
|
||||
return "34360.html";
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Tarti();
|
||||
}
|
||||
}
|
159
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/AncientArcanCity.java
vendored
Normal file
159
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/AncientArcanCity.java
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* 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.areas.AncientCityArcan;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Movie;
|
||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.spawns.SpawnGroup;
|
||||
import org.l2jmobius.gameserver.model.spawns.SpawnTemplate;
|
||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||
import org.l2jmobius.gameserver.model.zone.type.ScriptZone;
|
||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.Earthquake;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ExShowScreenMessage;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.OnEventTrigger;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Ancient Arcan City AI.
|
||||
* @author St3eT
|
||||
*/
|
||||
public class AncientArcanCity extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int CEREMONIAL_CAT = 33093;
|
||||
// Location
|
||||
private static final Location ANCIENT_ARCAN_CITY = new Location(207559, 86429, -1000);
|
||||
private static final Location EARTHQUAKE = new Location(207088, 88720, -1128);
|
||||
// Zones
|
||||
private static final ScriptZone BROADCAST_ZONE = ZoneManager.getInstance().getZoneById(23600, ScriptZone.class); // Ancient Arcan City zone
|
||||
private static final ScriptZone TELEPORT_ZONE = ZoneManager.getInstance().getZoneById(12015, ScriptZone.class); // Anghel Waterfall teleport zone
|
||||
// Misc
|
||||
private static final int CHANGE_STATE_TIME = 1800000; // 30min
|
||||
private boolean isCeremonyRunning = false;
|
||||
private final Set<SpawnTemplate> _templates = ConcurrentHashMap.newKeySet();
|
||||
|
||||
private AncientArcanCity()
|
||||
{
|
||||
addEnterZoneId(BROADCAST_ZONE.getId(), TELEPORT_ZONE.getId());
|
||||
startQuestTimer("CHANGE_STATE", CHANGE_STATE_TIME, null, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
if (event.equals("CHANGE_STATE"))
|
||||
{
|
||||
isCeremonyRunning = !isCeremonyRunning;
|
||||
for (PlayerInstance temp : BROADCAST_ZONE.getPlayersInside())
|
||||
{
|
||||
temp.sendPacket(new OnEventTrigger(262001, !isCeremonyRunning));
|
||||
temp.sendPacket(new OnEventTrigger(262003, isCeremonyRunning));
|
||||
if (isCeremonyRunning)
|
||||
{
|
||||
showOnScreenMsg(temp, NpcStringId.THE_INCREASED_GRASP_OF_DARK_ENERGY_CAUSES_THE_GROUND_TO_SHAKE, ExShowScreenMessage.TOP_CENTER, 5000, true);
|
||||
temp.sendPacket(new Earthquake(EARTHQUAKE, 10, 5));
|
||||
}
|
||||
}
|
||||
|
||||
if (isCeremonyRunning)
|
||||
{
|
||||
_templates.stream().forEach(t -> t.spawn(g -> String.valueOf(g.getName()).equalsIgnoreCase("Ceremony"), null));
|
||||
}
|
||||
else
|
||||
{
|
||||
_templates.stream().forEach(t -> t.despawn(g -> String.valueOf(g.getName()).equalsIgnoreCase("Ceremony")));
|
||||
cancelQuestTimers("SOCIAL_ACTION");
|
||||
}
|
||||
}
|
||||
else if (event.contains("SOCIAL_ACTION") && (npc != null))
|
||||
{
|
||||
npc.broadcastSocialAction(2);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onEnterZone(Creature creature, ZoneType zone)
|
||||
{
|
||||
if (creature.isPlayer())
|
||||
{
|
||||
final PlayerInstance player = creature.getActingPlayer();
|
||||
if (zone.getId() == TELEPORT_ZONE.getId())
|
||||
{
|
||||
// final QuestState qs = creature.getActingPlayer().getQuestState(Q10301_ShadowOfTerrorBlackishRedFog.class.getSimpleName());
|
||||
// if ((qs != null) && qs.isCond(3))
|
||||
// {
|
||||
// final Quest instance = QuestManager.getInstance().getQuest(TaintedDimension.class.getSimpleName());
|
||||
// if (instance != null)
|
||||
// {
|
||||
// instance.notifyEvent("enterInstance", null, player);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
player.teleToLocation(ANCIENT_ARCAN_CITY);
|
||||
// }
|
||||
}
|
||||
else
|
||||
{
|
||||
player.sendPacket(new OnEventTrigger(262001, !isCeremonyRunning));
|
||||
player.sendPacket(new OnEventTrigger(262003, isCeremonyRunning));
|
||||
if (player.getVariables().getBoolean("ANCIENT_ARCAN_CITY_SCENE", true))
|
||||
{
|
||||
player.getVariables().set("ANCIENT_ARCAN_CITY_SCENE", false);
|
||||
playMovie(player, Movie.SI_ARKAN_ENTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.onEnterZone(creature, zone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSpawnActivate(SpawnTemplate template)
|
||||
{
|
||||
_templates.add(template);
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void onSpawnDeactivate(SpawnTemplate template)
|
||||
// {
|
||||
// _templates.remove(template);
|
||||
// }
|
||||
@Override
|
||||
public void onSpawnNpc(SpawnTemplate template, SpawnGroup group, Npc npc)
|
||||
{
|
||||
if (npc.getId() == CEREMONIAL_CAT)
|
||||
{
|
||||
npc.setRandomAnimation(npc.getParameters().getBoolean("disableRandomAnimation", false));
|
||||
startQuestTimer("SOCIAL_ACTION", 4500, npc, null, true);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new AncientArcanCity();
|
||||
}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
<html><body>Enchanter Lykus:<br>
|
||||
Enchantment requires a lot of effort. Repeat what I do if you want to be good at it!<br><br>
|
||||
First! Shout my name three times!<br>
|
||||
Second! Circle Ancient City Arcan three times!<br>
|
||||
Lastly! Go to a quiet place, and imagine yourself holding the enchanted weapons or armor! Right!<br><br>
|
||||
You can't skip any of the steps!<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-02.html">"My heart is weak so I can't enchant."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-03.html">"I did what you said but nothing happened."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,3 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
Just trust me and enchant only once! Believe in yourself!
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
No...! Really?<br>
|
||||
I can't believe it...!<br>
|
||||
Did you really follow what I said?<br>
|
||||
I must... say I'm sorry! Hit me as much as you want! I'm sorry! Hit me!
|
||||
</body></html>
|
@@ -0,0 +1,8 @@
|
||||
<html><body>Enchanter Lykus:<br>
|
||||
Go and enchant a +16 weapon to make it +17!<br>
|
||||
You can't fail since I bestowed you with my blessing!<br>
|
||||
Don't worry and just do as I told you!<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-01.html">"I would like to learn from you."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-03.html">"I failed while enchanting +16."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-05.html">"I succeeded and made a +17!"</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Enchanter Lykus:<br>
|
||||
Excellent! Great work!<br>
|
||||
You are quite brave!<br>
|
||||
Now, if you can step up with one more enchant, I'll give you a wonderful thing.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-03.html">"Enchanting failed!"</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-12.html">"I did already...! (Really?)"</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
Re...really?!<br>
|
||||
...Umm, actually, I don't have anything to give. That was to give you some confidence!<br>
|
||||
It worked for you, and I'm happy.<br>
|
||||
Confidence is everything in enchantment! Trust yourself then enchant! Ha ha ha! Luck is on your side!
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Enchanter Lykus:<br>
|
||||
You brought a shield from Orbis Temple! That is a powerful shield used by the ancient heroes - very useful!<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-08.html">"Do you know how to use this shield?"</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus trade1">"I want to enchant it." (5000 Adena)</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus tradeAll">"I actually brought more than one. I want to enchant all of them." (5000 Adena per shield)</Button>
|
||||
</body></html>
|
@@ -0,0 +1,4 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
This shield has amazing power that can push dark power away.<br>
|
||||
If you do enchant, you will be able to <font color="LEVEL">defeat the power of darkness</font> that is deeply embedded into Orbis Temple or <font color="LEVEL">reflect the petrification</font> that is used.
|
||||
</body></html>
|
@@ -0,0 +1,5 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
Here it is!<br>
|
||||
You weren't worried that I would somehow break your shield, were you? There's no chance of that - I'm an expert at enchantment!<br>
|
||||
As you may know, the <font color="LEVEL">Polished Ancient Hero's Shield</font> can <font color="LEVEL">defeat the power of darkness</font> or on special occasions, <font color="LEVEL">reflect the petrification</font>deep inside Orbis Temple!
|
||||
</body></html>
|
@@ -0,0 +1,4 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
My abilities do not come cheaply! Prime prices for prime services!<br>
|
||||
(You need 5000 Adena for 1 Shield)
|
||||
</body></html>
|
@@ -0,0 +1,4 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
Are you joking with me? I cannot work on thin air!<br>
|
||||
(You don't have the Orbis Ancient Hero's Shield)
|
||||
</body></html>
|
@@ -0,0 +1,5 @@
|
||||
<html><body>Enchant Setter Lykus:<br>
|
||||
Ah, are you... serious? Ha. Hahahahaha!<br>
|
||||
Someone actually did it. I apologize. I don't have anything ready, to tell you the truth. I'm really sorry....<br>
|
||||
I didn't mean to make fun of you!
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Enchanter Lykus:<br>
|
||||
Stronger! Harder! I am an enchant expert, name's Lykus.<br>
|
||||
Would you like to use my services? <font color="LEVEL">Go for it! Then you'll get it!</font><br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-07.html">"I want to enchant the shield I got at Orbis Temple."</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-01.html">"Any advice on enchantment?"</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lykus 33521-04.html">"Do you have any quests?"</Button>
|
||||
</body></html>
|
92
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Lykus/Lykus.java
vendored
Normal file
92
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Lykus/Lykus.java
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* 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.areas.AncientCityArcan.Lykus;
|
||||
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Lykus AI.
|
||||
* @author St3eT
|
||||
*/
|
||||
public class Lykus extends AbstractNpcAI
|
||||
{
|
||||
// NPCs
|
||||
private static final int LYKUS = 33521;
|
||||
// Items
|
||||
private static final int POLISHED_SHIELD = 17723; // Polished Ancient Hero's Shield
|
||||
private static final int OLD_SHIELD = 17724; // Orbis Ancient Hero's Shield
|
||||
|
||||
public Lykus()
|
||||
{
|
||||
addFirstTalkId(LYKUS);
|
||||
addTalkId(LYKUS);
|
||||
addStartNpc(LYKUS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "33521-01.html":
|
||||
case "33521-02.html":
|
||||
case "33521-03.html":
|
||||
case "33521-04.html":
|
||||
case "33521-05.html":
|
||||
case "33521-07.html":
|
||||
case "33521-08.html":
|
||||
case "33521-12.html":
|
||||
{
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (event.startsWith("trade"))
|
||||
{
|
||||
final int count = (int) (event.equals("trade1") ? 1 : getQuestItemsCount(player, OLD_SHIELD));
|
||||
if (!hasAtLeastOneQuestItem(player, OLD_SHIELD))
|
||||
{
|
||||
htmltext = "33521-11.html";
|
||||
}
|
||||
else if (player.getAdena() < (5000 * count))
|
||||
{
|
||||
htmltext = "33521-10.html";
|
||||
}
|
||||
else
|
||||
{
|
||||
takeItems(player, Inventory.ADENA_ID, 5000 * count);
|
||||
takeItems(player, OLD_SHIELD, count);
|
||||
giveItems(player, POLISHED_SHIELD, count);
|
||||
htmltext = "33521-09.html";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Lykus();
|
||||
}
|
||||
}
|
@@ -0,0 +1,5 @@
|
||||
<html><body>Mumu:<br>
|
||||
Well, there's a warehouse and shops - just enter the village and turn left! Otherwise, if you turn right, you'll see people from the Elf village.<br>
|
||||
The tall building here is the Arcan tower, where our brave hero, Slaski, resides!<br>
|
||||
Lastly, the thing in the center of the village is the axis of this place, but recently there have been strange people appearing there, and now we can't approach because of the dark energy...
|
||||
</body></html>
|
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Mumu/32900.html
vendored
Normal file
6
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Mumu/32900.html
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<html><body>Mumu:<br>
|
||||
Welcome to Arcan! If you have questions or would like to look around, simply let me know!<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Mumu 32900-1.html">"What are the major elements here?"</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Mumu playMovie">"I want to look around."</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
65
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Mumu/Mumu.java
vendored
Normal file
65
L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/areas/AncientCityArcan/Mumu/Mumu.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.areas.AncientCityArcan.Mumu;
|
||||
|
||||
import org.l2jmobius.gameserver.enums.Movie;
|
||||
import org.l2jmobius.gameserver.model.actor.Npc;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
/**
|
||||
* Mumu AI.
|
||||
* @author St3eT
|
||||
*/
|
||||
public class Mumu extends AbstractNpcAI
|
||||
{
|
||||
// NPC
|
||||
private static final int MUMU = 32900; // Mumu
|
||||
|
||||
public Mumu()
|
||||
{
|
||||
addStartNpc(MUMU);
|
||||
addFirstTalkId(MUMU);
|
||||
addTalkId(MUMU);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
String htmltext = null;
|
||||
switch (event)
|
||||
{
|
||||
case "32900-1.html":
|
||||
{
|
||||
htmltext = event;
|
||||
break;
|
||||
}
|
||||
case "playMovie":
|
||||
{
|
||||
playMovie(player, Movie.SI_ARKAN_ENTER);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Mumu();
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
<html><body>Aden Vanguard Barton:<br>
|
||||
Who are you! Identify yourself!<br>
|
||||
Well, you don't look like the enemy. What brings you to this dangerous place? <br>
|
||||
Have you come after hearing that the Aden Vanguard has secured strongholds in the Atelia Fortress? What? I wasn't captured. It's called infiltration. Hmph.<br>
|
||||
Anyway thanks to you and your friends we were to secure this stronghold, so I should reward you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager give_tp_st_1">"Thanks."</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Aden Vanguard Barton:<br>
|
||||
Although this place is the closest to the entrance, you still have to face many Embryo on the way here.<br>
|
||||
Elikia heard of the situation and made this Teleport Device for us. If you'll be staying for a while, it will be very useful.<br>
|
||||
But I heard that it only works for 24 hours, since it's not perfect. Still, you should find it useful.<br>If you come back tomorrow, I'll prepare a new one for you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h tutorial_close">"Thanks."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,8 @@
|
||||
<html><body>Aden Vanguard Hayuk:<br>
|
||||
Who are you! Identify yourself!<br>
|
||||
Well, you don't look like the enemy. What brings you to this dangerous place? <br>
|
||||
Have you come after hearing that the Aden Vanguard has secured strongholds in the Atelia Fortress? What? I wasn't captured. It's called infiltration. Hmph.<br>
|
||||
Anyway thanks to you and your friends we were to secure this stronghold, so I should reward you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager give_tp_st_2">"Thanks."</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Aden Vanguard Hayuk:<br>
|
||||
Although this place is the closest to the entrance, you still have to face many Embryo on the way here.<br>
|
||||
Elikia heard of the situation and made this Teleport Device for us. If you'll be staying for a while, it will be very useful.<br>
|
||||
But I heard that it only works for 24 hours, since it's not perfect. Still, you should find it useful.<br>If you come back tomorrow, I'll prepare a new one for you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h tutorial_close">"Thanks."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Aden Vanguard Elise:<br>
|
||||
Who are you? Oh, you are not the enemy. I'm sorry. This place is just so dangerous...<br>
|
||||
What brings you here? I've come to secure this stronghold. I've just been hiding away, since the resistance of the Embryo has gotten worse.<br>
|
||||
I know you've helped me here, so I'll reward you for that.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager give_tp_st_3">"Thanks."</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Aden Vanguard Elise:<br>
|
||||
You can use this Teleport Device to teleport near this stronghold. Impressing, right?<br>
|
||||
It was made by Elikia. It will be useful if you'll be staying around for a while. Here, take it.<br>
|
||||
Elikia did say that the device doesn't last long. He said it lasts for 24 hours...<br>
|
||||
But if you come back tomorrow, I'll have another one ready for you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h tutorial_close">"Thanks."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,9 @@
|
||||
<html><body>Aden Vanguard Eliyah:<br>
|
||||
Who are you? Do you want to experience the wrath of my spirit?<br>
|
||||
Hmm... You don't look like the enemy. Be glad. You would've been beat to death by my spirits.<br>
|
||||
I'm busy protecting this stronghold. What do you want? I've been taking a break, since the Embryo are so scared of me and have been trying to escape.<br>
|
||||
Well, since you helped me regain the stronghold, I'll give you a little something.<br>
|
||||
Anyway thanks to you and your friends we were to secure this stronghold, so I should reward you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager give_tp_st_4">"Thanks."</Button>
|
||||
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Aden Vanguard Eliyah:<br>
|
||||
This is a device that lets you teleport to Stronghold IV very easily.<br>
|
||||
This was made by Elikia. It will be very useful if you'll be staying here for a while.<br>
|
||||
Just remember that the device lasts for 24 hours, since this place is very unstable.<br>
|
||||
If you need it again, come back tomorrow. I'll give you a new one.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h tutorial_close">"Thanks."</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Blackbird Clan Member Glenkinchie:<br>
|
||||
Who are you? I'm Glenkinchie from the honorable Blackbird clan.<br>
|
||||
Those vicious Embryos are up to something in the Atelia Fortress. They are still within our sight, but we are having a hard time infiltrating the Command Post on the 3rd floor. <br>
|
||||
But I don't mind working this hard for Leona. Don't you agree?<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager 34063-2.htm">"Tell me about the Command Post."</Button><Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,7 @@
|
||||
<html><body>Blackbird Clan Member Glenkinchie:<br>
|
||||
The <font color="LEVEL">Command Post</font> is known to be the place where new soldiers are trained. We don't know what kind of soldiers they are creating, though.<br>
|
||||
What we do know is that the gate opens when <font color="LEVEL">Burnstein</font> <font color="LEVEL">comes out and goes back inside the Command Post</font>. Since the gate rarely opens, it's hard for us to go inside the investigate.<br>
|
||||
That's why we asked Devianne for help to hold the gate open.<br>
|
||||
The only way we can get inside is by having <font color="LEVEL">Devianne</font>, who is hiding near the <font color="LEVEL">entrance to the Command Post</font>, hold the gate open when Burnstein goes back inside.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
|
||||
</body></html>
|
@@ -0,0 +1,5 @@
|
||||
<html><body>Blackbird Clan Member Hurak:<br>
|
||||
I trust Leona, but that doesn't mean I trust everyone easily.<br>
|
||||
I can't believe I fell for such a simple trick. You should be careful too. Things are just getting started...<br>They've even created a command post within the fortress, so we have to put our guard up.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager 34064-2.htm">"Tell me about the Command Post."</Button><Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</body></html>
|
@@ -0,0 +1,6 @@
|
||||
<html><body>Blackbird Clan Member Hurak:<br>
|
||||
The Embryo are training their new recruits in the <font color="LEVEL">Command Post</font>.
|
||||
The security is so tight, that going inside is hard in itself.<br>The one way to go in is when <font color="LEVEL">Burnstein</font> comes out and <font color="LEVEL">tries to go back inside the Command Post</font>. We have our own method to do that.<br>
|
||||
<font color="LEVEL">Devianne</font> is hiding near the <font color="LEVEL">entrance to the Command Post</font> on the 3rd floor, to hold the gate open whenever Burnstein goes back inside. It should be helpful when you are trying to go inside.<br>
|
||||
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
|
||||
</body></html>
|
@@ -0,0 +1,5 @@
|
||||
<html><body>Blackbird Clan Member Laffian:<br>
|
||||
I trust Leona, but that doesn't mean I trust everyone easily.<br>
|
||||
I can't believe I fell for such a simple trick. You should be careful too. Things are just getting started...<br>They've even created a command post within the fortress, so we have to put our guard up.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AteliaManager 34065-2.htm">"Tell me about the Command Post."</Button><Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
|
||||
</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