Addition of Elemental Spirits.

Author: JoeAlisson
Source: https://github.com/JoeAlisson/L2jOrg
This commit is contained in:
MobiusDevelopment 2019-07-16 18:10:59 +00:00
parent 18e0a4c4cd
commit e97ef7dead
188 changed files with 9200 additions and 722 deletions

View File

@ -0,0 +1,17 @@
DROP TABLE IF EXISTS `character_spirits`;
CREATE TABLE `character_spirits`
(
`charId` INT UNSIGNED NOT NULL,
`type` TINYINT NOT NULL,
`level` TINYINT NOT NULL DEFAULT 1,
`stage` TINYINT NOT NULL DEFAULT 0,
`experience` BIGINT NOT NULL DEFAULT 0,
`attack_points` TINYINT NOT NULL DEFAULT 0,
`defense_points` TINYINT NOT NULL DEFAULT 0,
`crit_rate_points` TINYINT NOT NULL DEFAULT 0,
`crit_damage_points` TINYINT NOT NULL DEFAULT 0,
`in_use` BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (`charId`, `type`),
FOREIGN KEY FK_CHARACTER_SPIRITS (`charId`) REFERENCES characters (`charId`) ON DELETE CASCADE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;

View File

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalSpiritData.xsd">
<spirit name="Flame Spirit Seed" type="1" stage="0" npcId="13565" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Ignis - Minor Flame Spirit" type="1" stage="1" npcId="13566" extractItem="91040" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91032" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Ignis - Lesser Flame Spirit" type="1" stage="2" npcId="13566" extractItem="91040" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91032" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Ignis - Median Flame Spirit" type="1" stage="3" npcId="13568" extractItem="91040" maxCharacteristics="15" >
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Water Spirit Seed" type="2" stage="0" npcId="13569" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Nebula - Minor Water Spirit" type="2" stage="1" npcId="13570" extractItem="91039" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91031" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Nebula - Lesser Water Spirit" type="2" stage="2" npcId="13571" extractItem="91039" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91031" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Nebula - Median Water Spirit" type="2" stage="3" npcId="13572" extractItem="91039" maxCharacteristics="15" >
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Wind Spirit Seed" type="3" stage="0" npcId="13573" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Procella - Minor Wind Spirit" type="3" stage="1" npcId="13574" extractItem="91041" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91033" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Procella - Lesser Wind Spirit" type="3" stage="2" npcId="13575" extractItem="91041" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91033" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Procella - Median Wind Spirit" type="3" stage="3" npcId="13576" extractItem="91041" maxCharacteristics="15">
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Earth Spirit Seed" type="4" stage="0" npcId="13577" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Petram - Minor Earth Spirit" type="4" stage="1" npcId="13578" extractItem="91042" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91034" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91038" experience="9300" />
</spirit>
<spirit name="Petram - Lesser Earth Spirit" type="4" stage="2" npcId="13579" extractItem="91042" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91034" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91038" experience="9300" />
</spirit>
<spirit name="Petram - Median Earth Spirit" type="4" stage="3" npcId="13580" extractItem="91042" maxCharacteristics="15">
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91038" experience="9300" />
</spirit>
</list>

View File

@ -0,0 +1,14 @@
<html><body>Svein:<br>
What are you curious to know about spirits?<br>
I will do my best to tell you everything I know.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 11">Check Spirits Status</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 12">Attribute Effect</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 13">Spirits Training and Attribute Hunting Ground</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 14">Spirits Stats</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 15">Spirits Characteristics</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 16">Spirits Evolution</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 17">Spirits Absorb</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 18">Spirits Extract</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 19">Changes Attributes</Button>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Svein:<br>
Are you curious about checking the spirits' status?<br>
Start by opening the Character Information window.<br>
<font color="LEVEL">(You can open Character Information window with Alt+T.)</font><br>
If you click the <font color="LEVEL">Spirits</font> button in the lower screen, you can check the spirits' status.<br>
Is there anything else you're curious about?<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,15 @@
<html><body>Svein:<br>
Attribute Effect changes damage dealt and taken in battle.<br>
<font color="LEVEL">[Attribute Types]<br1>
Spirits are classified according to 4 attributes of water, fire, wind and earth.<br>
<font color="LEVEL">[Attribute Attack and Growth]<br1>
When you attack monsters, damage increases depending on attribute.<br1>
But when you attack monsters by attribute, damage changes according to the monsters' attribute growth.<br>
With <font color="LEVEL">Growth Effect</font>, a strong attribute gives 20% more damage, while a weak attribute can give no more than 60% damage.<br>
<font color="LEVEL">Relative Growth</font> refers to relativity between attributes, where water is strong than fire and fire is stronger than wind. Also, wind is stronger than earth and earth is stronger than water.<br1>
The attributes ae relatively linked, so you must not be careless with any one attribute.<br>
<font color="LEVEL">[Attribute Defense]</font><br1>
If you're attacked with an attribute, your attribute defense withstands the attack.<br1>
In this situation, it is important to know who has the higher attribute P. Def.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Svein:<br>
To grow spirits, defeat attribute monsters to acquire XP of the dominating attribute.<br>
Where are attribute monsters, you ask?<br1>
<font color="LEVEL">Wind Attack Hunting Ground:</font> Wind Plateau<br1>
<font color="LEVEL">Earth Attack Hunting Ground:</font> Wall of Argos<br1>
<font color="LEVEL">Water Attack Hunting Ground:</font> Garden of Eva<br1>
<font color="LEVEL">Fire Attack Hunting Ground:</font> Fore of the Gods<br>
And the spirits you can grow at each hunting ground vary, so keep that in mind when selecting.<br1>
<fond color="LEVEL">Wind Attack Hunting Ground:</fond> Obtained Fire Attack XP<br1>
<fond color="LEVEL">Earth Attack Hunting Ground:</fond> Obtained Wind Attack XP<br1>
<fond color="LEVEL">Water Attack Hunting Ground:</fond> Obtained Earth Attack XP<br1>
<fond color="LEVEL">Fire Attack Hunting Ground:</fond> Obtained Water Attack XP<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,9 @@
<html><body>Svein:<br>
The spirits have 4 main types of strength.<br1>
<font color="LEVEL">Attribute Attack Strength:</font> Increases damage when attacking with spirits' strength<br1>
<font color="LEVEL">Attribute Defense Strength:</font> Decrease damage received by spirits' strength.<br1>
<font color="LEVEL">Attribute Critical Hit Effect:</font> Increases critical hit effect of attribute.<br1>
<font color="LEVEL">Attribute Critical Power:</font> Increases amount of attack strength during critical hit<br>
Spirits' strength increases when they level up or are invested with attributes.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,6 @@
<html><body>Svein:<br>
<font color="LEVEL">Characteristics</font> are skill types that raise spirits' strength. Each time a spirit levels up, it gains <font color="LEVEL">Characteristic Points</font> and its strength increases when the Characteristic Points are added to each ability.<br>
When you evolve spirits, the highest possible level for the Characteristic increases, so evolution is essential.<br>
It is possible to reset at any time, so do not worry and add Characteristics however you see fit.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Svein:<br>
Each Spirit can grow up to 10 levels.<br>
Also, it is possible to evolve spirits that have completed growth.<br>
When spirits evolve, they increase strength an return to level 1, allowing them to grow them to Level 10 again.<br>
Don't forget that you need an <font color="LEVEL">Evolution Stone</font> to evolve Spirits.<br>
<font color="LEVEL">(To evolve Spirits must reach Level 10 at 100%, so they require the ingredients for evoution from the Evolution Stone.)</font> <br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,5 @@
<html><body>Svein:<br>
When hunting at the Attribute Hunting Ground, you can acquire a <font color="LEVEL">Spirit Rough Jewel.</font><br>
A Spirits Rough Jewel is the power of a spirit that is hardened like stone. It is possible for spirits to drain this strength and grow. If you acquire a Spirits Rough Jewel, try using it with your spirits. You can give them the Spirits Rough Jewel to the Spirits by clicking the Absorb tab in teh Manage Spirits window.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,9 @@
<html><body>Svein:<br>
You can extract strength from the spirits you have grown.<br>
The extracted spirits' strength glitters like stars and is called <font color="LEVEL">Attribute Fragment.</font><br1>
You can extract Fire Attribute Fragment from fire spirits and Wind Attribute Fragment from wind spirits.<br>
You can extract Attribute Fragment by clicking the Extract button in the Manage Spirits window and paying the fee.<br>
It is possible to enhance various items with Attribute Fragment. If you are interested, plesse como to see me.<br>
<font color="LEVEL">(A spirit whose Attribute Fragment has been extracted returns to Level 1 of its classification, Please keep this in mind when extracting.)</font><br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Svein:<br>
It is possible to change attributes by clicking the Attributes button in the Character Information window.<br1>
P. Atk. attribute is given by selected spirits.<br1>
Do not change attributes too frequently. Spirits also need to be ready to give strength.<br1>
<font color="LEVEL">(There is a delay time by schedule for Change Attribute.)</font><br>
When attacked by an attribute monster, you attribute defense will kick in, so do not worry.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -1,11 +1,11 @@
<html><body>Svein:<br><br>
Have you heard of <font color="LEVEL">Spirits</font>?<br1>
Honestly, there are not many people who actually know about them.<br1>
Not all Spirits are hostile, as the common opinion goes. Moreover, there are those among them who would like to befriend a mighty warrior, like yourself.
I can tell you more if you want.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500000">Use Attribute Fragment</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500001">Ask about Attribute Spirits</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500002">Ask about Spirit Agathions</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500003">Ask about Spirit Necklaces</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500004">Ask about materials for Spirits</Button>
<html><body>Svein:<br>
Adventurer, have you heard of <font color="LEVEL">Spirits</font>?<br1>
There are few who know of the spirits.<br1>
Not all Spirits are hostile, as many believe. There are those who wish to befriend mortals. If you're interested, I can also Help you.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500002">Use fragments of each attribute.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AttributeMaster learn">Ask to be introduced to Spirits.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500001">Ask about Spirit Agathions.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500000">Ask about Spirit Necklaces.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500003">Ask about materials for Spirits.</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Ask about Spirits.</Button>
</body></html>

View File

@ -1,122 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<list applyTaxes="false" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
<list applyTaxes="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
<npcs>
<npc>34053</npc> <!-- Attribute Master Svein -->
</npcs>
<item>
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91039" count="500" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 -->
</item>
<item>
<ingredient id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 -->
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91039" count="600" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 -->
</item>
<item>
<ingredient id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 -->
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91039" count="800" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 -->
</item>
<item>
<ingredient id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 -->
<ingredient id="91039" count="300" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91039" count="900" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 -->
</item>
<item>
<ingredient id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 -->
<ingredient id="91039" count="400" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91039" count="1200" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91117" count="1" /> <!-- Nebula Necklace -->
</item>
<item>
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91040" count="500" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 -->
</item>
<item>
<ingredient id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 -->
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91040" count="600" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 -->
</item>
<item>
<ingredient id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 -->
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91040" count="800" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 -->
</item>
<item>
<ingredient id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 -->
<ingredient id="91040" count="300" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91040" count="900" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 -->
</item>
<item>
<ingredient id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 -->
<ingredient id="91040" count="400" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91040" count="1200" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91119" count="1" /> <!-- Ignis Necklace -->
</item>
<item>
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91041" count="500" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 -->
</item>
<item>
<ingredient id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 -->
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91041" count="600" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 -->
</item>
<item>
<ingredient id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 -->
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91041" count="800" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 -->
</item>
<item>
<ingredient id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 -->
<ingredient id="91041" count="300" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91041" count="900" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="40000" /> <!-- Adena -->
<production id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 -->
</item>
<item>
<ingredient id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 -->
<ingredient id="91041" count="400" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91041" count="1200" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91121" count="1" /> <!-- Procellas Necklace -->
</item>
<item>
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91042" count="500" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 -->
</item>
<item>
<ingredient id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 -->
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91042" count="600" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 -->
</item>
<item>
<ingredient id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 -->
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91042" count="800" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 -->
</item>
<item>
<ingredient id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 -->
<ingredient id="91042" count="300" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91042" count="900" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 -->
</item>
<item>
<ingredient id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 -->
<ingredient id="91042" count="400" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena -->
<ingredient id="91042" count="1200" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91123" count="1" /> <!-- Petrams Necklace -->
</item>
</list>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<list applyTaxes="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
<npcs>
<npc>34053</npc> <!-- Attribute Master Svein -->
</npcs>
<item>
<ingredient id="91125" count="500" /> <!-- Ignis' Breath -->
<ingredient id="57" count="2000000" /> <!-- Adena -->
<production id="91129" count="1" /> <!-- Agathion Ignis -->
</item>
<item>
<ingredient id="91126" count="1" /> <!-- Nebulas Breath-->
<ingredient id="57" count="2000000" /> <!-- Adena -->
<production id="91130" count="1" /> <!-- Agathion Nebula -->
</item>
<item>
<ingredient id="91127" count="1" /> <!-- Procellas Breath-->
<ingredient id="57" count="2000000" /> <!-- Adena -->
<production id="91131" count="1" /> <!-- Agathion Procella -->
</item>
<item>
<ingredient id="91128" count="1" /> <!-- Petrams Breath-->
<ingredient id="57" count="2000000" /> <!-- Adena -->
<production id="91132" count="1" /> <!-- Agathion Petram -->
</item>
</list>

View File

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<list applyTaxes="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
<npcs>
<npc>34053</npc> <!-- Attribute Master Svein -->
</npcs>
<item>
<ingredient id="91040" count="7000" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="5000000" /> <!-- Adena -->
<production id="8618" count="1" /> <!-- Ancient Book: Divine Inspiration (Modern Language Version) -->
</item>
<item>
<ingredient id="91039" count="7000" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="5000000" /> <!-- Adena -->
<production id="8618" count="1" /> <!-- Ancient Book: Divine Inspiration (Modern Language Version) -->
</item>
<item>
<ingredient id="91041" count="7000" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="5000000" /> <!-- Adena -->
<production id="8618" count="1" /> <!-- Ancient Book: Divine Inspiration (Modern Language Version) -->
</item>
<item>
<ingredient id="91042" count="7000" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="5000000" /> <!-- Adena -->
<production id="8618" count="1" /> <!-- Ancient Book: Divine Inspiration (Modern Language Version) -->
</item>
<item>
<ingredient id="91040" count="10000" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="10000000" /> <!-- Adena -->
<production id="8619" count="1" /> <!-- Ancient Book: Divine Inspiration (Original Language Version) -->
</item>
<item>
<ingredient id="91039" count="10000" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="10000000" /> <!-- Adena -->
<production id="8619" count="1" /> <!-- Ancient Book: Divine Inspiration (Original Language Version) -->
</item>
<item>
<ingredient id="91041" count="10000" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="10000000" /> <!-- Adena -->
<production id="8619" count="1" /> <!-- Ancient Book: Divine Inspiration (Original Language Version) -->
</item>
<item>
<ingredient id="91042" count="10000" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="10000000" /> <!-- Adena -->
<production id="8619" count="1" /> <!-- Ancient Book: Divine Inspiration (Original Language Version) -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="250000" /> <!-- Adena -->
<production id="91188" count="1" /> <!-- Blessed Spirit's Varnish -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="250000" /> <!-- Adena -->
<production id="91188" count="1" /> <!-- Blessed Spirit's Varnish -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="250000" /> <!-- Adena -->
<production id="91188" count="1" /> <!-- Blessed Spirit's Varnish -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="250000" /> <!-- Adena -->
<production id="91188" count="1" /> <!-- Blessed Spirit's Varnish -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="30000" /> <!-- Adena -->
<production id="91189" count="5" /> <!-- Fire Attribute Attack Potion -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="30000" /> <!-- Adena -->
<production id="91190" count="5" /> <!-- Water Attribute Attack Potion -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="30000" /> <!-- Adena -->
<production id="91191" count="5" /> <!-- Wind Attribute Attack Potion -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="30000" /> <!-- Adena -->
<production id="91192" count="5" /> <!-- Earth Attribute Attack Potion -->
</item>
<item>
<ingredient id="91040" count="20" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="90045" count="1" /> <!-- Magical Tablet -->
</item>
<item>
<ingredient id="91039" count="20" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="90045" count="1" /> <!-- Magical Tablet -->
</item>
<item>
<ingredient id="91041" count="20" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="90045" count="1" /> <!-- Magical Tablet -->
</item>
<item>
<ingredient id="91042" count="20" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="200000" /> <!-- Adena -->
<production id="90045" count="1" /> <!-- Magical Tablet -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<production id="91187" count="2" /> <!-- Spirit's Varnish-->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<production id="91187" count="2" /> <!-- Spirit's Varnish-->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<production id="91187" count="2" /> <!-- Spirit's Varnish-->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<production id="91187" count="2" /> <!-- Spirit's Varnish-->
</item>
</list>

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8"?>
<list applyTaxes="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
<npcs>
<npc>34053</npc> <!-- Attribute Master Svein -->
</npcs>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<production id="91186" count="1" /> <!-- Advanced Spirit's Blessing -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<production id="91186" count="1" /> <!-- Advanced Spirit's Blessing -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<production id="91186" count="1" /> <!-- Advanced Spirit's Blessing -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<production id="91186" count="1" /> <!-- Advanced Spirit's Blessing -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91038" count="5" /> <!-- Earth Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91038" count="5" /> <!-- Earth Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91038" count="5" /> <!-- Earth Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91038" count="5" /> <!-- Earth Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91036" count="5" /> <!-- Fire Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91036" count="5" /> <!-- Fire Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91036" count="5" /> <!-- Fire Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91036" count="5" /> <!-- Fire Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91037" count="5" /> <!-- Wind Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91037" count="5" /> <!-- Wind Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91037" count="5" /> <!-- Wind Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91037" count="5" /> <!-- Wind Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91035" count="5" /> <!-- Water Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91035" count="5" /> <!-- Water Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91035" count="5" /> <!-- Water Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="50000" /> <!-- Adena -->
<production id="91035" count="5" /> <!-- Water Spirit Rough Jewel -->
</item>
<item>
<ingredient id="91040" count="1" /> <!-- Fire Attribute Fragment -->
<production id="91185" count="3" /> <!-- Intermediate Spirit's Blessing -->
</item>
<item>
<ingredient id="91039" count="1" /> <!-- Water Attribute Fragment -->
<production id="91185" count="3" /> <!-- Intermediate Spirit's Blessing -->
</item>
<item>
<ingredient id="91041" count="1" /> <!-- Wind Attribute Fragment -->
<production id="91185" count="3" /> <!-- Intermediate Spirit's Blessing -->
</item>
<item>
<ingredient id="91042" count="1" /> <!-- Earth Attribute Fragment -->
<production id="91185" count="3" /> <!-- Intermediate Spirit's Blessing -->
</item>
</list>

View File

@ -0,0 +1,87 @@
/*
* 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.others.AttributeMaster;
import java.util.Arrays;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnElementalSpiritLearn;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
import ai.AbstractNpcAI;
/**
* @author JoeAlisson
*/
public class AttributeMaster extends AbstractNpcAI
{
private static final int SVEIN = 34053;
private AttributeMaster()
{
addStartNpc(SVEIN);
addTalkId(SVEIN);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
if ("learn".equalsIgnoreCase(event))
{
if ((player.getLevel() < 76) || (player.getClassId().level() < 3))
{
return "no-3rdClass.htm";
}
if (player.getSpirits() == null)
{
player.initElementalSpirits();
}
if (Arrays.stream(player.getSpirits()).allMatch(elementalSpirit -> elementalSpirit.getStage() > 0))
{
return "already.htm";
}
for (ElementalSpirit spirit : player.getSpirits())
{
if (spirit.getStage() == 0)
{
spirit.upgrade();
}
}
UserInfo userInfo = new UserInfo(player);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
player.sendPacket(userInfo);
player.sendPacket(new ElementalSpiritInfo(player, player.getActiveElementalSpiritType(), (byte) 0x01));
EventDispatcher.getInstance().notifyEventAsync(new OnElementalSpiritLearn(player), player);
return "learn.htm";
}
return null;
}
public static AbstractNpcAI provider()
{
return new AttributeMaster();
}
}

View File

@ -0,0 +1,5 @@
<html><body>Svein:<br>
You Already know about spirits!<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">I want to Learn more about spirits</Button>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Svein:<br>
You seem to be ready to accept the power spirits!<br1>
I'll introduce the spirits to you...<br1>
From now on you can use power of the spirits.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">I want to Learn more about spirits</Button>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
</body></html>

View File

@ -0,0 +1,7 @@
<html><body>Svein:<br>
You are not ready to accept the power spirits,<br>
I must only give spirits to those who can rule over their power.<br>
If not, they will be overpowered by the spirits.<br>
<font color="LEVEL">(Only 3rd Class Characters may receive the Spirits).<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
</body></html>

View File

@ -29,6 +29,7 @@ import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
import handlers.dailymissionhandlers.SpiritDailyMissionHandler;
/**
* @author UnAfraid
@ -48,6 +49,7 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("spirit", SpiritDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
}
}

View File

@ -130,6 +130,8 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("DispelBySlotProbability", DispelBySlotProbability::new);
EffectHandler.getInstance().registerHandler("DoubleCast", DoubleCast::new);
EffectHandler.getInstance().registerHandler("DuelistFury", DuelistFury::new);
EffectHandler.getInstance().registerHandler("ElementalSpiritAttack", ElementalSpiritAttack::new);
EffectHandler.getInstance().registerHandler("ElementalSpiritDefense", ElementalSpiritDefense::new);
EffectHandler.getInstance().registerHandler("EnableCloak", EnableCloak::new);
EffectHandler.getInstance().registerHandler("EnergyAttack", EnergyAttack::new);
EffectHandler.getInstance().registerHandler("EnlargeAbnormalSlot", EnlargeAbnormalSlot::new);
@ -309,6 +311,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Sow", Sow::new);
EffectHandler.getInstance().registerHandler("Speed", Speed::new);
EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new);
EffectHandler.getInstance().registerHandler("SpiritXpModify", SpiritExpModify::new);
EffectHandler.getInstance().registerHandler("SpModify", SpModify::new);
EffectHandler.getInstance().registerHandler("Spoil", Spoil::new);
EffectHandler.getInstance().registerHandler("StatBonusSkillCritical", StatBonusSkillCritical::new);

View File

@ -0,0 +1,100 @@
/*
* 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 handlers.dailymissionhandlers;
import java.util.function.Consumer;
import org.l2jmobius.gameserver.enums.DailyMissionStatus;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.OnElementalSpiritUpgrade;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnElementalSpiritLearn;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
/**
* @author JoeAlisson
*/
public class SpiritDailyMissionHandler extends AbstractDailyMissionHandler
{
private final int _amount;
private final ElementalType _type;
public SpiritDailyMissionHandler(DailyMissionDataHolder holder)
{
super(holder);
_type = getHolder().getParams().getEnum("element", ElementalType.class, ElementalType.NONE);
_amount = holder.getRequiredCompletions();
}
@Override
public void init()
{
final MissionKind kind = getHolder().getParams().getEnum("kind", MissionKind.class, null);
if (MissionKind.EVOLVE == kind)
{
Containers.Players().addListener(new ConsumerEventListener(this, EventType.ON_ELEMENTAL_SPIRIT_UPGRADE, (Consumer<OnElementalSpiritUpgrade>) this::onElementalSpiritUpgrade, this));
}
else if (MissionKind.LEARN == kind)
{
Containers.Players().addListener(new ConsumerEventListener(this, EventType.ON_ELEMENTAL_SPIRIT_LEARN, (Consumer<OnElementalSpiritLearn>) this::onElementalSpiritLearn, this));
}
}
@Override
public boolean isAvailable(PlayerInstance player)
{
final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), false);
return (entry != null) && (entry.getStatus() == DailyMissionStatus.AVAILABLE);
}
private void onElementalSpiritLearn(OnElementalSpiritLearn event)
{
final DailyMissionPlayerEntry missionData = getPlayerEntry(event.getPlayer().getObjectId(), true);
missionData.setProgress(1);
missionData.setStatus(DailyMissionStatus.AVAILABLE);
storePlayerEntry(missionData);
}
private void onElementalSpiritUpgrade(OnElementalSpiritUpgrade event)
{
final ElementalSpirit spirit = event.getSpirit();
if (ElementalType.of(spirit.getType()) != _type)
{
return;
}
final DailyMissionPlayerEntry missionData = getPlayerEntry(event.getPlayer().getObjectId(), true);
missionData.setProgress(spirit.getStage());
if (missionData.getProgress() >= _amount)
{
missionData.setStatus(DailyMissionStatus.AVAILABLE);
}
storePlayerEntry(missionData);
}
private enum MissionKind
{
LEARN,
EVOLVE
}
}

