Addition of Joachim and Gallias AIs.

This commit is contained in:
MobiusDevelopment 2020-01-06 22:04:37 +00:00
parent 9e20fbfd86
commit 934c53500e
97 changed files with 863 additions and 88 deletions

View File

@ -167,8 +167,8 @@ DivineInspirationSpBookNeeded = True
AltSubClassWithoutQuests = True
# Allow player to upgrade sub-class to dualclass from Raina without finish Split Destiny quest.
# Default: False
AltDualClassWithoutQuest = False
# Default: True
AltDualClassWithoutQuest = True
# Allow player to learn transformations without quest.
# Default: False

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@ -0,0 +1,3 @@
<html><body>Subclass Ability Validation:<br>
You have already received the certificate for this skill.
</body></html>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@ -0,0 +1,12 @@
<html><body>Subclass/Dual Class Skill Certification:<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>

View File

@ -0,0 +1,5 @@
<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>
</body></html>

View 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>

View File

@ -0,0 +1,6 @@
<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.
</body></html>

View 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>

View 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>

View 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>

View 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>

View File

@ -0,0 +1,10 @@
<html><body>Dual Class Certificate Manager Gallias:<br>
When you get the Dual Class after through training, special skills will become available to you.<br>
Let's see of you took your training seriously.<br1>
You must be of <font color="LEVEL">Lv. 105 or higher</font> to use my services.<br>
So, how can I help you?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-03.html">Receive Dual Class skills</Button>
<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</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Gallias 34514-08.html">Learn or forget Dual Class skills</Button>
</body></html>

View File

