diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/Character.ini b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/Character.ini
index 5b92d23e1e..b12f9047a1 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/Character.ini
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/Character.ini
@@ -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
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-01.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-01.html
new file mode 100644
index 0000000000..9e1b3e3ebd
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-01.html
@@ -0,0 +1,6 @@
+
Dual Class Certificate Manager Gallias:
+Subclass certification occurs at levels 65, 70, 75, and 80. New skills can be learned at each level.
+You can learn skills regardless of your occupation.
+Effects of the skills you learn through this certification can stack, even if you use the same skills.
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-02.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-02.html
new file mode 100644
index 0000000000..5174e568ce
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-02.html
@@ -0,0 +1,5 @@
+Dual Class Certificate Manager Gallias:
+Dual class certification can be done when your main and dual class levels both hit 85, 90, 95, and 99. You can get certificates by getting certified for each of them, and with the certificates, you get to learn skills.
+Remember; skills you learned through dual certification only apply to main class and dual class.
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-03.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-03.html
new file mode 100644
index 0000000000..1d8587da69
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-03.html
@@ -0,0 +1,4 @@
+Dual Class Certificate Manager Gallias:
+I've given you the dual class achivement skill.
+I hope it helps you.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-04.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-04.html
new file mode 100644
index 0000000000..6cfbf657f4
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-04.html
@@ -0,0 +1,3 @@
+Dual Class Certificate Manager Gallias:
+It looks like you already have the book for the Dual Class achievement skill. There is no use of having multiple of them.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-05.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-05.html
new file mode 100644
index 0000000000..ad037f0495
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-05.html
@@ -0,0 +1,3 @@
+Dual Class Certificate Manager Gallias:
+Only players that own a Dual Class may get the dual class achivement skill.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-06.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-06.html
new file mode 100644
index 0000000000..3f8fb5f434
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-06.html
@@ -0,0 +1,4 @@
+Dual Class Certificate Manager Gallias:
+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.
+And everything you got certified for... it's kind of a waste, right?
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-07.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-07.html
new file mode 100644
index 0000000000..64c6a417f4
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-07.html
@@ -0,0 +1,4 @@
+Dual Class Certificate Manager Gallias:
+Well, I guess I'm not one to stop you if you want to give up.
+After all, it's no easy feat to use the power of a subclass in a main class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-08.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-08.html
new file mode 100644
index 0000000000..523f998e1f
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-08.html
@@ -0,0 +1,5 @@
+Dual Class Certificate Manager Gallias:
+So what do you want to do about dual class certification?
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-09.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-09.html
new file mode 100644
index 0000000000..0236926846
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-09.html
@@ -0,0 +1,8 @@
+Dual Class Certificate Manager Gallias:
+You can obtain new powers if your main class and dual class both exceed level 85.
+You can't get these powers unless you are certified with your dual class and main class. i
+I'll help you obtain new powers if you have the certificates.
+So, will you give me that dual class certificate and acquire the power contained within?
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-10.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-10.html
new file mode 100644
index 0000000000..edc6d3401c
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-10.html
@@ -0,0 +1,10 @@
+Dual Class Certificate Manager Gallias:
+Dual class certification and skill learning are actually incredible feats.
+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.
+I will be usin the special herbs again to seal the certified skills you learned.
+This time though, the herb will cost you about 20 million Adena. I have them handy, so just pay up and I can cancel that certification for you.
+If you cancel the certification, your current certification status disappears, and all the certificates and sealbooks you didn't learn skills with will be deleted.
+So...what do you want to do?
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-11.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-11.html
new file mode 100644
index 0000000000..36b6ece822
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-11.html
@@ -0,0 +1,4 @@
+Dual Class Certificate Manager Gallias:
+Well, if you're not ready...I can't push you.
+Come again after you get your main and dual class levels to 85, 90, 95, and 99 and get certified.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-12.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-12.html
new file mode 100644
index 0000000000..35c46bb25f
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-12.html
@@ -0,0 +1,9 @@
+Subclass Skill Certification:
+Subclass certification is handled at various different levels. If your skills are good enough, I can certify you.
+When you are ready, bring the certification to me and I will help you learn new skills.
+Now, what level of certification do you want?
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-13.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-13.html
new file mode 100644
index 0000000000..0b51d94414
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-13.html
@@ -0,0 +1,3 @@
+Subclass Skill Certification:
+To receive a subclass certification, you must come to me in the subclass state.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-14.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-14.html
new file mode 100644
index 0000000000..91327bf283
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-14.html
@@ -0,0 +1,3 @@
+Dual Class Certificate Manager Gallias:
+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.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-15.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-15.html
new file mode 100644
index 0000000000..b8771f3a15
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-15.html
@@ -0,0 +1,6 @@
+Subclass Skill Certification:
+You have already received the certificate for this occupation.
+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.
+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.
+(Ertheia cannot add a subclass or get a subclass certificate.)
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-16.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-16.html
new file mode 100644
index 0000000000..ad936549bb
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-16.html
@@ -0,0 +1,3 @@
+Subclass Ability Validation:
+You are not yet ready to receive your level %level% certification. Work hard and come back later.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-17.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-17.html
new file mode 100644
index 0000000000..1e735eb468
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-17.html
@@ -0,0 +1,3 @@
+Subclass Ability Validation:
+You have already received the certificate for this skill.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-18.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-18.html
new file mode 100644
index 0000000000..238c892650
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-18.html
@@ -0,0 +1,6 @@
+Subclass Skill Certification:
+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?
+Do you still want to receive certification?
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-19.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-19.html
new file mode 100644
index 0000000000..f7d43c22d0
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-19.html
@@ -0,0 +1,3 @@
+Subclass Skill Certification:
+Choose carefully whether or not you decide to obtain certification. Once you have it, it will cost you a tremendous sum to cancel it.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-20.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-20.html
new file mode 100644
index 0000000000..b366226171
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-20.html
@@ -0,0 +1,5 @@
+Subclass Skill Certification:
+This certification is to verify that your subclass has exceeded the required level.
+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.
+If you would like to cancel this certification, please let me know and I can cancel it.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-21.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-21.html
new file mode 100644
index 0000000000..bc8ae6dffd
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-21.html
@@ -0,0 +1,3 @@
+Dual Class Certificate Manager Gallias:
+To draw the power of a subclass, you must set your current class the main class, and bring the certificate to me. Also, if you want to change any subclass certified skill you have acquired, you must abandon the skills and certification of the certified subclass. To abandon the subclass skills and certification, come and talk to me while you're in your main class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-22.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-22.html
new file mode 100644
index 0000000000..5de89ec333
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-22.html
@@ -0,0 +1,3 @@
+Dual Class Certificate Manager Gallias:
+Sorry, but you need 10 million adena. You don't seem to have that much money.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-23.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-23.html
new file mode 100644
index 0000000000..5005f11951
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-23.html
@@ -0,0 +1,4 @@
+Dual Class Certificate Manager Gallias:
+Hmm... you have neither a certified certificate, nor any skills you've learned from certification. What are you trying to cancel?
+This herb is very rare and expensive, you don't want to use it unless it's necessary.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-24.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-24.html
new file mode 100644
index 0000000000..2f644b4ad4
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-24.html
@@ -0,0 +1,4 @@
+Sub/Dual Class Certificate Manager Gallias:
+To get dual class certification, don't you think you should come as a dual class?
+Please come back as a dual class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-25.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-25.html
new file mode 100644
index 0000000000..796c0cb904
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-25.html
@@ -0,0 +1,4 @@
+Sub/Dual Class Certificate Manager Gallias:
+Your inventory and weight slots are still full.
+Come back when your inventory and weight slots are less than 80% full.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-26.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-26.html
new file mode 100644
index 0000000000..3e2afa3065
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-26.html
@@ -0,0 +1,12 @@
+Subclass/Dual Class Skill Certification:
+You have to be at a high enough level for both main and subclass. I can give you the certificate if you're strong enough.
+After I give you the certificate, bring it back to me and I'll tell you about skills you can learn.
+Now, what level of certification do you want?
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-27.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-27.html
new file mode 100644
index 0000000000..27d92cc5c6
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-27.html
@@ -0,0 +1,5 @@
+Dual Class Certificate Manager Gallias:
+Haven't you already been certified for level %level%?
+Young ones these days...listen carefully.
+You can get 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.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-28.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-28.html
new file mode 100644
index 0000000000..f59b483131
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-28.html
@@ -0,0 +1,4 @@
+Sub/Dual Class Certificate Manager Gallias:
+It seems you are not yet qualified to get dual class certification for level %level%.
+You can get certified only when both your main class and dual class are level %level% or above. So, come back after leveling up.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-29.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-29.html
new file mode 100644
index 0000000000..ebe27c4fc7
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-29.html
@@ -0,0 +1,6 @@
+Sub/Dual Class Certificate Manager Gallias:
+Congratulations.
+Let me give you a dual class certificate for level %level%.
+Come back with this certificate when you want to learn a dual certification skill.
+Keep in mind that you have to come back as your main class to learn a dual certification skill.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-30.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-30.html
new file mode 100644
index 0000000000..85b2713b24
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-30.html
@@ -0,0 +1,4 @@
+Sub/Dual Class Certificate Manager Gallias:
+Just like subclass certification skills, you have to be your main class to learn dual certification skills.
+Please come back as your main class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-31.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-31.html
new file mode 100644
index 0000000000..49f727604c
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-31.html
@@ -0,0 +1,6 @@
+Dual Class Certificate Manager Gallias:
+Hmm... You don't have a dual class certificate.
+To learn a dual certification skill, you need a dual class certificate. Get certified!
+Luckily for you, I'm the person to talk to. Would you like to get certified?
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-32.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-32.html
new file mode 100644
index 0000000000..5f24f149a2
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-32.html
@@ -0,0 +1,7 @@
+Sub/Dual Class Certificate Manager Gallias:
+To re-seal the power of the dual certification skill you learned, I need herbs.
+I need more herbs for this than for sealing subclass certification skills.
+Let me see how much it will cost...
+Hmm... Just the herbs cost 20 million Adena.
+Bring me 20 million Adena.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-33.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-33.html
new file mode 100644
index 0000000000..66c644bbcd
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514-33.html
@@ -0,0 +1,4 @@
+Sub/Dual Class Certificate Manager Gallias:
+You don't have any unsealed certification skills yet.
+Come back when you want to seal the power of unsealed certification skills.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514.html
new file mode 100644
index 0000000000..40fe206034
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/34514.html
@@ -0,0 +1,10 @@
+Dual Class Certificate Manager Gallias:
+When you get the Dual Class after through training, special skills will become available to you.
+Let's see of you took your training seriously.
+You must be of Lv. 105 or higher to use my services.
+So, how can I help you?
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/Gallias.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/Gallias.java
new file mode 100644
index 0000000000..9e9f38f644
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Gallias/Gallias.java
@@ -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 .
+ */
+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 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();
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html
index ad19f62334..c3a602144b 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-01.html
@@ -1,5 +1,5 @@
Dual Class Master Joachim:
A dual class lets you select another class besides your main class and to raise them to the same level.
There are restrictions to what types of classes you can select, through. Do you want to see if you meet the conditions?.
-
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-03.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-03.html
new file mode 100644
index 0000000000..c5343d383f
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-03.html
@@ -0,0 +1,3 @@
+Dual Class Master Joachim:
+You already have a dual class, so you can't add another dual class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-04.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-04.html
new file mode 100644
index 0000000000..761538b7ad
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-04.html
@@ -0,0 +1,3 @@
+Dual Class Master Joachim:
+You must be at least 105 level to add a dual class.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-05.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-05.html
new file mode 100644
index 0000000000..aca5f0fce4
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-05.html
@@ -0,0 +1,12 @@
+Dual Class Master Joachim:
+Which class would you like as your Dual Class?
+(A Level 85 Dual Class will be added, and the 3rd transfer skills provided will be based on Human class.)
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-06.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-06.html
new file mode 100644
index 0000000000..c019108d7e
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-06.html
@@ -0,0 +1,9 @@
+
+
+
+These are the classes available to you.
+You must choose which you want to be.
+%dualclassList%
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-07.html b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-07.html
new file mode 100644
index 0000000000..3852890089
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/34513-07.html
@@ -0,0 +1,5 @@
+Dual Class Master Joachim:
+Congratulations!
+Your dual class has been added.
+I look forward to your future endeavors with your new class!
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java
index ee8a923a6f..baae0f1e2f 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/ai/areas/Aden/Joachim/Joachim.java
@@ -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 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;
+ 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;
}
- default:
+ 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":
{
- return null;
+ 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("