View File

@ -0,0 +1,31 @@
/*
* 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 handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.StatsSet;
/**
* @author JoeAlisson
*/
public class ElementalSpiritAttack extends AbstractStatEffect
{
public ElementalSpiritAttack(StatsSet params)
{
super(params, params.getEnum("type", ElementalType.class).getAttackStat());
}
}

View File

@ -0,0 +1,31 @@
/*
* 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 handlers.effecthandlers;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.StatsSet;
/**
* @author JoeAlisson
*/
public class ElementalSpiritDefense extends AbstractStatEffect
{
public ElementalSpiritDefense(StatsSet params)
{
super(params, params.getEnum("type", ElementalType.class).getDefenseStat());
}
}

View File

@ -97,7 +97,7 @@ public final class HealPercent extends AbstractEffect
{
final double damage = -amount;
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false);
effector.sendDamageMessage(effected, skill, (int) damage, false, false);
effector.sendDamageMessage(effected, skill, (int) damage, 0, false, false);
}
}
}

View File

@ -102,7 +102,7 @@ public final class Hp extends AbstractEffect
{
final double damage = -amount;
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false);
effector.sendDamageMessage(effected, skill, (int) damage, false, false);
effector.sendDamageMessage(effected, skill, (int) damage, 0, false, false);
}
}
}

View File

@ -53,7 +53,7 @@ public class RealDamage extends AbstractEffect
effected.reduceCurrentHp(_power, effector, skill, false, false, false, false);
if (effector.isPlayer())
{
effector.sendDamageMessage(effected, skill, (int) _power, false, false);
effector.sendDamageMessage(effected, skill, (int) _power, 0, false, false);
}
}
}

View File

@ -0,0 +1,31 @@
/*
* 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 handlers.effecthandlers;
import org.l2jmobius.gameserver.model.StatsSet;
import org.l2jmobius.gameserver.model.stats.Stats;
/**
* @author JoeAlisson
*/
public class SpiritExpModify extends AbstractStatEffect
{
public SpiritExpModify(StatsSet params)
{
super(params, Stats.ELEMENTAL_SPIRIT_BONUS_EXP);
}
}

View File

@ -136,6 +136,7 @@
<npc id="31688" x="147688" y="28527" z="-2264" heading="38406" respawnTime="60sec"/>
<npc id="31690" x="147648" y="28599" z="-2264" heading="40508" respawnTime="60sec"/>
<npc id="35233" x="147464" y="1532" z="-468" heading="16383" respawnTime="60sec"/>
<npc id="34053" x="147626" y="27368" z="-2206" heading="49449" respawnTime="60sec" /> <!-- Svein -->
<npc id="30767" x="148009" y="28603" z="-2264" heading="52880" respawnTime="60sec" > <!-- Auctioneer -->
<parameters>
<param name="fnAgitMap" value="aden"/>

View File

@ -107,6 +107,7 @@
<npc id="35458" x="81264" y="151728" z="-3528" heading="0" respawnTime="60sec" />
<npc id="35459" x="81920" y="151968" z="-3512" heading="0" respawnTime="60sec" />
<npc id="35460" x="81808" y="151776" z="-3528" heading="32000" respawnTime="60sec" />
<npc id="34053" x="81749" y="147485" z="-3471" heading="16500" respawnTime="60sec" /> <!-- Svein -->
</group>
</spawn>
</list>

View File

@ -3428,7 +3428,7 @@
</spoil>
</dropLists>
</npc>
<npc id="20792" level="79" type="Monster" name="Coral">
<npc id="20792" level="76" type="Monster" name="Coral" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="70" />
<param name="MoveAroundSocial1" value="90" />
@ -3445,7 +3445,7 @@
<race>BEAST</race>
<sex>MALE</sex>
<equipment rhand="192" /> <!-- Monster Only (Parhit Staff) -->
<acquire exp="40965" sp="1106" />
<acquire exp="80991" sp="2429" attribute_exp="684"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<attack physical="182.671236" magical="113.4007" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
@ -3560,7 +3560,7 @@
</spoil>
</dropLists>
</npc>
<npc id="20794" level="78" type="Monster" name="Stakato">
<npc id="20794" level="76" type="Monster" name="Stakato" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -3575,7 +3575,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="223" /> <!-- Kukuri -->
<acquire exp="22942" sp="688" />
<acquire exp="46335" sp="1390" attribute_exp="684" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<attack physical="469.5384" magical="416.6452173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3609,7 +3609,7 @@
<height normal="36" />
</collision>
</npc>
<npc id="20795" level="80" type="Monster" name="Stakato Worker">
<npc id="20795" level="77" type="Monster" name="Stakato Worker" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="70" />
<param name="MoveAroundSocial1" value="70" />
@ -3624,7 +3624,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="226" /> <!-- Cursed Dagger -->
<acquire exp="25632" sp="692" />
<acquire exp="50337" sp="1510" attribute_exp="770"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3657,7 +3657,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="20796" level="80" type="Monster" name="Stakato Warrior">
<npc id="20796" level="77" type="Monster" name="Stakato Warrior" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -3672,7 +3672,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="232" /> <!-- Dark Elven Dagger -->
<acquire exp="26400" sp="712" />
<acquire exp="88472" sp="2654" attribute_exp="770" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3705,7 +3705,7 @@
<height normal="38" />
</collision>
</npc>
<npc id="20797" level="81" type="Monster" name="Stakato Drone">
<npc id="20797" level="78" type="Monster" name="Stakato Drone" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="62" />
<param name="MoveAroundSocial1" value="62" />
@ -3726,7 +3726,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="74" /> <!-- Katana -->
<acquire exp="29032" sp="783" />
<acquire exp="91880" sp="2756" attribute_exp="858"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="488.6718" magical="433.67086956522" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3764,7 +3764,7 @@
<height normal="39" />
</collision>
</npc>
<npc id="20798" level="81" type="Monster" name="Water Giant">
<npc id="20798" level="78" type="Monster" name="Water Giant" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3779,7 +3779,7 @@
<race>GIANT</race>
<sex>MALE</sex>
<equipment rhand="5132" /> <!-- Monster Only (Giant Trident) -->
<acquire exp="48971" sp="1322" />
<acquire exp="93340" sp="2800" attribute_exp="858"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="488.7117" magical="433.70804347826" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3813,7 +3813,7 @@
<height normal="44" />
</collision>
</npc>
<npc id="20799" level="82" type="Monster" name="Queen Lad">
<npc id="20799" level="79" type="Monster" name="Queen Lad" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3829,7 +3829,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>FEMALE</sex>
<acquire exp="46819" sp="1264" />
<acquire exp="96610" sp="2898" attribute_exp="948"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
<npc id="20800" level="82" type="Monster" name="Eva's Watchman">
<npc id="20800" level="79" type="Monster" name="Eva's Watchman" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="40" />
<param name="MoveAroundSocial1" value="40" />
@ -14,7 +14,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="303682" sp="9110" />
<acquire exp="131997" sp="3959" attribute_exp="948" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="808.61705" magical="731.48967391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -45,7 +45,7 @@
<height normal="30" />
</collision>
</npc>
<npc id="20801" level="82" type="Monster" name="Piker">
<npc id="20801" level="80" type="Monster" name="Piker" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -62,7 +62,7 @@
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="302" /> <!-- Body Slasher -->
<acquire exp="384780" sp="10389" />
<acquire exp="136896" sp="4106" attribute_exp="1040"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2827.269335" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<attack physical="939.4691" magical="853.40152173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -96,7 +96,7 @@
<height normal="34.8" />
</collision>
</npc>
<npc id="20802" level="82" type="Monster" name="Mage">
<npc id="20802" level="80" type="Monster" name="Mage" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -115,7 +115,7 @@
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="192" /> <!-- Crystal Staff -->
<acquire exp="370425" sp="10001" />
<acquire exp="168844" sp="5065" attribute_exp="1040" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="4120.56" mpRegen="3" />
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -152,7 +152,7 @@
<height normal="32.5" />
</collision>
</npc>
<npc id="20803" level="83" type="Monster" name="Doll Master">
<npc id="20803" level="82" type="Monster" name="Doll Master" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -168,7 +168,7 @@
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<acquire exp="391426" sp="10568" />
<acquire exp="190141" sp="5704" attribute_exp="1230" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3386,7 +3386,7 @@
</spoil>
</dropLists>
</npc>
<npc id="20849" level="83" type="Monster" name="Light Worm">
<npc id="20849" level="83" type="Monster" name="Light Worm" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3400,7 +3400,7 @@
</parameters>
<race>ANIMAL</race>
<sex>MALE</sex>
<acquire exp="303419" sp="8192" />
<acquire exp="141914" sp="4257" attribute_exp="1134" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />

View File

@ -5126,7 +5126,7 @@
<height normal="28" />
</collision>
</npc>
<npc id="20994" level="83" type="Monster" name="Garden Guard Captain">
<npc id="20994" level="82" type="Monster" name="Garden Guard Captain" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -5145,7 +5145,7 @@
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<acquire exp="364541" sp="9842" />
<acquire exp="187075" sp="5612" attribute_exp="1230" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -5180,7 +5180,7 @@
<height normal="34.05" />
</collision>
</npc>
<npc id="20995" level="82" type="Monster" name="Garden Guard">
<npc id="20995" level="81" type="Monster" name="Garden Guard" element="WATER">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -5194,8 +5194,10 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="100658" sp="3019" attribute_exp="1134"/>
<equipment rhand="94" /> <!-- Bec de Corbin -->
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
<defence physical="2103.00075" magical="3505.00125" />
<speed>

View File

@ -3637,7 +3637,7 @@
</spoil>
</dropLists>
</npc>
<npc id="21661" level="82" type="Monster" name="Scarlet Worker">
<npc id="21661" level="79" type="Monster" name="Scarlet Worker" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" />
@ -3645,7 +3645,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="235" /> <!-- Bloody Orchid -->
<acquire exp="285232" sp="8556" />
<acquire exp="124807" sp="3744" attribute_exp="948"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2423.3825125" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="808.61705" magical="731.48967391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3679,7 +3679,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21662" level="82" type="Monster" name="Scarlet Soldier">
<npc id="21662" level="79" type="Monster" name="Scarlet Soldier" element="FIRE">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -3694,7 +3694,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="148" /> <!-- Sword of Valhalla -->
<acquire exp="352209" sp="10566" />
<acquire exp="127803" sp="3834" attribute_exp="948" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3733,7 +3733,7 @@
<height normal="38" />
</collision>
</npc>
<npc id="21663" level="82" type="Monster" name="Scarlet Noble">
<npc id="21663" level="79" type="Monster" name="Scarlet Noble" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" />
@ -3742,7 +3742,7 @@
<race>HUMANOID</race>
<sex>MALE</sex>
<equipment rhand="235" /> <!-- Bloody Orchid -->
<acquire exp="351362" sp="9486" />
<acquire exp="163526" sp="4905" attribute_exp="948"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3776,14 +3776,14 @@
<height normal="39" />
</collision>
</npc>
<npc id="21664" level="82" type="Monster" name="Tepra Scorpion">
<npc id="21664" level="80" type="Monster" name="Tepra Scorpion" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" />
</parameters>
<race>BUG</race>
<sex>MALE</sex>
<acquire exp="366236" sp="9888" />
<acquire exp="168076" sp="5042" attribute_exp="1040" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<attack physical="965.63552" magical="877.78017391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3817,14 +3817,14 @@
<height normal="52.8" />
</collision>
</npc>
<npc id="21665" level="82" type="Monster" name="Tepra Scarab">
<npc id="21665" level="80" type="Monster" name="Tepra Scarab" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" />
</parameters>
<race>BUG</race>
<sex>MALE</sex>
<acquire exp="372072" sp="10045" />
<acquire exp="172838" sp="5185" attribute_exp="1040" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<attack physical="965.63552" magical="877.78017391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3858,7 +3858,7 @@
<height normal="22" />
</collision>
</npc>
<npc id="21666" level="82" type="Monster" name="Assassin Beetle">
<npc id="21666" level="80" type="Monster" name="Assassin Beetle" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" />
@ -3866,7 +3866,7 @@
</parameters>
<race>BUG</race>
<sex>MALE</sex>
<acquire exp="387793" sp="10470" />
<acquire exp="206169" sp="6185" attribute_exp="1040"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2827.269335" hpRegen="8.5" mp="3753.285" mpRegen="3" />
<attack physical="939.4691" magical="853.40152173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3900,7 +3900,7 @@
<height normal="54.5" />
</collision>
</npc>
<npc id="21667" level="83" type="Monster" name="Mercenary of Destruction">
<npc id="21667" level="81" type="Monster" name="Mercenary of Destruction" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" />
@ -3909,7 +3909,7 @@
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="70" /> <!-- Homunkulus' Sword -->
<acquire exp="303033" sp="8181" />
<acquire exp="178288" sp="5348" attribute_exp="1134" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3943,7 +3943,7 @@
<height normal="30.6" />
</collision>
</npc>
<npc id="21668" level="83" type="Monster" name="Knight of Destruction">
<npc id="21668" level="81" type="Monster" name="Knight of Destruction" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" />
@ -3951,7 +3951,7 @@
<race>UNDEAD</race>
<sex>MALE</sex>
<equipment rhand="946" lhand="945" /> <!-- Skeleton Dagger / Skeleton Buckler -->
<acquire exp="375994" sp="10151" />
<acquire exp="181044" sp="5431" attribute_exp="1134"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3063.234315" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<attack physical="1016.2039" magical="924.62673913043" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -3985,10 +3985,10 @@
<height normal="34.8" />
</collision>
</npc>
<npc id="21669" level="83" type="Monster" name="Evil Spirit Wizard of Destruction">
<npc id="21669" level="81" type="Monster" name="Evil Spirit Wizard of Destruction" element="FIRE">
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="313883" sp="8474" />
<acquire exp="172383" sp="5171" attribute_exp="1134" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.5997675" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4013,7 +4013,7 @@
<skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
</skillList>
</npc>
<npc id="21670" level="83" type="Monster" name="Lavastone Golem">
<npc id="21670" level="82" type="Monster" name="Lavastone Golem" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4591" level="9" />
@ -4021,7 +4021,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="384867" sp="10391" />
<acquire exp="222900" sp="6687" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4055,7 +4055,7 @@
<height normal="31" />
</collision>
</npc>
<npc id="21671" level="83" type="Monster" name="Magma Golem">
<npc id="21671" level="82" type="Monster" name="Magma Golem" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4157" level="9" />
@ -4063,7 +4063,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="400636" sp="10817" />
<acquire exp="227862" sp="6835" attribute_exp="1230" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2859.043325" hpRegen="8.5" mp="3166.53" mpRegen="3" />
<attack physical="950.0497" magical="862.99239130435" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4097,7 +4097,7 @@
<height normal="45" />
</collision>
</npc>
<npc id="21672" level="83" type="Monster" name="Arimanes of Destruction">
<npc id="21672" level="82" type="Monster" name="Arimanes of Destruction" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4589" level="9" />
@ -4105,7 +4105,7 @@
<race>DEMONIC</race>
<sex>MALE</sex>
<equipment rhand="6722" /> <!-- Monster Only (Ahrimanes) -->
<acquire exp="399045" sp="10774" />
<acquire exp="222497" sp="6674" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2859.043325" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<attack physical="950.0497" magical="862.99239130435" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4142,14 +4142,14 @@
<height normal="57.75" grown="69" />
</collision>
</npc>
<npc id="21673" level="78" type="Monster" name="Ivlis of Immortality">
<npc id="21673" level="76" type="Monster" name="Ivlis of Immortality" element="FIRE">
<parameters>
<param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4599" level="9" />
</parameters>
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="21409" sp="642" />
<acquire exp="40651" sp="1219" attribute_exp="684" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<attack physical="469.5384" magical="416.6452173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4186,10 +4186,10 @@
<height normal="55" />
</collision>
</npc>
<npc id="21674" level="79" type="Monster" name="Balor of Immortality">
<npc id="21674" level="76" type="Monster" name="Balor of Immortality" element="FIRE">
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="23085" sp="623" />
<acquire exp="79188" sp="2375" attribute_exp="684"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<attack physical="476.129" magical="422.51869565217" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4213,10 +4213,10 @@
<skill id="4413" level="7" /> <!-- Weak M. Def. -->
</skillList>
</npc>
<npc id="21675" level="80" type="Monster" name="Ashuras of Immortality">
<npc id="21675" level="76" type="Monster" name="Ashuras of Immortality" element="FIRE">
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="43737" sp="1180" />
<acquire exp="82030" sp="2460" attribute_exp="684"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="482.5999" magical="428.28065217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4241,10 +4241,10 @@
<skill id="4413" level="8" /> <!-- Weak M. Def. -->
</skillList>
</npc>
<npc id="21676" level="80" type="Monster" name="Lavasillisk">
<npc id="21676" level="77" type="Monster" name="Lavasillisk" element="FIRE">
<race>BEAST</race>
<sex>MALE</sex>
<acquire exp="25440" sp="686" />
<acquire exp="52115" sp="1563" attribute_exp="770"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4287,10 +4287,10 @@
<height normal="55" />
</collision>
</npc>
<npc id="21678" level="81" type="Monster" name="Magma Drake">
<npc id="21678" level="77" type="Monster" name="Magma Drake" element="FIRE">
<race>DRAGON</race>
<sex>MALE</sex>
<acquire exp="27733" sp="748" />
<acquire exp="50479" sp="1514" attribute_exp="770"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="488.6718" magical="433.67086956522" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4451,10 +4451,10 @@
<skill id="4412" level="17" /> <!-- Very Strong P. Def. -->
</skillList>
</npc>
<npc id="21685" level="81" type="Monster" name="Ashuras of Immortality">
<npc id="21685" level="78" type="Monster" name="Ashuras of Immortality" element="FIRE">
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="48262" sp="1303" />
<acquire exp="94946" sp="2848" attribute_exp="858"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="482.5999" magical="428.28065217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -4479,10 +4479,10 @@
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
</skillList>
</npc>
<npc id="21686" level="82" type="Monster" name="Flaming Drake">
<npc id="21686" level="78" type="Monster" name="Flaming Drake" element="FIRE">
<race>DRAGON</race>
<sex>MALE</sex>
<acquire exp="51842" sp="1399" />
<acquire exp="95603" sp="2868" attribute_exp="858"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />

View File

@ -2505,10 +2505,10 @@
<height normal="36" />
</collision>
</npc>
<npc id="21761" level="82" type="Monster" name="Salamander" title="Elite">
<npc id="21761" level="76" type="Monster" name="Salamander" title="Elite" element="FIRE">
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="133236" sp="3597" />
<acquire exp="240547" sp="7216" attribute_exp="684" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -2537,10 +2537,10 @@
</drop>
</dropLists>
</npc>
<npc id="21762" level="83" type="Monster" name="Lava" title="Elite">
<npc id="21762" level="79" type="Monster" name="Lava" title="Elite" element="FIRE">
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="687418" sp="18560" />
<acquire exp="374272" sp="11228" attribute_exp="948" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.6202933333" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<attack physical="817.728" magical="739.71130434783" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -2570,10 +2570,10 @@
</drop>
</dropLists>
</npc>
<npc id="21763" level="83" type="Monster" name="Firen" title="Master">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<npc id="21763" level="82" type="Monster" name="Firen" title="Master" element="FIRE">
<race>ELEMENTAL</race>
<sex>FEMALE</sex>
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed>
@ -2603,10 +2603,9 @@
</drop>
</dropLists>
</npc>
<npc id="21764" level="82" type="Monster" name="Growler" title="Elite">
<!-- Classic Seven Sings -->
<npc id="21764" level="76" type="Monster" name="Growler" title="Elite" element="EARTH">
<race>ELEMENTAL</race>
<acquire exp="141405" sp="3817" />
<acquire exp="240547" sp="7216" attribute_exp="684"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -2635,10 +2634,9 @@
</drop>
</dropLists>
</npc>
<npc id="21765" level="83" type="Monster" name="Tree Soldier" title="Elite">
<!-- Classic Seven Sings -->
<npc id="21765" level="77" type="Monster" name="Tree Soldier" title="Elite" element="EARTH">
<race>ETC</race> <!-- TODO: Magic Creatures -->
<acquire exp="880166" sp="23764" />
<acquire exp="356985" sp="10709" attribute_exp="770"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed>
@ -2667,10 +2665,9 @@
</drop>
</dropLists>
</npc>
<npc id="21766" level="83" type="Monster" name="Tortay" title="Master">
<!-- Classic Seven Sings -->
<npc id="21766" level="82" type="Monster" name="Tortay" title="Master" element="EARTH">
<race>ELEMENTAL</race>
<acquire exp="2525776" sp="68195" />
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed>
@ -2700,10 +2697,10 @@
</drop>
</dropLists>
</npc>
<npc id="21767" level="82" type="Monster" name="Undine" title="Elite">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<npc id="21767" level="76" type="Monster" name="Undine" title="Elite" element="WATER">
<race>ELEMENTAL</race>
<sex>FEMALE</sex>
<acquire exp="240547" sp="7216" attribute_exp="684"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -2732,10 +2729,10 @@
</drop>
</dropLists>
</npc>
<npc id="21768" level="83" type="Monster" name="Snow Golem" title="Elite">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<npc id="21768" level="77" type="Monster" name="Snow Golem" title="Elite" element="WATER">
<race>ELEMENTAL</race>
<sex>FEMALE</sex>
<acquire exp="355562" sp="10666" attribute_exp="770"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed>
@ -2764,10 +2761,10 @@
</drop>
</dropLists>
</npc>
<npc id="21769" level="83" type="Monster" name="Ishtir" title="Master">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<npc id="21769" level="82" type="Monster" name="Ishtir" title="Master" element="WATER">
<race>ELEMENTAL</race>
<sex>FEMALE</sex>
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed>
@ -2797,7 +2794,7 @@
</drop>
</dropLists>
</npc>
<npc id="21770" level="82" type="Monster" name="Sylph" title="Elite">
<npc id="21770" level="76" type="Monster" name="Sylph" title="Elite" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -2812,7 +2809,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="141405" sp="3817" />
<acquire exp="240547" sp="7216" attribute_exp="684"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -2849,7 +2846,7 @@
</drop>
</dropLists>
</npc>
<npc id="21771" level="83" type="Monster" name="Kimerian" title="Elite">
<npc id="21771" level="77" type="Monster" name="Kimerian" title="Elite" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -2864,7 +2861,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="880166" sp="23764" />
<acquire exp="359475" sp="10784" attribute_exp="770" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed>
@ -2901,7 +2898,7 @@
</drop>
</dropLists>
</npc>
<npc id="21772" level="83" type="Monster" name="Radin" title="Master">
<npc id="21772" level="82" type="Monster" name="Radin" title="Master" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -2916,7 +2913,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="2525776" sp="68195" />
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed>
@ -2954,10 +2951,10 @@
</drop>
</dropLists>
</npc>
<npc id="21773" level="82" type="Monster" name="Captain's Henchman">
<npc id="21773" level="82" type="Monster" name="Captain's Henchman" element="WATER">
<race>ETC</race>
<sex>MALE</sex>
<acquire exp="165067" sp="4456" />
<acquire exp="101142" sp="3034" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2423.44409" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="1055.28566" magical="720.6233026" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
@ -2980,10 +2977,10 @@
<skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
</skillList>
</npc>
<npc id="21774" level="82" type="Monster" name="Buffalo" title="Guardian of Gorge">
<npc id="21774" level="78" type="Monster" name="Buffalo" title="Guardian of Gorge" element="EARTH">
<!-- Classic Seven Sings -->
<race>BEAST</race>
<acquire exp="65216" sp="1760" />
<acquire exp="96918" sp="2907" attribute_exp="858"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -3005,10 +3002,10 @@
<height normal="37.8" />
</collision>
</npc>
<npc id="21775" level="82" type="Monster" name="Arahan" title="Hero of the Past">
<npc id="21775" level="78" type="Monster" name="Arahan" title="Hero of the Past" element="EARTH">
<!-- Classic Seven Sings -->
<race>DIVINE</race>
<acquire exp="591127" sp="15960" />
<acquire exp="322658" sp="9679" attribute_exp="858" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<speed>
@ -3022,7 +3019,7 @@
<skillList>
<skill id="4416" level="8" /> <!-- Angel -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
<skill id="4410" level="13" /> <!-- Very Strong P. Atk. -->
<skill id="4411" level="14" /> <!-- Strong M. Atk. -->
<skill id="4412" level="15" /> <!-- Strong P. Def. -->
<skill id="4413" level="12" /> <!-- Slightly Strong M. Def. -->
@ -3032,7 +3029,7 @@
<height normal="44" />
</collision>
</npc>
<npc id="21776" level="82" type="Monster" name="Fuish" title="Guardian of Wind">
<npc id="21776" level="80" type="Monster" name="Fuish" title="Guardian of Wind" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3047,7 +3044,7 @@
</parameters>
<race>DEMONIC</race>
<sex>MALE</sex>
<acquire exp="110421" sp="2981" />
<acquire exp="182745" sp="5482" attribute_exp="1040"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -3078,7 +3075,7 @@
<height normal="31.44" />
</collision>
</npc>
<npc id="21777" level="78" type="Monster" name="White Tiger">
<npc id="21777" level="76" type="Monster" name="White Tiger" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3093,7 +3090,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="22942" sp="688" />
<acquire exp="45295" sp="1358" attribute_exp="684"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<speed>
@ -3124,7 +3121,7 @@
<height normal="28" />
</collision>
</npc>
<npc id="21778" level="79" type="Monster" name="Black Tiger">
<npc id="21778" level="76" type="Monster" name="Black Tiger" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3139,7 +3136,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="42650" sp="1151" />
<acquire exp="82723" sp="2481" attribute_exp="684" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<speed>
@ -3170,7 +3167,7 @@
<height normal="28" />
</collision>
</npc>
<npc id="21779" level="79" type="Monster" name="Scorn Warrior">
<npc id="21779" level="77" type="Monster" name="Scorn Warrior" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3185,7 +3182,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="25744" sp="695" />
<acquire exp="50337" sp="1510" attribute_exp="770"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<speed>
@ -3215,7 +3212,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21780" level="80" type="Monster" name="Porcupine">
<npc id="21780" level="77" type="Monster" name="Porcupine" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3230,7 +3227,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="45081" sp="1217" />
<acquire exp="86338" sp="2590" attribute_exp="770"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<speed>
@ -3261,7 +3258,7 @@
<height normal="21.3" />
</collision>
</npc>
<npc id="21781" level="80" type="Monster" name="Scorn Soldier">
<npc id="21781" level="78" type="Monster" name="Scorn Soldier" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3276,7 +3273,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="28320" sp="764" />
<acquire exp="54208" sp="1626" attribute_exp="858"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<speed>
@ -3307,7 +3304,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21782" level="81" type="Monster" name="Scorn Seeker">
<npc id="21782" level="78" type="Monster" name="Scorn Seeker" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3322,7 +3319,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="30607" sp="826" />
<acquire exp="97356" sp="2920" attribute_exp="858" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<speed>
@ -3353,7 +3350,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21783" level="81" type="Monster" name="Nero Commander">
<npc id="21783" level="81" type="Monster" name="Nero Commander" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3368,7 +3365,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="52317" sp="1412" />
<acquire exp="93128" sp="2793" attribute_exp="948" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<speed>
@ -3399,7 +3396,7 @@
<height normal="28" />
</collision>
</npc>
<npc id="21784" level="82" type="Monster" name="Storm Tapo">
<npc id="21784" level="79" type="Monster" name="Storm Tapo" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3414,7 +3411,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="52205" sp="1409" />
<acquire exp="98745" sp="2962" attribute_exp="948"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -3445,7 +3442,7 @@
<height normal="28" />
</collision>
</npc>
<npc id="21785" level="82" type="Monster" name="Breeze Warrior">
<npc id="21785" level="80" type="Monster" name="Breeze Warrior" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3460,7 +3457,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="356540" sp="10696" />
<acquire exp="169228" sp="5076" attribute_exp="1040" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -3491,7 +3488,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21786" level="82" type="Monster" name="Sharp Kau">
<npc id="21786" level="80" type="Monster" name="Sharp Kau" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3506,7 +3503,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="297563" sp="8034" />
<acquire exp="172684" sp="5180" attribute_exp="1040"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2423.3825125" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<speed>
@ -3537,7 +3534,7 @@
<height normal="21.3" />
</collision>
</npc>
<npc id="21787" level="82" type="Monster" name="Breeze Piker">
<npc id="21787" level="80" type="Monster" name="Breeze Piker" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3552,7 +3549,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="357952" sp="9664" />
<acquire exp="170380" sp="5111" attribute_exp="1040" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed>
@ -3583,7 +3580,7 @@
<height normal="40" />
</collision>
</npc>
<npc id="21788" level="82" type="Monster" name="Breeze Mage">
<npc id="21788" level="81" type="Monster" name="Breeze Mage" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3598,7 +3595,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="299823" sp="8095" />
<acquire exp="143410" sp="4302" attribute_exp="1134"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2423.3825125" hpRegen="8.5" mp="3753.285" mpRegen="3" />
<speed>
@ -3630,7 +3627,7 @@
<height normal="48.6" />
</collision>
</npc>
<npc id="21789" level="83" type="Monster" name="Folding">
<npc id="21789" level="81" type="Monster" name="Folding" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3645,7 +3642,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="311134" sp="8400" />
<acquire exp="137190" sp="4115" attribute_exp="1134"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2450.5997675" hpRegen="8.5" mp="3166.53" mpRegen="3" />
<speed>
@ -3676,7 +3673,7 @@
<height normal="27.6" />
</collision>
</npc>
<npc id="21790" level="83" type="Monster" name="Wingrow">
<npc id="21790" level="81" type="Monster" name="Wingrow" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3691,7 +3688,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="405458" sp="10947" />
<acquire exp="182264" sp="5467" attribute_exp="1134"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed>
@ -3722,7 +3719,7 @@
<height normal="43" />
</collision>
</npc>
<npc id="21791" level="83" type="Monster" name="Storm Lucifer">
<npc id="21791" level="82" type="Monster" name="Storm Lucifer" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3737,7 +3734,7 @@
</parameters>
<race>ELEMENTAL</race>
<sex>MALE</sex>
<acquire exp="402228" sp="10860" />
<acquire exp="184089" sp="5522" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed>
@ -3769,7 +3766,7 @@
<height normal="50" />
</collision>
</npc>
<npc id="21792" level="83" type="Monster" name="Blow Breaker">
<npc id="21792" level="82" type="Monster" name="Blow Breaker" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3784,7 +3781,7 @@
</parameters>
<race>HUMANOID</race>
<sex>MALE</sex>
<acquire exp="398997" sp="10772" />
<acquire exp="186389" sp="5591" attribute_exp="1230"/>
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2940.744352" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<speed>
@ -3815,7 +3812,7 @@
<height normal="27.6" />
</collision>
</npc>
<npc id="21793" level="83" type="Monster" name="Brolly Seeker">
<npc id="21793" level="82" type="Monster" name="Brolly Seeker" element="WIND">
<parameters>
<param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" />
@ -3830,7 +3827,7 @@
</parameters>
<race>UNDEAD</race>
<sex>MALE</sex>
<acquire exp="407195" sp="10994" />
<acquire exp="193247" sp="5797" attribute_exp="1230" />
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
<vitals hp="2940.744352" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed>

View File