@ -0,0 +1,438 @@
/*
* 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.impl.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.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 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};
// @formatter:on
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
{
vars.set(getSubSkillVariableName(player, level), true);
giveItems(player, SUB_CERTIFICATE, 1);
htmltext = "34514-20.html";
}
break;
}
case "learnSubSkill":
{
if (player.isSubClassActive() || !hasQuestItems(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);
takeItems(player, Inventory.ADENA_ID, Config.FEE_DELETE_SUBCLASS_SKILLS);
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 "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
{
vars.set(getDualSkillVariableName(level), true);
giveItems(player, DUAL_CERTIFICATE, 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 (!hasQuestItems(player, DUAL_CERTIFICATE))
{
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, Inventory.ADENA_ID, Config.FEE_DELETE_DUALCLASS_SKILLS);
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();
}
}

View File

@ -1,5 +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 wuth a dual class."</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Joachim 34513-02.html">"Yes, on with a dual class."</Button>
</body></html>

View 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>

View 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>

View 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>

View 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>

View 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>

View File

@ -16,20 +16,52 @@
*/
package ai.areas.Aden.Joachim;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.l2jmobius.gameserver.data.xml.impl.CategoryData;
import org.l2jmobius.gameserver.data.xml.impl.ClassListData;
import org.l2jmobius.gameserver.data.xml.impl.SkillTreesData;
import org.l2jmobius.gameserver.enums.CategoryType;
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.base.ClassId;
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;
/**
* Aden Faction Npc AI
* @author NightBR
* @date 2019-11-25
* @author Mobius
*/
public class Joachim extends AbstractNpcAI
{
// NPC
private static final int JOACHIM = 34513;
// 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()
{
@ -41,18 +73,62 @@ public class Joachim extends AbstractNpcAI
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
String htmltext = null;
switch (event)
{
case "34513-01.html":
case "34513-02.html":
{
return event;
}
default:
final QuestState qs = player.getQuestState(Q10590_ReawakenedFate.class.getSimpleName());
if ((qs == null) || !qs.isCompleted())
{
return null;
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
@ -61,6 +137,78 @@ public class Joachim extends AbstractNpcAI
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"));
SkillTreesData.getInstance().cleanSkillUponAwakening(player);
player.sendPacket(new AcquireSkillList(player));
player.sendSkillList();
player.broadcastUserInfo();
}
break;
}
}
}
public static void main(String[] args)
{
new Joachim();

View File

@ -1,4 +1,4 @@
<html><head><body>Subclass/Dual Class Master Raina:<br>
<html><head><body>Dual Class Master Raina:<br>
So you need to <font color="LEVEL">create/reset a subclass</font>?<br>
<font color="af9878">A new class subclass starts at </font><font color="LEVEL">level 40</font><font color="af9878">.<br>
</font><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina addSubclass">"I'll add a new subclass (create new)."</Button><br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<br>
I heard that Ertheia are curious people. But a gem that absorbs power... I still can't help thinking that it's really dangerous. You could have died. <br>
But thanks to your efforts, even Ertheia can use the power of the giants now.<br>
But because you're different than the race from the Material Realm, your power will not merge with the giants'. Because they do not mingle, you will not be able to use your power while using the giants' power. Of course, you can use your original power instead of the giants' power anytime you wish.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<br>
Hello!<br1>
I will be assisting you with <font color="LEVEL">reawakening an Awakened dual class</font>.<br1>
To reawaken a dual class, you need to have an Awakened dual class. After reawakening, your level will be reduced to level 85, and all the skills you've learned will be forgotten.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<br>
So you want to know about <font color="LEVEL">items designated for a dual class</font>?<br1>
They're for those who grow their dual class powers beyond imaginable limits.<br1>
You can purchase as many as you want, but <font color="LEVEL">you have to be at certain level with your main and dual classes in order to use them</font>.<br>

View File

@ -1,4 +1,4 @@
<html><body> Subclass/Dual Class Master Raina:<br><br>
<html><body> Dual Class Master Raina:<br><br>
Hello!<br>
I'm collecting XP Bottles.<br>
I'll give you items if you bring me XP Bottles, how's that?<br>

View File

@ -1,10 +1,8 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<br>
Hello!<br1>
You have a question about subclass or dual class?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-01.html">"Yeah. How do I create or reset a subclass?"</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-02.html">"I want to add a dual class." (for Ertheia only)</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-03.html">"Can I reawaken my Awakened dual class?"</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-04.html">"So...what are the items for dual classes?" </Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-05.html">"What's with these XP Bottles?"</Button>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
Do you want to know more about dual classes?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-02.html">Add a dual class (for all common races)</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-03.html">Ask about the dual class reawekening.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-04.html">Ask about dual class items</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-05.html">Ask about XP Bottles</Button>
</body></html>

View File

@ -174,10 +174,6 @@ public class Raina extends AbstractNpcAI
{
htmltext = "noSummon.html";
}
else if (player.getRace() == Race.ERTHEIA)
{
htmltext = "noErtheia.html";
}
else if (!haveDoneQuest(player, false))
{
htmltext = "noQuest.html";
@ -225,10 +221,6 @@ public class Raina extends AbstractNpcAI
{
htmltext = "noSummon.html";
}
else if (player.getRace() == Race.ERTHEIA)
{
htmltext = "noErtheia.html";
}
else if (!player.isInventoryUnder90(true) || (player.getWeightPenalty() >= 2))
{
htmltext = "inventoryLimit.html";
@ -266,10 +258,6 @@ public class Raina extends AbstractNpcAI
{
htmltext = "noSummon.html";
}
else if (player.getRace() == Race.ERTHEIA)
{
htmltext = "noErtheia.html";
}
else if (!player.isInventoryUnder80(true) || (player.getWeightPenalty() >= 2))
{
htmltext = "inventoryLimit.html";
@ -310,7 +298,7 @@ public class Raina extends AbstractNpcAI
case "addDualClass_SIXTH_WYNN_GROUP":
case "addDualClass_SIXTH_EOLH_GROUP":
{
if ((player.getRace() != Race.ERTHEIA) || (player.getLevel() < 85) || !player.isInCategory(CategoryType.SIXTH_CLASS_GROUP) || player.hasDualClass() || !haveDoneQuest(player, true))
if ((player.getLevel() < 85) || !player.isInCategory(CategoryType.SIXTH_CLASS_GROUP) || player.hasDualClass() || !haveDoneQuest(player, true))
{
htmltext = "addDualClassErtheiaFailed.html";
break;
@ -434,10 +422,6 @@ public class Raina extends AbstractNpcAI
{
htmltext = "noSummon.html";
}
else if (player.getRace() == Race.ERTHEIA)
{
htmltext = "noErtheia.html";
}
else if (!player.isInventoryUnder90(true) || (player.getWeightPenalty() >= 2))
{
htmltext = "inventoryLimit.html";

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
The choice is no easy one.<br>
The new subclass will be a level 40, 2nd-transfer class. <br>
Are you sure you want to go ahead with this decision? <br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
The choice is no easy one.<br>
<font="LEVEL">The new subclass will have none of the skill enchants or the skills you learned through codices. Think carefully.</font><br>
Are you sure you want to go ahead with this decision? <br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<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 Raina addDualClass_SIXTH_SIGEL_GROUP">"I want choose a the Sigel Knight class."</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You do not meet the conditions to add a dual class.<br>
Come back when you're ready, or ask for something else.<br>
(Only Ertheia characters Lv. 85 or above may add a dual class once.)

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br>
<html><body>Dual Class Master Raina:<br>
Hello!<br1>
You have a question about subclass or dual class?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina 33491-01.html">"Yeah. How do I create or reset a subclass?"</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You do not meet the conditions to add a dual class.<br>
Come back when you're ready, or ask for something else.<br>
(Only characters with a subclass of Lv. 80 or above may change it to a dual class once.)

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Sorry, but you're not qualified to add a subclass.<br1>
To add a new subclass, you need the following qualifications:<br>
First, <font color="LEVEL">you've completed the 'Red Thread of Fate' quest</font>. If you want to get on that, let me know.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Congratulations!<br>
Your new subclass has been added.<br>
I look forward to your future endeavors with your new subclass!<br>

View File

@ -1,3 +1,3 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You need inventory space and free weight to create or renew a subclass. Go free up your weight and inventory to less than 80%, and I'll see what I can do.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You need a Subclass Change Certificate in order to receive the power of the gods. This was given to heroes long before Shilen's destructive rampages came about, so you can't find new ones anymore.<br>
But if you have the certificate, talk to me again as a subclass ready to receive the power of the gods.<br>
<font color="af9878">But a dual class isn't ready to receive the power of the gods, so I can't change classes for that.</font>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Ertheia cannot add or modify subclasses.<br>
Please talk to me when you're ready to add a dual class.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You haven't completed the 'Red Thread of Fate' quest yet.<br>
To create a subclass, you have to <font color="LEVEL">complete the 'Red Thread of Fate' quest</font>. If you want to work on the quest, let me know.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You don't have a subclass to change.<br>
Make a subclass.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You cannot create a new subclass<br>
when there is a pet or servitor.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
I cannot create a new subclass while you're transformed.<br>
Change back to your original form, then talk to me again.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You do not meet the conditions to add a dual class.<br>
Come back when you're ready, or ask for something else.<br>
(Only Ertheia characters Lv. 85 or above may add a dual class once.)

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
In order to reawaken your dual class,<br>
<font color="LEVEL">you need the cloak you received when you first awakened it,<br>
and some %price% Adena</font> to pay the fee.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
I see.<br>
Make a carful decision because you will lose the power you have, to get new power.<br>
When you make up your mind, come back to me.

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
So, into which class would you like to Reawaken?<br>
Remember that if you proceed, you will go back to <font color="LEVEL">Lv. 85, and all your skills will be reset.</font><br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Raina reawaken_SIXTH_SIGEL_GROUP">"I will change to the Knight class."</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
You don't look like a Awakened dual class.<br>
If you want to Reawaken, you must be an <font color="LEVEL">Awakened dual class</font>.<br>
Please come find me when you have Awakened as a dual class.<br><br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
To change your dual class,<br>
<font color="LEVEL">you need the cloak you received when you awakened your dual class,<br>
and %price% Adena</font> for a fee.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Congratulations!<br>
Your new awaken class has been added.<br>
I look forward to your future endeavors with your new class!

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Which subclass would you like to change to?<br>
Please select a subclass from the list below.<br>
<font color="LEVEL">The new subclas will be a level 40, 2nd-transfer class with none of the skill enchants or the skills you learned through codices. Think carefully.</font><br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Select a Subclass.<br><br>
%subclassList%
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Master Raina:<br><br>
<html><body>Dual Class Master Raina:<br><br>
Which subclass would you like to change to?<br>
Please select a subclass from the list below.<br>
<font color="LEVEL">The new subclas will be a level 40, 2nd-transfer class with none of the skill enchants or the skills you learned through codices. Think carefully.</font><br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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 Trandon 33490.html">"Okay, I see."</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
So what do you want to know about subclass certification?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Trandon 33490-04.html">"I want to learn skills for certified subclasses."</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Trandon 33490-05.html">"I want to give up on skills and certification for certified subclasses."</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
If your subclass is strong enough, that class' power can be transferred to your main class.<br>
But this is a dangerous feat. Your power must be proven through certification.<br>
If you have a certificate, I will do a partial transfer on you.<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
Subclass skill certification and learning actually require tons of effort. Not just effort - it's more fundamental than that. The enormous pressure it puts on your soul... a normal person wouldn't be able to survive it.<br>
Not that it's completely impossible if you use special herbs. Except that those herbs cost about <font color="LEVEL">10 million Adena</font> each. But I have the herbs handy, so as long as you pay up, I can cancel that certification for you.<br>
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>. So...what do you want to do?<br>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
So what do you want to do about dual class certification?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Trandon 33490-09.html">"I want to learn certified dual class skills."</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Trandon 33490-10.html">"Actually, I'll just give up on the whole certification deal."</Button>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,3 +1,3 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,3 +1,3 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,3 +1,3 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
Sorry, but you need 10 million adena. You don't seem to have that much money.
</body></html>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<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>

View File

@ -1,4 +1,4 @@
<html><body>Subclass/Dual Class Certificate Manager Trandon:<br>
<html><body>Dual Class Certificate Manager Trandon:<br>
Discipline and endless training to bring your subclass up to a certain level open your eyes to new powers.<br1>
Now, let's see how much your training has taught you.<br1>
By the way, to receive this certification, <font color="LEVEL">your current class must be the class of the subclass or dual class you want to be certified for; you also need to be level 65 or above, and in the case of the dual class, level 85 or above</font>.<br1>

View File

@ -1,3 +1,3 @@
<html><body>Dual Class Master Joachim:<br>
this quest is run at level 95+ and the quest Where Fates Intersect must be completed
This quest is run at level 95+ and the quest where Fates Intersect must be completed.
</body></html>

View File

@ -113,6 +113,7 @@
<npc id="34362" x="146472" y="26808" z="-2209" heading="62980" respawnTime="60sec" /> <!-- Herphah -->
<npc id="34360" x="146856" y="26696" z="-2209" heading="14831" respawnTime="60sec" /> <!-- Tarti -->
<npc id="34513" x="146471" y="26730" z="-2205" respawnTime="60sec" /> <!-- Joachim -->
<npc id="34514" x="146534" y="26663" z="-2204" heading="6027" respawnTime="60sec" /> <!-- Gallias -->
</group>
</spawn>
</list>

View File

@ -457,9 +457,6 @@
<spawn>
<npc id="25931" x="16318" y="-119300" z="-872" heading="38391" dbSave="true" dbName="Theor" respawnTime="24hour" respawnRandom="12hour" /> <!-- Theor -->
</spawn>
<spawn>
<npc id="25932" x="-14170" y="44830" z="-3592" heading="0" dbSave="true" dbName="Transformed: Dartanion" respawnTime="24hour" respawnRandom="12hour" /> <!-- Transformed: Dartanion -->
</spawn>
<spawn>
<npc id="25933" x="206367" y="108468" z="-2120" heading="0" dbSave="true" dbName="Garden Patrol Captain" respawnTime="24hour" respawnRandom="12hour" /> <!-- Garden Patrol Captain -->
</spawn>

View File

@ -314,6 +314,10 @@
<set name="is_dropable" val="false" />
<set name="is_depositable" val="false" />
<set name="is_sellable" val="false" />
<set name="handler" val="ItemSkills" />
<skills>
<skill id="30820" level="1" /> <!-- Dual Class - Renewed Energy of Power -->
</skills>
</item>
<item id="80925" name="Potion of Protection: Confusion" type="EtcItem">
<!-- When used, Confusion Resistance +5%, Received PvP Damage -3%. Cannot be used in the Olympiad. Does not stack when used with other Potions of Protection. -->