@ -820,7 +820,7 @@
<height normal="39" grown="47.5" />
</collision>
</npc>
<npc id="21813" level="78" type="Monster" name="Canyon Antelope">
<npc id="21813" level="76" type="Monster" name="Canyon Antelope" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="80" />
@ -835,7 +835,7 @@
</parameters>
<race>ANIMAL</race>
<sex>MALE</sex>
<acquire exp="22942" sp="688" />
<acquire exp="81060" sp="2431" attribute_exp="684" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<attack physical="646.17968" magical="441.25696" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -868,7 +868,7 @@
<height normal="34" />
</collision>
</npc>
<npc id="21814" level="78" type="Monster" name="Canyon Antelope Warrior">
<npc id="21814" level="76" type="Monster" name="Canyon Antelope Warrior" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="80" />
@ -886,7 +886,7 @@
</parameters>
<race>ANIMAL</race>
<sex>MALE</sex>
<acquire exp="41578" sp="1247" />
<acquire exp="82723" sp="2481" attribute_exp="684"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1380.444395" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<attack physical="667.50361" magical="455.81844" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -921,7 +921,7 @@
<height normal="34" />
</collision>
</npc>
<npc id="21815" level="79" type="Monster" name="Canyon Bandersnatch">
<npc id="21815" level="77" type="Monster" name="Canyon Bandersnatch" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="78" />
@ -937,7 +937,7 @@
</parameters>
<race>BEAST</race>
<sex>MALE</sex>
<acquire exp="25744" sp="695" />
<acquire exp="50337" sp="1510" attribute_exp="770"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<attack physical="688.86373" magical="470.40463" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -970,7 +970,7 @@
<height normal="25" />
</collision>
</npc>
<npc id="21816" level="79" type="Monster" name="Canyon Bandersnatch Warrior">
<npc id="21816" level="77" type="Monster" name="Canyon Bandersnatch Warrior" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="78" />
@ -988,7 +988,7 @@
</parameters>
<race>BEAST</race>
<sex>MALE</sex>
<acquire exp="45084" sp="1217" />
<acquire exp="88472" sp="2654" attribute_exp="770" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<attack physical="710.2185" magical="484.98717" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1023,7 +1023,7 @@
<height normal="25" />
</collision>
</npc>
<npc id="21817" level="80" type="Monster" name="Eye of Restrainer">
<npc id="21817" level="77" type="Monster" name="Eye of Restrainer" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="0" />
@ -1038,7 +1038,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="42009" sp="1134" />
<acquire exp="85626" sp="2568" attribute_exp="770"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="710.2185" magical="484.98717" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1071,8 +1071,7 @@
<height normal="43" />
</collision>
</npc>
<npc id="21818" level="80" type="Monster" name="Valley Buffalo">
<!-- Classic Seven Sings -->
<npc id="21818" level="78" type="Monster" name="Valley Buffalo" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="120" />
<param name="MoveAroundSocial1" value="30" />
@ -1089,7 +1088,7 @@
</parameters>
<race>BEAST</race>
<sex>MALE</sex>
<acquire exp="27744" sp="749" />
<acquire exp="59684" sp="1790" attribute_exp="858"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<attack physical="731.52506" magical="499.53679" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
@ -1124,8 +1123,7 @@
<height normal="31" grown="38" />
</collision>
</npc>
<npc id="21819" level="81" type="Monster" name="Eye of Guide">
<!-- Classic Seven Sings -->
<npc id="21819" level="78" type="Monster" name="Eye of Guide" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -1145,7 +1143,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="28028" sp="756" />
<acquire exp="56362" sp="1690" attribute_exp="858" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="752.73928" magical="514.02335" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1184,8 +1182,7 @@
<height normal="43.2" />
</collision>
</npc>
<npc id="21820" level="81" type="Monster" name="Gaze of Nightmares">
<!-- Classic Seven Sings -->
<npc id="21820" level="79" type="Monster" name="Gaze of Nightmares" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="40" />
<param name="MoveAroundSocial1" value="40" />
@ -1206,7 +1203,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="47455" sp="1281" />
<acquire exp="99980" sp="2999" attribute_exp="948"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<attack physical="731.52506" magical="499.53679" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1246,8 +1243,7 @@
<height normal="30" />
</collision>
</npc>
<npc id="21821" level="82" type="Monster" name="Eye of the Watchman">
<!-- Classic Seven Sings -->
<npc id="21821" level="79" type="Monster" name="Eye of the Watchman" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -1266,7 +1262,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="30721" sp="829" />
<acquire exp="96872" sp="2906" attribute_exp="948"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1305,7 +1301,7 @@
<height normal="49.8" />
</collision>
</npc>
<npc id="21822" level="82" type="Monster" name="Homunculus">
<npc id="21822" level="79" type="Monster" name="Homunculus" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="80" />
@ -1322,7 +1318,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="287208" sp="8616" />
<acquire exp="162777" sp="4883" attribute_exp="948" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="752.73928" magical="514.02335" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1356,7 +1352,7 @@
<height normal="26" />
</collision>
</npc>
<npc id="21823" level="82" type="Monster" name="Canyon Grendel Warrior">
<npc id="21823" level="80" type="Monster" name="Canyon Grendel Warrior" element="EARTH">
<!-- Classic Seven Sings -->
<parameters>
<param name="MoveAroundSocial" value="115" />
@ -1377,7 +1373,7 @@
</parameters>
<race>ANIMAL</race>
<sex>MALE</sex>
<acquire exp="357104" sp="10713" />
<acquire exp="132364" sp="3970" attribute_exp="1040" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1415,8 +1411,7 @@
<height normal="39" grown="47.5" />
</collision>
</npc>
<npc id="21824" level="82" type="Monster" name="Eye of Pilgrim">
<!-- Classic Seven Sings -->
<npc id="21824" level="80" type="Monster" name="Eye of Pilgrim" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -1435,7 +1430,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="358799" sp="9687" />
<acquire exp="133555" sp="4006" attribute_exp="1040"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1474,8 +1469,7 @@
<height normal="63" />
</collision>
</npc>
<npc id="21825" level="82" type="Monster" name="Elder Homunculus">
<!-- Classic Seven Sings -->
<npc id="21825" level="80" type="Monster" name="Elder Homunculus" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="80" />
<param name="MoveAroundSocial1" value="80" />
@ -1492,7 +1486,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="377438" sp="10190" />
<acquire exp="137011" sp="4110" attribute_exp="1040"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<attack physical="794.70901" magical="542.68324" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1529,8 +1523,7 @@
<height normal="32.5" />
</collision>
</npc>
<npc id="21826" level="82" type="Monster" name="Eye of Ruler">
<!-- Classic Seven Sings -->
<npc id="21826" level="80" type="Monster" name="Eye of Ruler" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" />
@ -1549,7 +1542,7 @@
</parameters>
<race>CONSTRUCT</race>
<sex>MALE</sex>
<acquire exp="378473" sp="10218" />
<acquire exp="133555" sp="4006" attribute_exp="1040"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1588,8 +1581,7 @@
<height normal="56.4" />
</collision>
</npc>
<npc id="21827" level="83" type="Monster" name="Sly Hound Dog">
<!-- Classic Seven Sings -->
<npc id="21827" level="81" type="Monster" name="Sly Hound Dog" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="78" />
<param name="MoveAroundSocial1" value="78" />
@ -1605,7 +1597,7 @@
</parameters>
<race>BEAST</race>
<sex>MALE</sex>
<acquire exp="302551" sp="8168" />
<acquire exp="175139" sp="5254" attribute_exp="1134" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<attack physical="731.52506" magical="499.53679" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1640,8 +1632,7 @@
<height normal="25" />
</collision>
</npc>
<npc id="21828" level="83" type="Monster" name="Disciple of Protection">
<!-- Classic Seven Sings -->
<npc id="21828" level="81" type="Monster" name="Disciple of Protection" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" />
@ -1657,7 +1648,7 @@
<race>DIVINE</race>
<sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
<acquire exp="371075" sp="10019" />
<acquire exp="178209" sp="5346" attribute_exp="1134"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="3063.234315" hpRegen="8.5" mp="3166.53" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1692,8 +1683,7 @@
<height normal="30" grown="36.5" />
</collision>
</npc>
<npc id="21829" level="83" type="Monster" name="Disciple of Punishment">
<!-- Classic Seven Sings -->
<npc id="21829" level="81" type="Monster" name="Disciple of Punishment" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" />
@ -1711,7 +1701,7 @@
<race>DIVINE</race>
<sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
<acquire exp="394512" sp="10651" />
<acquire exp="184114" sp="5523" attribute_exp="1134"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<attack physical="856.44055895414" magical="584.837886935576" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1748,8 +1738,7 @@
<height normal="30" grown="36.5" />
</collision>
</npc>
<npc id="21830" level="83" type="Monster" name="Disciple of Conquest">
<!-- Classic Seven Sings -->
<npc id="21830" level="82" type="Monster" name="Disciple of Conquest" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" />
@ -1765,7 +1754,7 @@
<race>DIVINE</race>
<sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
<acquire exp="404301" sp="10916" />
<acquire exp="190827" sp="5724" attribute_exp="1230"/>
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2940.744352" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
@ -1800,8 +1789,7 @@
<height normal="30" grown="36.5" />
</collision>
</npc>
<npc id="21831" level="83" type="Monster" name="Disciple of Power">
<!-- Classic Seven Sings -->
<npc id="21831" level="82" type="Monster" name="Disciple of Power" element="EARTH">
<parameters>
<param name="MoveAroundSocial" value="85" />
<param name="MoveAroundSocial1" value="85" />
@ -1816,7 +1804,7 @@
<race>DIVINE</race>
<sex>MALE</sex>
<equipment rhand="6718" /> <!-- Monster Only (Einhasad Shaman) -->
<acquire exp="427448" sp="11541" />
<acquire exp="232946" sp="6988" attribute_exp="1230" />
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
<vitals hp="2859.043325" hpRegen="8.5" mp="3166.53" mpRegen="3" />
<attack physical="815.37145" magical="556.793" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
@ -1852,11 +1840,11 @@
<height normal="38.5" grown="46.5" />
</collision>
</npc>
<npc id="21832" level="83" type="Npc" name="Disciple of Authority">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<npc id="21832" level="82" type="Npc" name="Disciple of Authority">
<race>DIVINE</race>
<sex>FEMALE</sex>
<equipment rhand="6718" />
<acquire exp="190827" sp="5724" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="6297" hpRegen="10.5" mp="2666" mpRegen="3.6" />
<speed>

View File

@ -727,21 +727,69 @@
<!-- Fire Attribute Attack +100. -->
<icon>icon.agathion_fire_1</icon>
<operateType>P</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>100</amount>
<type>FIRE</type>
</effect>
</effects>
</skill>
<skill id="51094" toLevel="1" name="Water Attribute Attack">
<!-- Water Attribute Attack +100. -->
<icon>icon.agathion_water_1</icon>
<operateType>P</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>100</amount>
<type>WATER</type>
</effect>
</effects>
</skill>
<skill id="51095" toLevel="1" name="Wind Attribute Attack">
<!-- Wind Attribute Attack +100. -->
<icon>icon.agathion_wind_1</icon>
<operateType>P</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>100</amount>
<type>WIND</type>
</effect>
</effects>
</skill>
<skill id="51096" toLevel="1" name="Earth Attribute Attack">
<!-- Earth Attribute Attack +100. -->
<icon>icon.agathion_earth_1</icon>
<operateType>P</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>100</amount>
<type>EARTH</type>
</effect>
</effects>
</skill>
<skill id="51097" toLevel="1" name="Radiant Spirit's Varnish">
<icon>icon.ev_charge_scroll</icon>

View File

@ -8,26 +8,70 @@
<skill id="51101" toLevel="1" name="Agathion Summon - Ignis">
<!-- Summon Ignis Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SummonAgathion">
<npcId>13568</npcId> <!-- Median Flame Ignis -->
</effect>
</effects>
</skill>
<skill id="51102" toLevel="1" name="Agathion Summon - Nebula">
<!-- Summon Nebula Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SummonAgathion">
<npcId>13572</npcId> <!-- Median Water Procella-->
</effect>
</effects>
</skill>
<skill id="51103" toLevel="1" name="Agathion Summon - Procella">
<!-- Summon Procella Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SummonAgathion">
<npcId>13576</npcId> <!-- Median Wind Procella-->
</effect>
</effects>
</skill>
<skill id="51104" toLevel="1" name="Agathion Summon - Petram">
<!-- Summon Petram Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>85</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SummonAgathion">
<npcId>13580</npcId> <!-- Median Earth Petram -->
</effect>
</effects>
</skill>
<skill id="51105" toLevel="1" name="Improved Master Fisherman's Blessing">
<!-- For 2 hr. Acquired XP/ SP through fishing +200%. Buff remains even after death. -->
@ -161,18 +205,54 @@
<skill id="51125" toLevel="1" name="Quick MP Recovery Potion">
<icon>icon.etc_potion_blue_i00</icon>
<operateType>A1</operateType>
<blockedInOlympiad>true</blockedInOlympiad>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>1</magicLvl>
<reuseDelay>0</reuseDelay>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Mp">
<amount>100</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="51126" toLevel="1" name="Intermediate Spirit's Blessing">
<!-- For 20 min. Acquired XP +30%. -->
<icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SpiritExpModify">
<amount>30</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="51127" toLevel="1" name="Advanced Spirit's Blessing">
<!-- For 20 min. Acquired XP +50%. -->
<icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SpiritExpModify">
<amount>50</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="51128" toLevel="1" name="Spirit's Varnish">
<icon>icon.ev_charge_scroll</icon>
@ -185,30 +265,74 @@
<skill id="51130" toLevel="1" name="Fire Attribute Attack Potion">
<!-- Use to get Fire Attack Power +50 for 20 min. -->
<icon>icon.etc_fire_potion_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>50</amount>
<type>FIRE</type>
</effect>
</effects>
</skill>
<skill id="51131" toLevel="1" name="Water Attribute Attack Potion">
<!-- Use to get Water Attack Power +50 for 20 min. -->
<icon>icon.etc_water_potion_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>50</amount>
<type>WATER</type>
</effect>
</effects>
</skill>
<skill id="51132" toLevel="1" name="Wind Attribute Attack Potion">
<!-- Use to get Wind Attack Power +50 for 20 min. -->
<icon>icon.etc_wind_potion_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>50</amount>
<type>WIND</type>
</effect>
</effects>
</skill>
<skill id="51133" toLevel="1" name="Earth Attribute Attack Potion">
<!-- Use to get Earth Attack Power +50 for 20 min. -->
<icon>icon.etc_earth_potion_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="elementalSpiritAttack">
<amount>50</amount>
<type>EARTH</type>
</effect>
</effects>
</skill>
<skill id="51134" toLevel="1" name="Scroll of Escape: Forge of the Gods">
<operateType>A1</operateType>
@ -356,7 +480,20 @@
<skill id="51162" toLevel="1" name="Quality Quick MP Recovery Potion">
<!-- Instantly recovers 300 MP. -->
<icon>icon.etc_potion_blue_i00</icon>
<blockedInOlympiad>true</blockedInOlympiad>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>1</magicLvl>
<operateType>A1</operateType>
<magicCriticalRate>5</magicCriticalRate>
<hitCancelTime>0</hitCancelTime>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="Mp">
<amount>300</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="51163" toLevel="1" name="Sealed Rune Lvl 14">
<operateType>A1</operateType>

View File

@ -153,33 +153,108 @@
<!-- Water Attack Defense +20. -->
<icon>icon.elemental_necklace_water_i00</icon>
<operateType>P</operateType>
<magicLvl>1</magicLvl>
<effects>
<effect name="ElementalSpiritDefense">
<amount>
<value level="1">20</value>
<value level="2">40</value>
<value level="3">60</value>
<value level="4">80</value>
<value level="5">100</value>
</amount>
<type>WATER</type>
</effect>
</effects>
</skill>
<skill id="54024" toLevel="5" name="Fire Attack Defense">
<!-- Fire Attack Defense +20. -->
<icon>icon.elemental_necklace_fire_i00</icon>
<operateType>P</operateType>
<magicLvl>1</magicLvl>
<effects>
<effect name="ElementalSpiritDefense">
<amount>
<value level="1">20</value>
<value level="2">40</value>
<value level="3">60</value>
<value level="4">80</value>
<value level="5">100</value>
</amount>
<type>FIRE</type>
</effect>
</effects>
</skill>
<skill id="54025" toLevel="5" name="Wind Attack Defense">
<!-- Wind Attack Defense +20. -->
<icon>icon.elemental_necklace_wind_i00</icon>
<operateType>P</operateType>
<magicLvl>1</magicLvl>
<effects>
<effect name="ElementalSpiritDefense">
<amount>
<value level="1">20</value>
<value level="2">40</value>
<value level="3">60</value>
<value level="4">80</value>
<value level="5">100</value>
</amount>
<type>WIND</type>
</effect>
</effects>
</skill>
<skill id="54026" toLevel="5" name="Earth Attack Defense">
<!-- Earth Attack Defense +20. -->
<icon>icon.elemental_necklace_earth_i00</icon>
<operateType>P</operateType>
<magicLvl>1</magicLvl>
<effects>
<effect name="ElementalSpiritDefense">
<amount>
<value level="1">20</value>
<value level="2">40</value>
<value level="3">60</value>
<value level="4">80</value>
<value level="5">100</value>
</amount>
<type>EARTH</type>
</effect>
</effects>
</skill>
<skill id="54027" toLevel="5" name="Attribute XP Increase">
<!-- Acquired attribute XP +3%. -->
<icon>icon.skill_transform_s_attack</icon>
<operateType>P</operateType>
<magicLvl>1</magicLvl>
<effects>
<effect name="SpiritExpModify">
<amount>
<value level="1">3</value>
<value level="2">6</value>
<value level="3">10</value>
<value level="4">15</value>
<value level="5">30</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54028" toLevel="1" name="Spirit's Blessing">
<!-- For 20 min. Acquired XP +50%. -->
<icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType>
<isMagic>4</isMagic>
<effectPoint>1</effectPoint>
<operateType>A2</operateType>
<abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<stayAfterDeath>true</stayAfterDeath>
<targetType>SELF</targetType>
<affectScope>SINGLE</affectScope>
<effects>
<effect name="SpiritExpModify">
<amount>20</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54029" toLevel="4" name="Venir's Blessing">
<!-- When equipped, CON, MEN, DEX, WIT, STR, INT +$s1. -->
@ -195,21 +270,153 @@
<!-- Max HP +50. -->
<icon>icon.elemental_necklace_fire_i00</icon>
<operateType>P</operateType>
<effects>
<effect name="MaxHp">
<amount>
<value level="1">50</value>
<value level="2">50</value>
<value level="3">100</value>
<value level="4">100</value>
<value level="5">150</value>
<value level="6">150</value>
<value level="7">200</value>
<value level="8">200</value>
<value level="9">300</value>
<value level="10">300</value>
<value level="11">500</value>
</amount>
</effect>
<effect name="PAtk">
<amount>
<value level="1">0</value>
<value level="2">1</value>
<value level="3">1</value>
<value level="4">2</value>
<value level="5">2</value>
<value level="6">3</value>
<value level="7">3</value>
<value level="8">5</value>
<value level="9">7</value>
<value level="10">10</value>
<value level="11">15</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54031" toLevel="11" name="Nebula's Necklace Basic Effect">
<!-- Max HP +50. -->
<icon>icon.elemental_necklace_water_i00</icon>
<operateType>P</operateType>
<effects>
<effect name="MaxHp">
<amount>
<value level="1">50</value>
<value level="2">50</value>
<value level="3">100</value>
<value level="4">100</value>
<value level="5">150</value>
<value level="6">150</value>
<value level="7">200</value>
<value level="8">200</value>
<value level="9">300</value>
<value level="10">300</value>
<value level="11">500</value>
</amount>
</effect>
<effect name="PAtk">
<amount>
<value level="1">0</value>
<value level="2">1</value>
<value level="3">1</value>
<value level="4">2</value>
<value level="5">2</value>
<value level="6">3</value>
<value level="7">3</value>
<value level="8">5</value>
<value level="9">7</value>
<value level="10">10</value>
<value level="11">15</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54032" toLevel="11" name="Procella's Necklace Basic Effect">
<!-- Max HP +50. -->
<icon>icon.elemental_necklace_wind_i00</icon>
<operateType>P</operateType>
<effects>
<effect name="MaxHp">
<amount>
<value level="1">50</value>
<value level="2">50</value>
<value level="3">100</value>
<value level="4">100</value>
<value level="5">150</value>
<value level="6">150</value>
<value level="7">200</value>
<value level="8">200</value>
<value level="9">300</value>
<value level="10">300</value>
<value level="11">500</value>
</amount>
</effect>
<effect name="PAtk">
<amount>
<value level="1">0</value>
<value level="2">1</value>
<value level="3">1</value>
<value level="4">2</value>
<value level="5">2</value>
<value level="6">3</value>
<value level="7">3</value>
<value level="8">5</value>
<value level="9">7</value>
<value level="10">10</value>
<value level="11">15</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54033" toLevel="11" name="Petram's Necklace Basic Effect">
<!-- Max HP +50. -->
<icon>icon.elemental_necklace_earth_i00</icon>
<operateType>P</operateType>
<effects>
<effect name="MaxHp">
<amount>
<value level="1">50</value>
<value level="2">50</value>
<value level="3">100</value>
<value level="4">100</value>
<value level="5">150</value>
<value level="6">150</value>
<value level="7">200</value>
<value level="8">200</value>
<value level="9">300</value>
<value level="10">300</value>
<value level="11">500</value>
</amount>
</effect>
<effect name="PAtk">
<amount>
<value level="1">0</value>
<value level="2">1</value>
<value level="3">1</value>
<value level="4">2</value>
<value level="5">2</value>
<value level="6">3</value>
<value level="7">3</value>
<value level="8">5</value>
<value level="9">7</value>
<value level="10">10</value>
<value level="11">15</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="54034" toLevel="10" name="Anakim's Power">
<!-- When using the Recharge skill, MP Recovery Rate +5, M. Atk. +1%. -->

View File

@ -100,6 +100,8 @@ DispelBySlotMyself: Removes given amount of effects by specified AbnormalType
DispelBySlotProbability: Removes given amount of effects by specified AbnormalType at a given rate.
DoubleCast: Triggers Fire, Water, Wind, Earth stance and enables the ability to cast two skills at once.
DuelistFury: Synergy effect for Faceoff effect. (l2jmobius)
ElementalSpiritAttack: Elemental spirit attack stat effect. (JoeAlisson)
ElementalSpiritDefense: Elemental spirit defense stat effect. (JoeAlisson)
EnableCloak: See/unsee cloaks.
EnemyCharge: Charges towards the enemy. Rush Impact.
EnergyAttack: Physical attack based on Momentum formula. Triple Sonic Slash, Double Sonic Slash etc.
@ -278,6 +280,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count.
Sow: Planting a seed into NPC target. Manor stuff.
Speed: Speed stat.
SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range.
SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson)
SpModify: Bonus SP stat.
Spoil: Spoils a mob activating its extra sweep drop.
StatBonusSkillCritical: Changes skill critical rate to depend on the specified base stat.

View File

@ -0,0 +1,54 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="spirit" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="level" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:byte" name="id" use="required"/>
<xs:attribute type="xs:short" name="atk" use="required"/>
<xs:attribute type="xs:short" name="def" use="required"/>
<xs:attribute type="xs:byte" name="critRate" use="required"/>
<xs:attribute type="xs:byte" name="critDam" use="required"/>
<xs:attribute type="xs:int" name="maxExp" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="itemToEvolve" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="optional"/>
<xs:attribute type="xs:int" name="count" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="absorbItem" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="required"/>
<xs:attribute type="xs:short" name="experience" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="required"/>
<xs:attribute type="xs:byte" name="type" use="required"/>
<xs:attribute type="xs:byte" name="stage" use="required"/>
<xs:attribute type="xs:short" name="npcId" use="required"/>
<xs:attribute type="xs:int" name="extractItem" use="required"/>
<xs:attribute type="xs:byte" name="maxCharacteristics" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@ -66,6 +66,7 @@
<xs:attribute name="exp" type="xs:decimal" />
<xs:attribute name="sp" type="xs:decimal" />
<xs:attribute name="raidPoints" type="xs:decimal" />
<xs:attribute name="attribute_exp" type="xs:decimal" />
</xs:complexType>
</xs:element>
<xs:element name="mpReward" minOccurs="0" maxOccurs="1">
@ -302,6 +303,7 @@
<xs:attribute name="usingServerSideName" type="xs:boolean" />
<xs:attribute name="title" type="xs:string" />
<xs:attribute name="usingServerSideTitle" type="xs:boolean" />
<xs:attribute name="element" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@ -16,6 +16,9 @@
*/
package org.l2jmobius.commons.util;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@ -27,11 +30,14 @@ import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.StringJoiner;
import java.util.StringTokenizer;
import java.util.function.Predicate;
import java.util.function.ToIntFunction;
import org.l2jmobius.Config;
@ -587,4 +593,29 @@ public final class CommonUtil
final DecimalFormat formatter = new DecimalFormat(format, new DecimalFormatSymbols(Locale.ENGLISH));
return formatter.format(val);
}
public static boolean isNullOrEmpty(final CharSequence value)
{
return isNull(value) || (value.length() == 0);
}
public static boolean isNotEmpty(final String value)
{
return nonNull(value) && !value.isEmpty();
}
public static boolean isNullOrEmpty(final Collection<?> collection)
{
return isNull(collection) || collection.isEmpty();
}
public static <T> int zeroIfNullOrElse(T obj, ToIntFunction<T> action)
{
return isNull(obj) ? 0 : action.applyAsInt(obj);
}
public static <T> boolean falseIfNullOrElse(T obj, Predicate<T> predicate)
{
return nonNull(obj) && predicate.test(obj);
}
}

View File

@ -55,6 +55,7 @@ import org.l2jmobius.gameserver.data.xml.impl.CombinationItemsData;
import org.l2jmobius.gameserver.data.xml.impl.CubicData;
import org.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.data.xml.impl.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
@ -239,6 +240,7 @@ public class GameServer
ClanRewardData.getInstance();
DailyMissionHandler.getInstance().executeScript();
DailyMissionData.getInstance();
ElementalSpiritData.getInstance();
printSection("Skills");
SkillConditionHandler.getInstance().executeScript();

View File

@ -0,0 +1,120 @@
/*
* 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 org.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritTemplateHolder;
/**
* @author JoeAlisson
*/
public class ElementalSpiritData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(ElementalSpiritData.class.getName());
public static final long EXTRACT_FEE = 1000000;
public static final float FRAGMENT_XP_CONSUME = 50000.0f;
public static final int TALENT_INIT_FEE = 50000;
private static final Map<Byte, Map<Byte, ElementalSpiritTemplateHolder>> SPIRIT_DATA = new HashMap<>(4);
protected ElementalSpiritData()
{
load();
}
@Override
public void load()
{
parseDatapackFile("data/ElementalSpiritData.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + SPIRIT_DATA.size() + " elemental spirit templates.");
}
@Override
public void parseDocument(Document doc, File f)
{
forEach(doc, "list", list -> forEach(list, "spirit", this::parseSpirit));
}
private void parseSpirit(Node spiritNode)
{
final NamedNodeMap attributes = spiritNode.getAttributes();
final byte type = parseByte(attributes, "type");
final byte stage = parseByte(attributes, "stage");
final int npcId = parseInteger(attributes, "npcId");
final int extractItem = parseInteger(attributes, "extractItem");
final int maxCharacteristics = parseInteger(attributes, "maxCharacteristics");
ElementalSpiritTemplateHolder template = new ElementalSpiritTemplateHolder(type, stage, npcId, extractItem, maxCharacteristics);
SPIRIT_DATA.computeIfAbsent(type, HashMap::new).put(stage, template);
forEach(spiritNode, "level", levelNode ->
{
final NamedNodeMap levelInfo = levelNode.getAttributes();
final int level = parseInteger(levelInfo, "id");
final int attack = parseInteger(levelInfo, "atk");
final int defense = parseInteger(levelInfo, "def");
final int criticalRate = parseInteger(levelInfo, "critRate");
final int criticalDamage = parseInteger(levelInfo, "critDam");
final long maxExperience = parseLong(levelInfo, "maxExp");
template.addLevelInfo(level, attack, defense, criticalRate, criticalDamage, maxExperience);
});
forEach(spiritNode, "itemToEvolve", itemNode ->
{
final NamedNodeMap itemInfo = itemNode.getAttributes();
final int itemId = parseInteger(itemInfo, "id");
final int count = parseInteger(itemInfo, "count", 1);
template.addItemToEvolve(itemId, count);
});
forEach(spiritNode, "absorbItem", absorbItemNode ->
{
final NamedNodeMap absorbInfo = absorbItemNode.getAttributes();
final int itemId = parseInteger(absorbInfo, "id");
final int experience = parseInteger(absorbInfo, "experience");
template.addAbsorbItem(itemId, experience);
});
}
public ElementalSpiritTemplateHolder getSpirit(byte type, byte stage)
{
if (SPIRIT_DATA.containsKey(type))
{
return SPIRIT_DATA.get(type).get(stage);
}
return null;
}
public static ElementalSpiritData getInstance()
{
return Singleton.INSTANCE;
}
private static class Singleton
{
static final ElementalSpiritData INSTANCE = new ElementalSpiritData();
}
}

View File

@ -42,6 +42,7 @@ import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AISkillScope;
import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.MpRewardType;
import org.l2jmobius.gameserver.model.StatsSet;
@ -110,6 +111,7 @@ public class NpcData implements IXmlReader
set.set("usingServerSideName", parseBoolean(attrs, "usingServerSideName"));
set.set("title", parseString(attrs, "title"));
set.set("usingServerSideTitle", parseBoolean(attrs, "usingServerSideTitle"));
set.set("elementalType", parseEnum(attrs, ElementalType.class, "element"));
for (Node npcNode = listNode.getFirstChild(); npcNode != null; npcNode = npcNode.getNextSibling())
{
attrs = npcNode.getAttributes();
@ -143,6 +145,7 @@ public class NpcData implements IXmlReader
set.set("exp", parseDouble(attrs, "exp"));
set.set("sp", parseDouble(attrs, "sp"));
set.set("raidPoints", parseDouble(attrs, "raidPoints"));
set.set("attribute_exp", parseLong(attrs, "attribute_exp"));
break;
}
case "mpreward":

View File

@ -0,0 +1,127 @@
/*
* 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 org.l2jmobius.gameserver.enums;
import org.l2jmobius.gameserver.model.stats.Stats;
/**
* @author JoeAlisson
*/
public enum ElementalType
{
NONE,
FIRE,
WATER,
WIND,
EARTH;
public byte getId()
{
return (byte) (ordinal());
}
public static ElementalType of(byte elementId)
{
return values()[elementId];
}
public ElementalType getDominating()
{
return dominating(this);
}
public ElementalType dominating(ElementalType elementalType)
{
switch (elementalType)
{
case FIRE:
{
return WATER;
}
case WATER:
{
return EARTH;
}
case WIND:
{
return FIRE;
}
case EARTH:
{
return WIND;
}
default:
{
return NONE;
}
}
}
public Stats getAttackStat()
{
switch (this)
{
case EARTH:
{
return Stats.ELEMENTAL_SPIRIT_EARTH_ATTACK;
}
case WIND:
{
return Stats.ELEMENTAL_SPIRIT_WIND_ATTACK;
}
case FIRE:
{
return Stats.ELEMENTAL_SPIRIT_FIRE_ATTACK;
}
case WATER:
{
return Stats.ELEMENTAL_SPIRIT_WATER_ATTACK;
}
default:
{
return null;
}
}
}
public Stats getDefenseStat()
{
switch (this)
{
case EARTH:
{
return Stats.ELEMENTAL_SPIRIT_EARTH_DEFENSE;
}
case WIND:
{
return Stats.ELEMENTAL_SPIRIT_WIND_DEFENSE;
}
case FIRE:
{
return Stats.ELEMENTAL_SPIRIT_FIRE_DEFENSE;
}
case WATER:
{
return Stats.ELEMENTAL_SPIRIT_WATER_DEFENSE;
}
default:
{
return null;
}
}
}
}

View File

@ -0,0 +1,107 @@
/*
* 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 org.l2jmobius.gameserver.instancemanager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
/**
* @author Mobius
*/
public class ElementalSpiritInstanceManager
{
private static final String LOAD_QUERY = "SELECT * FROM character_spirits WHERE charId=?";
private static final String STORE_QUERY = "REPLACE INTO character_spirits (charId, type, level, stage, experience, attack_points, defense_points, crit_rate_points, crit_damage_points, in_use) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
public List<ElementalSpiritDataHolder> findByPlayerId(int playerId)
{
final List<ElementalSpiritDataHolder> result = new ArrayList<>();
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement stmt = con.prepareStatement(LOAD_QUERY))
{
stmt.setInt(1, playerId);
try (ResultSet rset = stmt.executeQuery())
{
while (rset.next())
{
final ElementalSpiritDataHolder newHolder = new ElementalSpiritDataHolder();
newHolder.setCharId(rset.getInt("charId"));
newHolder.setType(rset.getByte("type"));
newHolder.setLevel(rset.getByte("level"));
newHolder.setStage(rset.getByte("stage"));
newHolder.setExperience(rset.getLong("experience"));
newHolder.setAttackPoints(rset.getByte("attack_points"));
newHolder.setDefensePoints(rset.getByte("defense_points"));
newHolder.setCritRatePoints(rset.getByte("crit_rate_points"));
newHolder.setCritDamagePoints(rset.getByte("crit_damage_points"));
newHolder.setInUse(rset.getByte("in_use") == 1);
result.add(newHolder);
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
return result;
}
public void save(ElementalSpiritDataHolder data)
{
if (data == null)
{
return;
}
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(STORE_QUERY))
{
statement.setInt(1, data.getCharId());
statement.setInt(2, data.getType());
statement.setInt(3, data.getLevel());
statement.setInt(4, data.getStage());
statement.setLong(5, data.getExperience());
statement.setInt(6, data.getAttackPoints());
statement.setInt(7, data.getDefensePoints());
statement.setInt(8, data.getCritRatePoints());
statement.setInt(9, data.getCritDamagePoints());
statement.setInt(10, data.isInUse() ? 1 : 0);
statement.execute();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static ElementalSpiritInstanceManager getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final ElementalSpiritInstanceManager INSTANCE = new ElementalSpiritInstanceManager();
}
}

View File

@ -0,0 +1,275 @@
/*
* 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 org.l2jmobius.gameserver.model;
import static java.lang.Math.max;
import java.util.List;
import org.l2jmobius.gameserver.data.xml.impl.ElementalSpiritData;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.ElementalSpiritInstanceManager;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.OnElementalSpiritUpgrade;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritAbsorbItemHolder;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritTemplateHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ExElementalSpiritGetExp;
/**
* @author JoeAlisson
*/
public class ElementalSpirit
{
private final PlayerInstance _owner;
private ElementalSpiritTemplateHolder _template;
private final ElementalSpiritDataHolder _data;
public ElementalSpirit(ElementalType type, PlayerInstance owner)
{
_data = new ElementalSpiritDataHolder(type.getId(), owner.getObjectId());
_template = ElementalSpiritData.getInstance().getSpirit(type.getId(), _data.getStage());
_owner = owner;
}
public ElementalSpirit(ElementalSpiritDataHolder data, PlayerInstance owner)
{
_owner = owner;
_data = data;
_template = ElementalSpiritData.getInstance().getSpirit(data.getType(), data.getStage());
}
public void addExperience(long experience)
{
_data.addExperience(experience);
_owner.sendPacket(new SystemMessage(SystemMessageId.OBTAINED_S2_ATTRIBUTE_XP_OF_S1).addInt((int) experience).addElementalSpirit(getType()));
if (_data.getExperience() > getExperienceToNextLevel())
{
levelUp();
_owner.sendPacket(new SystemMessage(SystemMessageId.S1_ATTRIBUTE_SPIRIT_BECAME_LEVEL_S2).addElementalSpirit(getType()).addByte(_data.getLevel()));
_owner.sendPacket(new ElementalSpiritInfo(_owner, _owner.getActiveElementalSpiritType(), (byte) 0));
final UserInfo userInfo = new UserInfo(_owner);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
_owner.sendPacket(userInfo);
}
_owner.sendPacket(new ExElementalSpiritGetExp(getType(), _data.getExperience()));
}
private void levelUp()
{
do
{
if (_data.getLevel() < getMaxLevel())
{
_data.increaseLevel();
}
else
{
_data.setExperience(getExperienceToNextLevel());
}
}
while (_data.getExperience() > getExperienceToNextLevel());
}
public int getAvailableCharacteristicsPoints()
{
final int stage = _data.getStage();
final int level = _data.getLevel();
final int points = ((stage - 1) * 11) + (stage > 2 ? (level - 1) * 2 : level - 1);
return max(points - _data.getAttackPoints() - _data.getDefensePoints() - _data.getCritDamagePoints() - _data.getCritRatePoints(), 0);
}
public ElementalSpiritAbsorbItemHolder getAbsorbItem(int itemId)
{
for (ElementalSpiritAbsorbItemHolder absorbItem : getAbsorbItems())
{
if (absorbItem.getId() == itemId)
{
return absorbItem;
}
}
return null;
}
public int getExtractAmount()
{
return Math.round(_data.getExperience() / ElementalSpiritData.FRAGMENT_XP_CONSUME);
}
public void resetStage()
{
_data.setLevel((byte) 1);
_data.setExperience(0);
resetCharacteristics();
}
public boolean canEvolve()
{
return (getStage() < 3) && (getLevel() == 10) && (getExperience() == getExperienceToNextLevel());
}
public void upgrade()
{
_data.increaseStage();
_data.setLevel((byte) 1);
_data.setExperience(0);
_template = ElementalSpiritData.getInstance().getSpirit(_data.getType(), _data.getStage());
EventDispatcher.getInstance().notifyEventAsync(new OnElementalSpiritUpgrade(_owner, this), _owner);
}
public void resetCharacteristics()
{
_data.setAttackPoints((byte) 0);
_data.setDefensePoints((byte) 0);
_data.setCritRatePoints((byte) 0);
_data.setCritDamagePoints((byte) 0);
}
public byte getType()
{
return _template.getType();
}
public byte getStage()
{
return _template.getStage();
}
public int getNpcId()
{
return _template.getNpcId();
}
public long getExperience()
{
return _data.getExperience();
}
public long getExperienceToNextLevel()
{
return _template.getMaxExperienceAtLevel(_data.getLevel());
}
public byte getLevel()
{
return _data.getLevel();
}
public int getMaxLevel()
{
return _template.getMaxLevel();
}
public int getAttack()
{
return _template.getAttackAtLevel(_data.getLevel()) + (_data.getAttackPoints() * 5);
}
public int getDefense()
{
return _template.getDefenseAtLevel(_data.getLevel()) + (_data.getDefensePoints() * 5);
}
public int getMaxCharacteristics()
{
return _template.getMaxCharacteristics();
}
public int getAttackPoints()
{
return _data.getAttackPoints();
}
public int getDefensePoints()
{
return _data.getDefensePoints();
}
public int getCriticalRatePoints()
{
return _data.getCritRatePoints();
}
public int getCriticalDamagePoints()
{
return _data.getCritDamagePoints();
}
public List<ItemHolder> getItemsToEvolve()
{
return _template.getItemsToEvolve();
}
public List<ElementalSpiritAbsorbItemHolder> getAbsorbItems()
{
return _template.getAbsorbItems();
}
public int getExtractItem()
{
return _template.getExtractItem();
}
public void save()
{
ElementalSpiritInstanceManager.getInstance().save(_data);
}
public void addAttackPoints(byte attackPoints)
{
_data.addAttackPoints(attackPoints);
}
public void addDefensePoints(byte defensePoints)
{
_data.addDefensePoints(defensePoints);
}
public void addCritRatePoints(byte critRatePoints)
{
_data.addCritRatePoints(critRatePoints);
}
public void addCritDamage(byte critDamagePoints)
{
_data.addCritDamagePoints(critDamagePoints);
}
public int getCriticalRate()
{
return _template.getCriticalRateAtLevel(_data.getLevel()) + getCriticalRatePoints();
}
public int getCriticalDamage()
{
return _template.getCriticalDamageAtLevel(_data.getLevel()) + getCriticalRatePoints();
}
public void setInUse(boolean value)
{
_data.setInUse(value);
}
}

View File

@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.datatables.EventDroplist.DateDrop;
import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
@ -50,6 +51,7 @@ import org.l2jmobius.gameserver.instancemanager.WalkingManager;
import org.l2jmobius.gameserver.model.AggroInfo;
import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.DamageDoneInfo;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.Party;
import org.l2jmobius.gameserver.model.Seed;
import org.l2jmobius.gameserver.model.WorldObject;
@ -519,6 +521,8 @@ public class Attackable extends Npc
attacker.updateVitalityPoints(getVitalityPoints(attacker.getLevel(), exp, _isRaid), true, false);
PcCafePointsManager.getInstance().givePcCafePoint(attacker, exp);
}
rewardAttributeExp(attacker, damage, totalDamage);
}
}
}
@ -616,6 +620,11 @@ public class Attackable extends Npc
if (partyDmg > 0)
{
attackerParty.distributeXpAndSp(exp, sp, rewardedMembers, partyLvl, partyDmg, this);
for (PlayerInstance rewardedMember : rewardedMembers)
{
rewardAttributeExp(rewardedMember, damage, totalDamage);
}
}
}
}
@ -627,6 +636,19 @@ public class Attackable extends Npc
}
}
private void rewardAttributeExp(PlayerInstance player, long damage, long totalDamage)
{
if ((player.getActiveElementalSpiritType() > 0) && (getAttributeExp() > 0) && (getElementalSpiritType() != ElementalType.NONE))
{
final long attributeExp = (long) (((getAttributeExp() * damage) / totalDamage) * player.getElementalSpiritXpBonus());
final ElementalSpirit spirit = player.getElementalSpirit(getElementalSpiritType().getDominating());
if (spirit != null)
{
spirit.addExperience(attributeExp);
}
}
}
@Override
public void addAttackerToAttackByList(Creature creature)
{

View File

@ -54,6 +54,7 @@ import org.l2jmobius.gameserver.data.xml.impl.TransformData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BasicProperty;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.Race;
@ -2691,6 +2692,18 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
info.addComponentType(UserInfoType.ATK_ELEMENTAL);
break;
}
case ELEMENTAL_SPIRIT_EARTH_ATTACK:
case ELEMENTAL_SPIRIT_EARTH_DEFENSE:
case ELEMENTAL_SPIRIT_FIRE_ATTACK:
case ELEMENTAL_SPIRIT_FIRE_DEFENSE:
case ELEMENTAL_SPIRIT_WATER_ATTACK:
case ELEMENTAL_SPIRIT_WATER_DEFENSE:
case ELEMENTAL_SPIRIT_WIND_ATTACK:
case ELEMENTAL_SPIRIT_WIND_DEFENSE:
{
info.addComponentType(UserInfoType.ATT_SPIRITS);
break;
}
}
}
}
@ -4506,11 +4519,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
}
final double damageCap = _stat.getValue(Stats.DAMAGE_LIMIT);
if (damageCap > 0)
{
value = Math.min(value, damageCap);
}
double elementalDamage = 0;
// Calculate PvP/PvE damage received. It is a post-attack stat.
if (attacker != null)
@ -4523,6 +4532,15 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
{
value *= (100 + _stat.getValue(Stats.PVE_DAMAGE_TAKEN)) / 100;
}
elementalDamage = Formulas.calcSpiritElementalDamage(attacker, this);
value += elementalDamage;
}
final double damageCap = _stat.getValue(Stats.DAMAGE_LIMIT);
if (damageCap > 0)
{
value = Math.min(value, damageCap);
}
if (Config.CHAMPION_ENABLE && isChampion() && (Config.CHAMPION_HP != 0))
@ -4540,7 +4558,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
if (attacker != null)
{
attacker.sendDamageMessage(this, skill, (int) value, critical, false);
attacker.sendDamageMessage(this, skill, (int) value, elementalDamage, critical, false);
}
}
@ -4671,10 +4689,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
* @param target
* @param skill
* @param damage
* @param elementalDamage
* @param crit
* @param miss
*/
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
{
}
@ -5472,4 +5491,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
_buffFinishTask = null;
}
}
public double getElementalSpiritDefenseOf(ElementalType type)
{
return getElementalSpiritType() == type ? 100 : 0;
}
public ElementalType getElementalSpiritType()
{
return ElementalType.NONE;
}
}

View File

@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AISkillScope;
import org.l2jmobius.gameserver.enums.AIType;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
@ -868,6 +869,17 @@ public class Npc extends Creature
return getTemplate().getSP() * rateMul;
}
public long getAttributeExp()
{
return getTemplate().getAttributeExp();
}
@Override
public ElementalType getElementalSpiritType()
{
return getTemplate().getElementalType();
}
/**
* Kill the NpcInstance (the corpse disappeared after 7 seconds).<br>
* <B><U>Actions</U>:</B>

View File

@ -734,7 +734,7 @@ public abstract class Summon extends Playable
}
@Override
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
{
if (miss || (_owner == null))
{

View File

@ -124,11 +124,11 @@ public class DoppelgangerInstance extends Npc
public void doAttack(double damage, Creature target, Skill skill, boolean isDOT, boolean directlyToHp, boolean critical, boolean reflect)
{
super.doAttack(damage, target, skill, isDOT, directlyToHp, critical, reflect);
sendDamageMessage(target, skill, (int) damage, critical, false);
sendDamageMessage(target, skill, (int) damage, 0, critical, false);
}
@Override
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
{
if (miss || (getSummoner() == null) || !getSummoner().isPlayer())
{

View File

@ -47,6 +47,7 @@ import java.util.stream.Collectors;
import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy;
@ -83,6 +84,7 @@ import org.l2jmobius.gameserver.enums.CastleSide;
import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.GroupType;
import org.l2jmobius.gameserver.enums.HtmlActionScope;
import org.l2jmobius.gameserver.enums.IllegalActionPunishmentType;
@ -108,6 +110,7 @@ import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import org.l2jmobius.gameserver.instancemanager.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import org.l2jmobius.gameserver.instancemanager.DuelManager;
import org.l2jmobius.gameserver.instancemanager.ElementalSpiritInstanceManager;
import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
@ -125,6 +128,7 @@ import org.l2jmobius.gameserver.model.ArenaParticipantsHolder;
import org.l2jmobius.gameserver.model.BlockList;
import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.ContactList;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.Macro;
import org.l2jmobius.gameserver.model.MacroList;
@ -213,6 +217,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerReputa
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerSubChange;
import org.l2jmobius.gameserver.model.fishing.Fishing;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
@ -847,6 +852,9 @@ public final class PlayerInstance extends Playable
private final Set<Integer> _whisperers = ConcurrentHashMap.newKeySet();
private ElementalSpirit[] _spirits;
private ElementalType _activeElementalSpiritType;
// Selling buffs system
private boolean _isSellingBuffs = false;
private List<SellBuffHolder> _sellingBuffs = null;
@ -2350,6 +2358,7 @@ public final class PlayerInstance extends Playable
if (getClassId().level() == 3)
{
sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_YOUR_THIRD_CLASS_TRANSFER_QUEST);
initElementalSpirits();
}
else
{
@ -6662,6 +6671,11 @@ public final class PlayerInstance extends Playable
player.setSponsor(rset.getInt("sponsor"));
player.setLvlJoinedAcademy(rset.getInt("lvl_joined_academy"));
if ((player.getLevel() >= 76) && (player.getClassId().level() > 2))
{
player.initElementalSpirits();
}
CursedWeaponsManager.getInstance().checkPlayer(player);
// Set the x,y,z position of the PlayerInstance and make it invisible
@ -7085,6 +7099,17 @@ public final class PlayerInstance extends Playable
{
aVars.storeMe();
}
if (_spirits != null)
{
for (ElementalSpirit spirit : _spirits)
{
if (spirit != null)
{
spirit.save();
}
}
}
}
@Override
@ -11434,7 +11459,7 @@ public final class PlayerInstance extends Playable
}
@Override
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
{
// Check if hit is missed
if (miss)
@ -11496,8 +11521,16 @@ public final class PlayerInstance extends Playable
sm.addInt(damage);
}
else if (this != target)
{
if (elementalDamage != 0)
{
sm = new SystemMessage(SystemMessageId.S1_HAS_INFLICTED_S3_DAMAGE_ATTRIBUTE_DAMAGE_S4_TO_S2);
}
else
{
sm = new SystemMessage(SystemMessageId.C1_HAS_INFLICTED_S3_DAMAGE_ON_C2);
}
sm.addPcName(this);
// Localisation related.
@ -11513,6 +11546,10 @@ public final class PlayerInstance extends Playable
sm.addString(targetName);
sm.addInt(damage);
if (elementalDamage != 0)
{
sm.addInt((int) elementalDamage);
}
sm.addPopup(target.getObjectId(), getObjectId(), -damage);
}
@ -13922,4 +13959,139 @@ public final class PlayerInstance extends Playable
getVariables().set(ATTENDANCE_INDEX_VAR, rewardIndex);
}
}
public void initElementalSpirits()
{
tryLoadSpirits();
if (_spirits == null)
{
final ElementalType[] types = ElementalType.values();
_spirits = new ElementalSpirit[types.length - 1]; // exclude None
for (ElementalType type : types)
{
if (ElementalType.NONE == type)
{
continue;
}
final ElementalSpirit spirit = new ElementalSpirit(type, this);
_spirits[type.getId() - 1] = spirit;
spirit.save();
}
}
if (_activeElementalSpiritType == null)
{
changeElementalSpirit(ElementalType.FIRE.getId());
}
}
private void tryLoadSpirits()
{
final List<ElementalSpiritDataHolder> spiritsData = ElementalSpiritInstanceManager.getInstance().findByPlayerId(getObjectId());
if (!spiritsData.isEmpty())
{
_spirits = new ElementalSpirit[ElementalType.values().length - 1];
for (ElementalSpiritDataHolder spiritData : spiritsData)
{
_spirits[spiritData.getType() - 1] = new ElementalSpirit(spiritData, this);
if (spiritData.isInUse())
{
_activeElementalSpiritType = ElementalType.of(spiritData.getType());
}
}
}
}
public double getActiveElementalSpiritAttack()
{
return getStat().getElementalSpiritPower(_activeElementalSpiritType, CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getAttack));
}
public double getFireSpiritDefense()
{
return getElementalSpiritDefenseOf(ElementalType.FIRE);
}
public double getWaterSpiritDefense()
{
return getElementalSpiritDefenseOf(ElementalType.WATER);
}
public double getWindSpiritDefense()
{
return getElementalSpiritDefenseOf(ElementalType.WIND);
}
public double getEarthSpiritDefense()
{
return getElementalSpiritDefenseOf(ElementalType.EARTH);
}
@Override
public double getElementalSpiritDefenseOf(ElementalType type)
{
return getStat().getElementalSpiritDefense(type, CommonUtil.zeroIfNullOrElse(getElementalSpirit(type), ElementalSpirit::getDefense));
}
public double getElementalSpiritCritRate()
{
return getStat().getElementalSpiritCriticalRate(CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getCriticalRate));
}
public double getElementalSpiritCritDamage()
{
return getStat().getElementalSpiritCriticalDamage(CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getCriticalDamage));
}
public double getElementalSpiritXpBonus()
{
return getStat().getElementalSpiritXpBonus();
}
public ElementalSpirit getElementalSpirit(ElementalType type)
{
if ((_spirits == null) || (type == null) || (type == ElementalType.NONE))
{
return null;
}
return _spirits[type.getId() - 1];
}
public byte getActiveElementalSpiritType()
{
return (byte) CommonUtil.zeroIfNullOrElse(_activeElementalSpiritType, ElementalType::getId);
}
public void changeElementalSpirit(byte element)
{
_activeElementalSpiritType = ElementalType.of(element);
if (_spirits != null)
{
for (ElementalSpirit spirit : _spirits)
{
if (spirit != null)
{
spirit.setInUse(spirit.getType() == element);
}
}
}
final UserInfo userInfo = new UserInfo(this, false);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
sendPacket(userInfo);
}
public ElementalSpirit[] getSpirits()
{
return _spirits;
}
public boolean isInBattle()
{
return AttackStanceTaskManager.getInstance().hasAttackStanceTask(this);
}
}

View File

@ -249,11 +249,11 @@ public final class TrapInstance extends Npc
public void doAttack(double damage, Creature target, Skill skill, boolean isDOT, boolean directlyToHp, boolean critical, boolean reflect)
{
super.doAttack(damage, target, skill, isDOT, directlyToHp, critical, reflect);
sendDamageMessage(target, skill, (int) damage, critical, false);
sendDamageMessage(target, skill, (int) damage, 0, critical, false);
}
@Override
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
{
if (miss || (_owner == null))
{

View File

@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.PartySmallWindowUpdateType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.Party;
@ -684,6 +685,31 @@ public class PlayerStat extends PlayableStat
return (int) getValue(Stats.ARTIFACT_SLOTS, 0);
}
public double getElementalSpiritXpBonus()
{
return getValue(Stats.ELEMENTAL_SPIRIT_BONUS_EXP, 1);
}
public double getElementalSpiritPower(ElementalType type, double base)
{
return type == null ? 0 : getValue(type.getAttackStat(), base);
}
public double getElementalSpiritCriticalRate(int base)
{
return getValue(Stats.ELEMENTAL_SPIRIT_CRITICAL_RATE, base);
}
public double getElementalSpiritCriticalDamage(double base)
{
return getValue(Stats.ELEMENTAL_SPIRIT_CRITICAL_DAMAGE, base);
}
public double getElementalSpiritDefense(ElementalType type, double base)
{
return type == null ? 0 : getValue(type.getDefenseStat(), base);
}
@Override
protected void onRecalculateStats(boolean broadcast)
{

View File

@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AISkillScope;
import org.l2jmobius.gameserver.enums.AIType;
import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.MpRewardType;
import org.l2jmobius.gameserver.enums.Race;
@ -118,6 +119,9 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
private List<Integer> _extendDrop;
private ElementalType _elementalType;
private long _attributeExp;
/**
* Constructor of Creature.
* @param set The StatsSet object to transfer data to the method
@ -142,6 +146,8 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
setRace(set.getEnum("race", Race.class, Race.NONE));
_sex = set.getEnum("sex", Sex.class, Sex.ETC);
_elementalType = set.getEnum("elementalType", ElementalType.class, ElementalType.NONE);
_chestId = set.getInt("chestId", 0);
_rhandId = set.getInt("rhandId", 0);
_lhandId = set.getInt("lhandId", 0);
@ -150,6 +156,7 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
_exp = set.getDouble("exp", 0);
_sp = set.getDouble("sp", 0);
_raidPoints = set.getDouble("raidPoints", 0);
_attributeExp = set.getLong("attribute_exp", 0);
_unique = set.getBoolean("unique", false);
_attackable = set.getBoolean("attackable", true);
@ -354,6 +361,16 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
return _raidPoints;
}
public long getAttributeExp()
{
return _attributeExp;
}
public ElementalType getElementalType()
{
return _elementalType;
}
public boolean isUnique()
{
return _unique;

View File

@ -37,6 +37,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneExit;
import org.l2jmobius.gameserver.model.events.impl.creature.OnElementalSpiritUpgrade;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAggroRangeEnter;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAttack;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableFactionCall;
@ -56,6 +57,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSkillSee;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSpawn;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleport;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleportRequest;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnElementalSpiritLearn;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment;
@ -286,7 +288,10 @@ public enum EventType
ON_INSTANCE_DESTROY(OnInstanceDestroy.class, void.class),
ON_INSTANCE_ENTER(OnInstanceEnter.class, void.class),
ON_INSTANCE_LEAVE(OnInstanceLeave.class, void.class),
ON_INSTANCE_STATUS_CHANGE(OnInstanceStatusChange.class, void.class);
ON_INSTANCE_STATUS_CHANGE(OnInstanceStatusChange.class, void.class),
ON_ELEMENTAL_SPIRIT_UPGRADE(OnElementalSpiritUpgrade.class, void.class),
ON_ELEMENTAL_SPIRIT_LEARN(OnElementalSpiritLearn.class, void.class);
private final Class<? extends IBaseEvent> _eventClass;
private final Class<?>[] _returnClass;

View File

@ -0,0 +1,53 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author JoeAlisson
*/
public class OnElementalSpiritUpgrade implements IBaseEvent
{
private final ElementalSpirit _spirit;
private final PlayerInstance _player;
public OnElementalSpiritUpgrade(PlayerInstance player, ElementalSpirit spirit)
{
_player = player;
_spirit = spirit;
}
public ElementalSpirit getSpirit()
{
return _spirit;
}
public PlayerInstance getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_ELEMENTAL_SPIRIT_UPGRADE;
}
}

View File

@ -0,0 +1,45 @@
/*
* 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 org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
/**
* @author JoeAlisson
*/
public class OnElementalSpiritLearn implements IBaseEvent
{
private final PlayerInstance _player;
public OnElementalSpiritLearn(PlayerInstance player)
{
_player = player;
}
public PlayerInstance getPlayer()
{
return _player;
}
@Override
public EventType getType()
{
return EventType.ON_ELEMENTAL_SPIRIT_LEARN;
}
}

View File

@ -0,0 +1,42 @@
/*
* 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 org.l2jmobius.gameserver.model.holders;
/**
* @author JoeAlisson
*/
public class ElementalSpiritAbsorbItemHolder
{
private final int _id;
private final int _experience;
public ElementalSpiritAbsorbItemHolder(int itemId, int experience)
{
_id = itemId;
_experience = experience;
}
public int getId()
{
return _id;
}
public int getExperience()
{
return _experience;
}
}

View File

@ -0,0 +1,179 @@
/*
* 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 org.l2jmobius.gameserver.model.holders;
/**
* @author JoeAlisson
*/
public class ElementalSpiritDataHolder
{
private int _charId;
private byte _type;
private byte _level = 1;
private byte _stage;
private long _experience;
private byte _attackPoints;
private byte _defensePoints;
private byte _critRatePoints;
private byte _critDamagePoints;
private boolean _inUse;
public ElementalSpiritDataHolder()
{
}
public ElementalSpiritDataHolder(byte type, int objectId)
{
_charId = objectId;
_type = type;
}
public int getCharId()
{
return _charId;
}
public void setCharId(int charId)
{
_charId = charId;
}
public byte getType()
{
return _type;
}
public void setType(byte type)
{
_type = type;
}
public byte getLevel()
{
return _level;
}
public void setLevel(byte level)
{
_level = level;
}
public byte getStage()
{
return _stage;
}
public void setStage(byte stage)
{
_stage = stage;
}
public long getExperience()
{
return _experience;
}
public void setExperience(long experience)
{
_experience = experience;
}
public byte getAttackPoints()
{
return _attackPoints;
}
public void setAttackPoints(byte attackPoints)
{
_attackPoints = attackPoints;
}
public byte getDefensePoints()
{
return _defensePoints;
}
public void setDefensePoints(byte defensePoints)
{
_defensePoints = defensePoints;
}
public byte getCritRatePoints()
{
return _critRatePoints;
}
public void setCritRatePoints(byte critRatePoints)
{
_critRatePoints = critRatePoints;
}
public byte getCritDamagePoints()
{
return _critDamagePoints;
}
public void setCritDamagePoints(byte critDamagePoints)
{
_critDamagePoints = critDamagePoints;
}
public void addExperience(long experience)
{
_experience += experience;
}
public void increaseLevel()
{
_level++;
}
public boolean isInUse()
{
return _inUse;
}
public void setInUse(boolean value)
{
_inUse = value;
}
public void addAttackPoints(byte attackPoints)
{
_attackPoints += attackPoints;
}
public void addDefensePoints(byte defensePoints)
{
_defensePoints += defensePoints;
}
public void addCritRatePoints(byte critRatePoints)
{
_critRatePoints = critRatePoints;
}
public void addCritDamagePoints(byte critDamagePoints)
{
_critDamagePoints += critDamagePoints;
}
public void increaseStage()
{
_stage++;
}
}

View File

@ -0,0 +1,156 @@
/*
* 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 org.l2jmobius.gameserver.model.holders;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author JoeAlisson
*/
public class ElementalSpiritTemplateHolder
{
private final byte _type;
private final byte _stage;
private final int _npcId;
private final int _maxCharacteristics;
private final int _extractItem;
private final Map<Byte, SpiritLevel> _levels;
private List<ItemHolder> _itemsToEvolve;
private List<ElementalSpiritAbsorbItemHolder> _absorbItems;
public ElementalSpiritTemplateHolder(byte type, byte stage, int npcId, int extractItem, int maxCharacteristics)
{
_type = type;
_stage = stage;
_npcId = npcId;
_extractItem = extractItem;
_maxCharacteristics = maxCharacteristics;
_levels = new HashMap<>(10);
}
public void addLevelInfo(int level, int attack, int defense, int criticalRate, int criticalDamage, long maxExperience)
{
final SpiritLevel spiritLevel = new SpiritLevel();
spiritLevel.attack = attack;
spiritLevel.defense = defense;
spiritLevel.criticalRate = criticalRate;
spiritLevel.criticalDamage = criticalDamage;
spiritLevel.maxExperience = maxExperience;
_levels.put((byte) level, spiritLevel);
}
public void addItemToEvolve(Integer itemId, Integer count)
{
if (_itemsToEvolve == null)
{
_itemsToEvolve = new ArrayList<>(2);
}
_itemsToEvolve.add(new ItemHolder(itemId, count));
}
public byte getType()
{
return _type;
}
public byte getStage()
{
return _stage;
}
public int getNpcId()
{
return _npcId;
}
public long getMaxExperienceAtLevel(byte level)
{
return _levels.get(level).maxExperience;
}
public int getMaxLevel()
{
return _levels.size();
}
public int getAttackAtLevel(byte level)
{
return _levels.get(level).attack;
}
public int getDefenseAtLevel(byte level)
{
return _levels.get(level).defense;
}
public int getCriticalRateAtLevel(byte level)
{
return _levels.get(level).criticalRate;
}
public int getCriticalDamageAtLevel(byte level)
{
return _levels.get(level).criticalDamage;
}
public int getMaxCharacteristics()
{
return _maxCharacteristics;
}
public List<ItemHolder> getItemsToEvolve()
{
return _itemsToEvolve == null ? Collections.emptyList() : _itemsToEvolve;
}
public void addAbsorbItem(Integer itemId, Integer experience)
{
if (_absorbItems == null)
{
_absorbItems = new ArrayList<>();
}
_absorbItems.add(new ElementalSpiritAbsorbItemHolder(itemId, experience));
}
public List<ElementalSpiritAbsorbItemHolder> getAbsorbItems()
{
return _absorbItems == null ? Collections.emptyList() : _absorbItems;
}
public int getExtractItem()
{
return _extractItem;
}
private static class SpiritLevel
{
public SpiritLevel()
{
}
long maxExperience;
int criticalDamage;
int criticalRate;
int defense;
int attack;
}
}

View File

@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.data.xml.impl.KarmaData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.BasicProperty;
import org.l2jmobius.gameserver.enums.DispelSlotType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.Position;
import org.l2jmobius.gameserver.enums.ShotType;
import org.l2jmobius.gameserver.model.actor.Creature;
@ -1652,4 +1653,77 @@ public final class Formulas
return 1;
}
public static double calcSpiritElementalDamage(Creature attacker, Creature target)
{
if (attacker.isPlayer())
{
final PlayerInstance attackerPlayer = attacker.getActingPlayer();
ElementalType type = ElementalType.of(attackerPlayer.getActiveElementalSpiritType());
if (ElementalType.NONE == type)
{
return 0;
}
final double critRate = attackerPlayer.getElementalSpiritCritRate();
final boolean isCrit = Math.min(critRate, 380) > Rnd.get(1000);
final double critDamage = attackerPlayer.getElementalSpiritCritDamage();
final double attack = attackerPlayer.getActiveElementalSpiritAttack() - target.getElementalSpiritDefenseOf(type);
if (target.isPlayer())
{
return calcSpiritElementalPvPDamage(attack, critDamage, isCrit);
}
return calcSpiritElementalPvEDamage(type, target.getElementalSpiritType(), attack, critDamage, isCrit);
}
return 0;
}
private static double calcSpiritElementalPvPDamage(double attack, double critDamage, boolean isCrit)
{
double damage = (attack * 1.223) + Rnd.get(-20, +20);
if (isCrit)
{
damage += (attack * 1.223) + (((attack * 0.03) + 24) * critDamage) + Rnd.get(-5, 30);
}
return damage;
}
private static double calcSpiritElementalPvEDamage(ElementalType attackerType, ElementalType targetType, double attack, double critDamage, boolean isCrit)
{
double damage;
double baseDamage = (attack * 0.8) + Rnd.get(-25, 25);
double bonus = 1;
if (targetType == ElementalType.NONE)
{
damage = attack * 0.735;
}
else if (attackerType.getDominating() == targetType)
{
damage = (-1136 + baseDamage) * 0.6;
bonus = 0.6;
}
else if (targetType.getDominating() == attackerType)
{
damage = (185 + baseDamage) * 1.2;
bonus = 1.2;
}
else if (targetType == attackerType)
{
damage = baseDamage;
}
else
{
damage = (-477 + baseDamage) * 0.8;
bonus = 0.8;
}
if (isCrit)
{
damage += ((40 + ((9.2 + (attack * 0.048)) * critDamage)) * bonus) + Rnd.get(-10, 50);
}
return damage;
}
}

View File

@ -89,6 +89,19 @@ public enum Stats
HATE_ATTACK("attackHate"),
REAR_DAMAGE_RATE("rearDamage"),
// ELEMENTAL SPIRITS
ELEMENTAL_SPIRIT_FIRE_ATTACK("elementalSpiritFireAttack"),
ELEMENTAL_SPIRIT_WATER_ATTACK("elementalSpiritWaterAttack"),
ELEMENTAL_SPIRIT_WIND_ATTACK("elementalSpiritWindAttack"),
ELEMENTAL_SPIRIT_EARTH_ATTACK("elementalSpiritEarthAttack"),
ELEMENTAL_SPIRIT_FIRE_DEFENSE("elementalSpiritFireDefense"),
ELEMENTAL_SPIRIT_WATER_DEFENSE("elementalSpiritWaterDefense"),
ELEMENTAL_SPIRIT_WIND_DEFENSE("elementalSpiritWindDefense"),
ELEMENTAL_SPIRIT_EARTH_DEFENSE("elementalSpiritEarthDefense"),
ELEMENTAL_SPIRIT_CRITICAL_RATE("elementalSpiritCriticalRate"),
ELEMENTAL_SPIRIT_CRITICAL_DAMAGE("elementalSpiritCriticalDamage"),
ELEMENTAL_SPIRIT_BONUS_EXP("elementalSpiritExp"),
// PVP BONUS
PVP_PHYSICAL_ATTACK_DAMAGE("pvpPhysDmg"),
PVP_MAGICAL_SKILL_DAMAGE("pvpMagicalDmg"),

View File

@ -60,7 +60,16 @@ import org.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrys
import org.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrystallizeItemCancel;
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestOneDayRewardReceive;
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestTodoList;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalInitTalent;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritAbsorb;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritAbsorbInfo;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritChangeType;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritEvolution;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritEvolutionInfo;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritExtract;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritExtractInfo;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritInfo;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritSetTalent;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
@ -423,21 +432,21 @@ public enum ExIncomingPackets implements IIncomingPackets<GameClient>
EX_PLEDGE_ITEM_INFO(0x14E, null, ConnectionState.IN_GAME),
EX_PLEDGE_ITEM_BUY(0x14F, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_INFO(0x150, ExElementalSpiritInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB(0x158, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, ExElementalSpiritExtractInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, ExElementalSpiritExtract::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, ExElementalSpiritEvolutionInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, ExElementalSpiritEvolution::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, ExElementalSpiritSetTalent::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, ExElementalInitTalent::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, ExElementalSpiritAbsorbInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB(0x158, ExElementalSpiritAbsorb::new, ConnectionState.IN_GAME),
EX_REQUEST_LOCKED_ITEM(0x159, null, ConnectionState.IN_GAME),
EX_REQUEST_UNLOCKED_ITEM(0x15A, null, ConnectionState.IN_GAME),
EX_LOCKED_ITEM_CANCEL(0x15B, null, ConnectionState.IN_GAME),
EX_UNLOCKED_ITEM_CANCEL(0x15C, null, ConnectionState.IN_GAME),
REQUEST_BLOCK_LIST_FOR_AD(0x15D, null, ConnectionState.IN_GAME),
REQUEST_USER_BAN_INFO(0x15E, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15F, null, ConnectionState.IN_GAME), // 152
EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15D, ExElementalSpiritChangeType::new, ConnectionState.IN_GAME), // 152
REQUEST_BLOCK_LIST_FOR_AD(0x15E, null, ConnectionState.IN_GAME),
REQUEST_USER_BAN_INFO(0x15F, null, ConnectionState.IN_GAME),
EX_INTERACT_MODIFY(0x160, null, ConnectionState.IN_GAME), // 152
EX_TRY_ENCHANT_ARTIFACT(0x161, null, ConnectionState.IN_GAME), // 152
EX_XIGN_CODE(0x162, null, ConnectionState.IN_GAME); // 152

View File

@ -0,0 +1,78 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.impl.ElementalSpiritData;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritSetTalent;
/**
* @author JoeAlisson
*/
public class ExElementalInitTalent implements IClientIncomingPacket
{
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
client.sendPacket(SystemMessageId.NO_SPIRITS_ARE_AVAILABLE);
return;
}
if (player.isInBattle())
{
client.sendPacket(new SystemMessage(SystemMessageId.UNABLE_TO_RESET_SPIRIT_ATTRIBUTE_DURING_BATTLE));
client.sendPacket(new ElementalSpiritSetTalent(player, _type, false));
return;
}
if (player.reduceAdena("Talent", ElementalSpiritData.TALENT_INIT_FEE, player, true))
{
spirit.resetCharacteristics();
client.sendPacket(new SystemMessage(SystemMessageId.RESET_THE_SELECTED_SPIRIT_S_CHARACTERISTICS_SUCCESSFULLY));
client.sendPacket(new ElementalSpiritSetTalent(player, _type, true));
}
else
{
client.sendPacket(new ElementalSpiritSetTalent(player, _type, false));
}
}
}

View File

@ -0,0 +1,110 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritAbsorbItemHolder;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritAbsorb;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritAbsorb implements IClientIncomingPacket
{
private byte _type;
private int _itemId;
private int _amount;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
packet.readD(); // items for now is always 1
_itemId = packet.readD();
_amount = packet.readD();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
client.sendPacket(SystemMessageId.NO_SPIRITS_ARE_AVAILABLE);
return;
}
final ElementalSpiritAbsorbItemHolder absorbItem = spirit.getAbsorbItem(_itemId);
if (absorbItem == null)
{
player.sendPacket(new ElementalSpiritAbsorb(player, _type, false));
return;
}
final boolean canAbsorb = checkConditions(player, spirit);
if (canAbsorb)
{
client.sendPacket(SystemMessageId.SUCCESFUL_ABSORPTION);
spirit.addExperience(absorbItem.getExperience() * _amount);
final UserInfo userInfo = new UserInfo(player);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
client.sendPacket(userInfo);
}
client.sendPacket(new ElementalSpiritAbsorb(player, _type, canAbsorb));
}
private boolean checkConditions(PlayerInstance player, ElementalSpirit spirit)
{
if (player.getPrivateStoreType() != PrivateStoreType.NONE)
{
player.sendPacket(SystemMessageId.CANNOT_EVOLVE_ABSORB_EXTRACT_WHILE_USING_THE_PRIVATE_STORE_WORKSHOP);
return false;
}
if (player.isInBattle())
{
player.sendPacket(SystemMessageId.UNABLE_TO_ABSORB_DURING_BATTLE);
return false;
}
if ((spirit.getLevel() == spirit.getMaxLevel()) && (spirit.getExperience() == spirit.getExperienceToNextLevel()))
{
player.sendPacket(SystemMessageId.UNABLE_TO_ABSORB_BECAUSE_REACHED_MAXIMUM_LEVEL);
return false;
}
if ((_amount < 1) || !player.destroyItemByItemId("Absorb", _itemId, _amount, player, true))
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS_TO_ABSORB);
return false;
}
return true;
}
}

View File

@ -0,0 +1,51 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritAbsorbInfo;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritAbsorbInfo implements IClientIncomingPacket
{
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
packet.readC(); // unk
_type = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
client.sendPacket(new ElementalSpiritAbsorbInfo(player, _type));
}
}

View File

@ -0,0 +1,65 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritChangeType implements IClientIncomingPacket
{
private byte _type;
private byte _element;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
_element = (byte) packet.readC(); // 1 - Fire, 2 - Water, 3 - Wind, 4 Earth
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
client.sendPacket(SystemMessageId.NO_SPIRITS_ARE_AVAILABLE);
return;
}
player.changeElementalSpirit(_element);
client.sendPacket(new ElementalSpiritInfo(player, _element, _type));
client.sendPacket(new SystemMessage(SystemMessageId.S1_WILL_BE_YOUR_ATTRIBUTE_ATTACK_FROM_NOW_ON).addElementalSpirit(_element));
}
}

View File

@ -0,0 +1,129 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import java.util.stream.Collectors;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InventoryBlockType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritEvolution;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritEvolution implements IClientIncomingPacket
{
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
client.sendPacket(SystemMessageId.NO_SPIRITS_ARE_AVAILABLE);
return;
}
final boolean canEvolve = checkConditions(player, spirit);
if (canEvolve)
{
spirit.upgrade();
client.sendPacket(new SystemMessage(SystemMessageId.S1_EVOLVED_TO_S2_STAR).addElementalSpirit(_type).addInt(spirit.getStage()));
final UserInfo userInfo = new UserInfo(player);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
client.sendPacket(userInfo);
}
client.sendPacket(new ElementalSpiritEvolution(player, _type, canEvolve));
}
private boolean checkConditions(PlayerInstance player, ElementalSpirit spirit)
{
if (player.getPrivateStoreType() != PrivateStoreType.NONE)
{
player.sendPacket(SystemMessageId.CANNOT_EVOLVE_ABSORB_EXTRACT_WHILE_USING_THE_PRIVATE_STORE_WORKSHOP);
return false;
}
if (player.isInBattle())
{
player.sendPacket(SystemMessageId.UNABLE_TO_EVOLVE_DURING_BATTLE);
return false;
}
if (!spirit.canEvolve())
{
player.sendPacket(SystemMessageId.THIS_SPIRIT_CANNOT_EVOLVE);
return false;
}
if (!consumeEvolveItems(player, spirit))
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS_FOR_EVOLUTION);
return false;
}
return true;
}
private boolean consumeEvolveItems(PlayerInstance player, ElementalSpirit spirit)
{
final PlayerInventory inventory = player.getInventory();
try
{
inventory.setInventoryBlock(spirit.getItemsToEvolve().stream().map(ItemHolder::getId).collect(Collectors.toList()), InventoryBlockType.BLACKLIST);
for (ItemHolder itemHolder : spirit.getItemsToEvolve())
{
if (inventory.getInventoryItemCount(itemHolder.getId(), -1) < itemHolder.getCount())
{
return false;
}
}
for (ItemHolder itemHolder : spirit.getItemsToEvolve())
{
player.destroyItemByItemId("Evolve", itemHolder.getId(), itemHolder.getCount(), player, true);
}
return true;
}
finally
{
inventory.unblock();
}
}
}

View File

@ -0,0 +1,50 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritEvolutionInfo;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritEvolutionInfo implements IClientIncomingPacket
{
private byte _id;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_id = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
client.sendPacket(new ElementalSpiritEvolutionInfo(player, _id));
}
}

View File

@ -0,0 +1,108 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.impl.ElementalSpiritData;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.PrivateStoreType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritExtract;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritExtract implements IClientIncomingPacket
{
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
client.sendPacket(SystemMessageId.NO_SPIRITS_ARE_AVAILABLE);
return;
}
final boolean canExtract = checkConditions(player, spirit);
if (canExtract)
{
final int amount = spirit.getExtractAmount();
client.sendPacket(new SystemMessage(SystemMessageId.EXTRACTED_S1_S2_SUCCESSFULLY).addItemName(spirit.getExtractItem()).addInt(amount));
spirit.resetStage();
player.addItem("Extract", spirit.getExtractItem(), amount, player, true);
final UserInfo userInfo = new UserInfo(player);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
client.sendPacket(userInfo);
}
client.sendPacket(new ElementalSpiritExtract(player, _type, canExtract));
}
private boolean checkConditions(PlayerInstance player, ElementalSpirit spirit)
{
if (spirit.getExtractAmount() < 1)
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_ATTRIBUTE_XP_FOR_EXTRACTION);
return false;
}
if (!player.getInventory().validateCapacity(1))
{
player.sendPacket(SystemMessageId.UNABLE_TO_EXTRACT_BECAUSE_INVENTORY_IS_FULL);
return false;
}
if (player.getPrivateStoreType() != PrivateStoreType.NONE)
{
player.sendPacket(SystemMessageId.CANNOT_EVOLVE_ABSORB_EXTRACT_WHILE_USING_THE_PRIVATE_STORE_WORKSHOP);
return false;
}
if (player.isInBattle())
{
player.sendPacket(SystemMessageId.UNABLE_TO_EVOLVE_DURING_BATTLE);
return false;
}
if (!player.reduceAdena("Extract", ElementalSpiritData.EXTRACT_FEE, player, true))
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_INGREDIENTS_TO_EXTRACT);
return false;
}
return true;
}
}

View File

@ -0,0 +1,51 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritExtractInfo;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritExtractInfo implements IClientIncomingPacket
{
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
client.sendPacket(new ElementalSpiritExtractInfo(player, _type));
}
}

View File

@ -20,19 +20,19 @@ import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
/**
* @author Mobius
* @author JoeAlisson
*/
public class ExElementalSpiritInfo implements IClientIncomingPacket
{
@SuppressWarnings("unused")
private int _id;
private byte _type;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_id = packet.readC();
_type = (byte) packet.readC();
return true;
}
@ -45,6 +45,6 @@ public class ExElementalSpiritInfo implements IClientIncomingPacket
return;
}
// player.sendPacket(new org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ExElementalSpiritInfo());
client.sendPacket(new ElementalSpiritInfo(player, player.getActiveElementalSpiritType(), _type));
}
}

View File

@ -0,0 +1,109 @@
/*
* 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 org.l2jmobius.gameserver.network.clientpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import org.l2jmobius.gameserver.network.serverpackets.UserInfo;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritSetTalent;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritSetTalent implements IClientIncomingPacket
{
private byte _type;
private byte _attackPoints;
private byte _defensePoints;
private byte _critRate;
private byte _critDamage;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_type = (byte) packet.readC();
packet.readC(); // Characteristics for now always 4
packet.readC(); // attack id
_attackPoints = (byte) packet.readC();
packet.readC(); // defense id
_defensePoints = (byte) packet.readC();
packet.readC(); // crit rate id
_critRate = (byte) packet.readC();
packet.readC(); // crit damage id
_critDamage = (byte) packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
final ElementalSpirit spirit = player.getElementalSpirit(ElementalType.of(_type));
boolean result = false;
if (spirit != null)
{
if ((_attackPoints > 0) && (spirit.getAvailableCharacteristicsPoints() >= _attackPoints))
{
spirit.addAttackPoints(_attackPoints);
result = true;
}
if ((_defensePoints > 0) && (spirit.getAvailableCharacteristicsPoints() >= _defensePoints))
{
spirit.addDefensePoints(_defensePoints);
result = true;
}
if ((_critRate > 0) && (spirit.getAvailableCharacteristicsPoints() >= _critRate))
{
spirit.addCritRatePoints(_critRate);
result = true;
}
if ((_critDamage > 0) && (spirit.getAvailableCharacteristicsPoints() >= _critDamage))
{
spirit.addCritDamage(_critDamage);
result = true;
}
}
if (result)
{
final UserInfo userInfo = new UserInfo(player);
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
client.sendPacket(userInfo);
client.sendPacket(new SystemMessage(SystemMessageId.CHARACTERISTICS_WERE_APPLIED_SUCCESSFULLY));
}
client.sendPacket(new ElementalSpiritSetTalent(player, _type, result));
}
}

View File

@ -80,6 +80,7 @@ public class ConfirmDlg implements IClientOutgoingPacket
case SystemMessage.TYPE_ELEMENT_NAME:
case SystemMessage.TYPE_BYTE:
case SystemMessage.TYPE_FACTION_NAME:
case SystemMessage.TYPE_ELEMENTAL_SPIRIT:
{
packet.writeC(param.getIntValue());
break;

View File

@ -80,6 +80,7 @@ public final class SystemMessage implements IClientOutgoingPacket
}
}
public static final byte TYPE_ELEMENTAL_SPIRIT = 26;
public static final byte TYPE_FACTION_NAME = 24; // c(short), faction id.
// id 22 d (shared with 1-3,17,22
// id 21 h
@ -374,6 +375,12 @@ public final class SystemMessage implements IClientOutgoingPacket
return this;
}
public SystemMessage addElementalSpirit(int elementType)
{
append(new SMParam(TYPE_ELEMENTAL_SPIRIT, elementType));
return this;
}
public SMParam[] getParams()
{
return _params;
@ -419,6 +426,7 @@ public final class SystemMessage implements IClientOutgoingPacket
case TYPE_ELEMENT_NAME:
case TYPE_BYTE:
case TYPE_FACTION_NAME:
case TYPE_ELEMENTAL_SPIRIT:
{
packet.writeC(param.getIntValue());
break;

View File

@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import org.l2jmobius.gameserver.model.Party;
@ -376,12 +375,12 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
if (containsMask(UserInfoType.ATT_SPIRITS)) // 152
{
packet.writeH(26);
packet.writeD(_player.getAttackElementValue(_player.getAttackElement())); // Attribute Attack Power
packet.writeD(_player.getDefenseElementValue(AttributeType.FIRE)); // Fire defence
packet.writeD(_player.getDefenseElementValue(AttributeType.WATER)); // Water defence
packet.writeD(_player.getDefenseElementValue(AttributeType.WIND)); // Wind defence
packet.writeD(_player.getDefenseElementValue(AttributeType.EARTH)); // Earth defence
packet.writeD(0x00); // Enabled 1 - Disabled 0 // Third class player?
packet.writeD((int) _player.getActiveElementalSpiritAttack());
packet.writeD((int) _player.getFireSpiritDefense());
packet.writeD((int) _player.getWaterSpiritDefense());
packet.writeD((int) _player.getWindSpiritDefense());
packet.writeD((int) _player.getEarthSpiritDefense());
packet.writeD(_player.getActiveElementalSpiritType());
}
return true;

View File

@ -0,0 +1,55 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author JoeAlisson
*/
abstract class AbstractElementalSpiritPacket implements IClientOutgoingPacket
{
void writeSpiritInfo(PacketWriter packet, ElementalSpirit spirit)
{
packet.writeC(spirit.getStage());
packet.writeD(spirit.getNpcId());
packet.writeQ(spirit.getExperience());
packet.writeQ(spirit.getExperienceToNextLevel());
packet.writeQ(spirit.getExperienceToNextLevel());
packet.writeD(spirit.getLevel());
packet.writeD(spirit.getMaxLevel());
packet.writeD(spirit.getAvailableCharacteristicsPoints());
packet.writeD(spirit.getAttackPoints());
packet.writeD(spirit.getDefensePoints());
packet.writeD(spirit.getCriticalRatePoints());
packet.writeD(spirit.getCriticalDamagePoints());
packet.writeD(spirit.getMaxCharacteristics());
packet.writeD(spirit.getMaxCharacteristics());
packet.writeD(spirit.getMaxCharacteristics());
packet.writeD(spirit.getMaxCharacteristics());
packet.writeC(1); // unk
for (int j = 0; j < 1; j++)
{
packet.writeH(2);
packet.writeQ(100);
}
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author JoeAlisson
*/
public class ElementalSpiritAbsorb extends UpdateElementalSpiritPacket
{
public ElementalSpiritAbsorb(PlayerInstance player, byte type, boolean absorbed)
{
super(player, type, absorbed);
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_ABSORB.writeId(packet);
writeUpdate(packet);
return true;
}
}

View File

@ -0,0 +1,76 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ElementalSpiritAbsorbItemHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author JoeAlisson
*/
public class ElementalSpiritAbsorbInfo implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final byte _type;
public ElementalSpiritAbsorbInfo(PlayerInstance player, byte type)
{
_player = player;
_type = type;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_ABSORB_INFO.writeId(packet);
final ElementalSpirit spirit = _player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
packet.writeC(0x00);
packet.writeC(0x00);
return true;
}
packet.writeC(0x01);
packet.writeC(_type);
packet.writeC(spirit.getStage());
packet.writeQ(spirit.getExperience());
packet.writeQ(spirit.getExperienceToNextLevel()); // NextExp
packet.writeQ(spirit.getExperienceToNextLevel()); // MaxExp
packet.writeD(spirit.getLevel());
packet.writeD(spirit.getMaxLevel());
final List<ElementalSpiritAbsorbItemHolder> absorbItems = spirit.getAbsorbItems();
packet.writeD(absorbItems.size()); // AbsorbCount
for (ElementalSpiritAbsorbItemHolder absorbItem : absorbItems)
{
packet.writeD(absorbItem.getId());
packet.writeD(CommonUtil.zeroIfNullOrElse(_player.getInventory().getItemByItemId(absorbItem.getId()), item -> (int) item.getCount()));
packet.writeD(absorbItem.getExperience());
}
return true;
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author JoeAlisson
*/
public class ElementalSpiritEvolution extends UpdateElementalSpiritPacket
{
public ElementalSpiritEvolution(PlayerInstance player, byte type, boolean evolved)
{
super(player, type, evolved);
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_EVOLUTION.writeId(packet);
writeUpdate(packet);
return true;
}
}

View File

@ -0,0 +1,71 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author JoeAlisson
*/
public class ElementalSpiritEvolutionInfo implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final byte _type;
public ElementalSpiritEvolutionInfo(PlayerInstance player, byte type)
{
_player = player;
_type = type;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO.writeId(packet);
final ElementalSpirit spirit = _player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
packet.writeC(0);
packet.writeD(0);
return true;
}
packet.writeC(_type);
packet.writeD(spirit.getNpcId());
packet.writeD(0x01); // unk
packet.writeD(spirit.getStage());
packet.writeF(100); // chance ??
final List<ItemHolder> items = spirit.getItemsToEvolve();
packet.writeD(items.size());
for (ItemHolder item : items)
{
packet.writeD(item.getId());
packet.writeQ(item.getCount());
}
return true;
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author JoeAlisson
*/
public class ElementalSpiritExtract extends UpdateElementalSpiritPacket
{
public ElementalSpiritExtract(PlayerInstance player, byte type, boolean extracted)
{
super(player, type, extracted);
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_EXTRACT.writeId(packet);
writeUpdate(packet);
return true;
}
}

View File

@ -0,0 +1,65 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author JoeAlisson
*/
public class ElementalSpiritExtractInfo implements IClientOutgoingPacket
{
private final PlayerInstance _player;
private final byte _type;
public ElementalSpiritExtractInfo(PlayerInstance player, byte type)
{
_player = player;
_type = type;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_EXTRACT_INFO.writeId(packet);
final ElementalSpirit spirit = _player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
packet.writeC(0);
packet.writeC(0);
return true;
}
packet.writeC(_type); // active elemental spirit
packet.writeC(1); // is extract ?
packet.writeC(1); // cost count
// for each cost count
packet.writeD(57); // item id
packet.writeD(1000000); // item count
packet.writeD(spirit.getExtractItem());
packet.writeD(spirit.getExtractAmount());
return true;
}
}

View File

@ -0,0 +1,75 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author JoeAlisson
*/
public class ElementalSpiritInfo extends AbstractElementalSpiritPacket
{
private final PlayerInstance _player;
private final byte _spiritType;
private final byte _type;
public ElementalSpiritInfo(PlayerInstance player, byte spiritType, byte packetType)
{
_player = player;
_spiritType = spiritType;
_type = packetType;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_INFO.writeId(packet);
final ElementalSpirit[] spirits = _player.getSpirits();
if (spirits == null)
{
packet.writeC(0);
packet.writeC(0);
packet.writeC(0);
return true;
}
packet.writeC(_type); // show spirit info window 1; Change type 2; Only update 0
packet.writeC(_spiritType);
packet.writeC(spirits.length); // spirit count
for (ElementalSpirit spirit : spirits)
{
packet.writeC(spirit.getType());
packet.writeC(0x01); // spirit active ?
// if active
writeSpiritInfo(packet, spirit);
}
packet.writeD(1); // Reset talent items count
for (int j = 0; j < 1; j++)
{
packet.writeD(57);
packet.writeQ(50000);
}
return true;
}
}

View File

@ -0,0 +1,40 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
* @author JoeAlisson
*/
public class ElementalSpiritSetTalent extends UpdateElementalSpiritPacket
{
public ElementalSpiritSetTalent(PlayerInstance player, byte type, boolean result)
{
super(player, type, result);
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_SET_TALENT.writeId(packet);
writeUpdate(packet);
return true;
}
}

View File

@ -0,0 +1,46 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author JoeAlisson
*/
public class ExElementalSpiritGetExp implements IClientOutgoingPacket
{
private final long _experience;
private final byte _type;
public ExElementalSpiritGetExp(byte type, long experience)
{
_type = type;
_experience = experience;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_ELEMENTAL_SPIRIT_GET_EXP.writeId(packet);
packet.writeC(_type);
packet.writeQ(_experience);
return true;
}
}

View File

@ -0,0 +1,57 @@
/*
* 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 org.l2jmobius.gameserver.network.serverpackets.elementalspirits;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
/**
* @author JoeAlisson
*/
public abstract class UpdateElementalSpiritPacket extends AbstractElementalSpiritPacket
{
private final PlayerInstance _player;
private final byte _type;
private final boolean _update;
UpdateElementalSpiritPacket(PlayerInstance player, byte type, boolean update)
{
_player = player;
_type = type;
_update = update;
}
protected void writeUpdate(PacketWriter packet)
{
packet.writeC(_update ? 1 : 0);
packet.writeC(_type);
if (_update)
{
final ElementalSpirit spirit = _player.getElementalSpirit(ElementalType.of(_type));
if (spirit == null)
{
return;
}
packet.writeC(_type);
writeSpiritInfo(packet, spirit);
}
}
}

View File

@ -79,6 +79,7 @@ Seven Signs: https://eu.4gameforum.com/threads/658543/
-Parsed new NPCs from client
-Updated skiltrees and skills from L2Wiki
-Updated experience values from L2Wiki
-Elemental Spirits
-Land of Winds spawns
-Goddard territory spawns
-Goddard clanhalls

View File

@ -0,0 +1,17 @@
DROP TABLE IF EXISTS `character_spirits`;
CREATE TABLE `character_spirits`
(
`charId` INT UNSIGNED NOT NULL,
`type` TINYINT NOT NULL,
`level` TINYINT NOT NULL DEFAULT 1,
`stage` TINYINT NOT NULL DEFAULT 0,
`experience` BIGINT NOT NULL DEFAULT 0,
`attack_points` TINYINT NOT NULL DEFAULT 0,
`defense_points` TINYINT NOT NULL DEFAULT 0,
`crit_rate_points` TINYINT NOT NULL DEFAULT 0,
`crit_damage_points` TINYINT NOT NULL DEFAULT 0,
`in_use` BOOLEAN NOT NULL DEFAULT FALSE,
PRIMARY KEY (`charId`, `type`),
FOREIGN KEY FK_CHARACTER_SPIRITS (`charId`) REFERENCES characters (`charId`) ON DELETE CASCADE
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;

View File

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/ElementalSpiritData.xsd">
<spirit name="Flame Spirit Seed" type="1" stage="0" npcId="13565" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Ignis - Minor Flame Spirit" type="1" stage="1" npcId="13566" extractItem="91040" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91032" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Ignis - Lesser Flame Spirit" type="1" stage="2" npcId="13566" extractItem="91040" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91032" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Ignis - Median Flame Spirit" type="1" stage="3" npcId="13568" extractItem="91040" maxCharacteristics="15" >
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91036" experience="9300" />
</spirit>
<spirit name="Water Spirit Seed" type="2" stage="0" npcId="13569" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Nebula - Minor Water Spirit" type="2" stage="1" npcId="13570" extractItem="91039" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91031" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Nebula - Lesser Water Spirit" type="2" stage="2" npcId="13571" extractItem="91039" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91031" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Nebula - Median Water Spirit" type="2" stage="3" npcId="13572" extractItem="91039" maxCharacteristics="15" >
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91035" experience="9300" />
</spirit>
<spirit name="Wind Spirit Seed" type="3" stage="0" npcId="13573" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Procella - Minor Wind Spirit" type="3" stage="1" npcId="13574" extractItem="91041" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91033" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Procella - Lesser Wind Spirit" type="3" stage="2" npcId="13575" extractItem="91041" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91033" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Procella - Median Wind Spirit" type="3" stage="3" npcId="13576" extractItem="91041" maxCharacteristics="15">
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91037" experience="9300" />
</spirit>
<spirit name="Earth Spirit Seed" type="4" stage="0" npcId="13577" extractItem="0" maxCharacteristics="0">
<level id="1" atk="0" def="0" critRate="0" critDam="0" maxExp="0" />
</spirit>
<spirit name="Petram - Minor Earth Spirit" type="4" stage="1" npcId="13578" extractItem="91042" maxCharacteristics="5">
<level id="1" atk="35" def="35" critRate="1" critDam="1" maxExp="57713" />
<level id="2" atk="40" def="40" critRate="2" critDam="2" maxExp="135313" />
<level id="3" atk="45" def="45" critRate="3" critDam="3" maxExp="238082" />
<level id="4" atk="50" def="50" critRate="4" critDam="4" maxExp="371775" />
<level id="5" atk="55" def="55" critRate="5" critDam="5" maxExp="542993" />
<level id="6" atk="60" def="60" critRate="6" critDam="6" maxExp="759244" />
<level id="7" atk="65" def="65" critRate="7" critDam="7" maxExp="1029008" />
<level id="8" atk="70" def="70" critRate="8" critDam="8" maxExp="1361808" />
<level id="9" atk="75" def="75" critRate="9" critDam="9" maxExp="1768273" />
<level id="10" atk="80" def="80" critRate="10" critDam="10" maxExp="2260211" />
<itemToEvolve id="91034" />
<itemToEvolve id="57" count="1000000" />
<absorbItem id="91038" experience="9300" />
</spirit>
<spirit name="Petram - Lesser Earth Spirit" type="4" stage="2" npcId="13579" extractItem="91042" maxCharacteristics="10">
<level id="1" atk="105" def="105" critRate="16" critDam="16" maxExp="596369" />
<level id="2" atk="110" def="110" critRate="17" critDam="17" maxExp="1313872" />
<level id="3" atk="115" def="115" critRate="18" critDam="18" maxExp="2171115" />
<level id="4" atk="120" def="120" critRate="19" critDam="19" maxExp="3188751" />
<level id="5" atk="125" def="125" critRate="20" critDam="20" maxExp="4389633" />
<level id="6" atk="130" def="130" critRate="21" critDam="21" maxExp="5798968" />
<level id="7" atk="135" def="135" critRate="22" critDam="22" maxExp="7444481" />
<level id="8" atk="140" def="140" critRate="23" critDam="23" maxExp="9356589" />
<level id="9" atk="145" def="145" critRate="24" critDam="24" maxExp="11568579" />
<level id="10" atk="150" def="150" critRate="25" critDam="25" maxExp="14116796" />
<itemToEvolve id="91034" count="3" />
<itemToEvolve id="57" count="3000000" />
<absorbItem id="91038" experience="9300" />
</spirit>
<spirit name="Petram - Median Earth Spirit" type="4" stage="3" npcId="13580" extractItem="91042" maxCharacteristics="15">
<level id="1" atk="175" def="175" critRate="31" critDam="31" maxExp="2924039" />
<level id="2" atk="180" def="180" critRate="32" critDam="32" maxExp="6266952" />
<level id="3" atk="185" def="185" critRate="33" critDam="33" maxExp="10075460" />
<level id="4" atk="190" def="190" critRate="34" critDam="34" maxExp="14400173" />
<level id="5" atk="195" def="195" critRate="35" critDam="35" maxExp="19295819" />
<level id="6" atk="200" def="200" critRate="36" critDam="36" maxExp="24821487" />
<level id="7" atk="205" def="205" critRate="37" critDam="37" maxExp="31040875" />
<level id="8" atk="210" def="210" critRate="38" critDam="38" maxExp="38022549" />
<level id="9" atk="215" def="215" critRate="39" critDam="39" maxExp="45840213" />
<level id="10" atk="220" def="220" critRate="40" critDam="40" maxExp="54572992" />
<absorbItem id="91038" experience="9300" />
</spirit>
</list>

View File

@ -0,0 +1,14 @@
<html><body>Svein:<br>
What are you curious to know about spirits?<br>
I will do my best to tell you everything I know.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 11">Check Spirits Status</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 12">Attribute Effect</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 13">Spirits Training and Attribute Hunting Ground</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 14">Spirits Stats</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 15">Spirits Characteristics</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 16">Spirits Evolution</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 17">Spirits Absorb</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 18">Spirits Extract</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 19">Changes Attributes</Button>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 0">Back</Button>
</body></html>

View File

@ -0,0 +1,8 @@
<html><body>Svein:<br>
Are you curious about checking the spirits' status?<br>
Start by opening the Character Information window.<br>
<font color="LEVEL">(You can open Character Information window with Alt+T.)</font><br>
If you click the <font color="LEVEL">Spirits</font> button in the lower screen, you can check the spirits' status.<br>
Is there anything else you're curious about?<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,15 @@
<html><body>Svein:<br>
Attribute Effect changes damage dealt and taken in battle.<br>
<font color="LEVEL">[Attribute Types]<br1>
Spirits are classified according to 4 attributes of water, fire, wind and earth.<br>
<font color="LEVEL">[Attribute Attack and Growth]<br1>
When you attack monsters, damage increases depending on attribute.<br1>
But when you attack monsters by attribute, damage changes according to the monsters' attribute growth.<br>
With <font color="LEVEL">Growth Effect</font>, a strong attribute gives 20% more damage, while a weak attribute can give no more than 60% damage.<br>
<font color="LEVEL">Relative Growth</font> refers to relativity between attributes, where water is strong than fire and fire is stronger than wind. Also, wind is stronger than earth and earth is stronger than water.<br1>
The attributes ae relatively linked, so you must not be careless with any one attribute.<br>
<font color="LEVEL">[Attribute Defense]</font><br1>
If you're attacked with an attribute, your attribute defense withstands the attack.<br1>
In this situation, it is important to know who has the higher attribute P. Def.<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

View File

@ -0,0 +1,14 @@
<html><body>Svein:<br>
To grow spirits, defeat attribute monsters to acquire XP of the dominating attribute.<br>
Where are attribute monsters, you ask?<br1>
<font color="LEVEL">Wind Attack Hunting Ground:</font> Wind Plateau<br1>
<font color="LEVEL">Earth Attack Hunting Ground:</font> Wall of Argos<br1>
<font color="LEVEL">Water Attack Hunting Ground:</font> Garden of Eva<br1>
<font color="LEVEL">Fire Attack Hunting Ground:</font> Fore of the Gods<br>
And the spirits you can grow at each hunting ground vary, so keep that in mind when selecting.<br1>
<fond color="LEVEL">Wind Attack Hunting Ground:</fond> Obtained Fire Attack XP<br1>
<fond color="LEVEL">Earth Attack Hunting Ground:</fond> Obtained Wind Attack XP<br1>
<fond color="LEVEL">Water Attack Hunting Ground:</fond> Obtained Earth Attack XP<br1>
<fond color="LEVEL">Fire Attack Hunting Ground:</fond> Obtained Water Attack XP<br>
<Button ALIGN=LEFT ICON="RETURN" action="bypass -h npc_%objectId%_Chat 1">Back</Button>
</body></html>

Some files were not shown because too many files have changed in this diff Show More