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> <html><body>Svein:<br>
Have you heard of <font color="LEVEL">Spirits</font>?<br1> Adventurer, have you heard of <font color="LEVEL">Spirits</font>?<br1>
Honestly, there are not many people who actually know about them.<br1> There are few who know of the spirits.<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. 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>
I can tell you more if you want.<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 npc_%objectId%_Multisell 3500000">Use Attribute Fragment</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 Attribute 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 3500002">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 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%_Multisell 3500004">Ask about materials for Spirits</Button> <Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Ask about Spirits.</Button>
</body></html> </body></html>

View File

@@ -1,122 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?> <?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> <npcs>
<npc>34053</npc> <!-- Attribute Master Svein --> <npc>34053</npc> <!-- Attribute Master Svein -->
</npcs> </npcs>
<item> <item>
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment --> <ingredient id="91039" count="500" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 --> <production id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 -->
</item> </item>
<item> <item>
<ingredient id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 --> <ingredient id="91043" count="1" /> <!-- Nebula Old Necklace Lv1 -->
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment --> <ingredient id="91039" count="600" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 --> <production id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 -->
</item> </item>
<item> <item>
<ingredient id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 --> <ingredient id="91044" count="1" /> <!-- Nebula Old Necklace Lv2 -->
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment --> <ingredient id="91039" count="800" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 --> <production id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 -->
</item> </item>
<item> <item>
<ingredient id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 --> <ingredient id="91045" count="1" /> <!-- Nebula Old Necklace Lv3 -->
<ingredient id="91039" count="300" /> <!-- Water Attribute Fragment --> <ingredient id="91039" count="900" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 --> <production id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 -->
</item> </item>
<item> <item>
<ingredient id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 --> <ingredient id="91116" count="1" /> <!-- Nebula Old Necklace Lv4 -->
<ingredient id="91039" count="400" /> <!-- Water Attribute Fragment --> <ingredient id="91039" count="1200" /> <!-- Water Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91117" count="1" /> <!-- Nebula Necklace --> <production id="91117" count="1" /> <!-- Nebula Necklace -->
</item> </item>
<item> <item>
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment --> <ingredient id="91040" count="500" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 --> <production id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 -->
</item> </item>
<item> <item>
<ingredient id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 --> <ingredient id="91046" count="1" /> <!-- Ignis Old Necklace Lv1 -->
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment --> <ingredient id="91040" count="600" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 --> <production id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 -->
</item> </item>
<item> <item>
<ingredient id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 --> <ingredient id="91047" count="1" /> <!-- Ignis Old Necklace Lv2 -->
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment --> <ingredient id="91040" count="800" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 --> <production id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 -->
</item> </item>
<item> <item>
<ingredient id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 --> <ingredient id="91048" count="1" /> <!-- Ignis Old Necklace Lv3 -->
<ingredient id="91040" count="300" /> <!-- Fire Attribute Fragment --> <ingredient id="91040" count="900" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 --> <production id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 -->
</item> </item>
<item> <item>
<ingredient id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 --> <ingredient id="91118" count="1" /> <!-- Ignis Old Necklace Lv4 -->
<ingredient id="91040" count="400" /> <!-- Fire Attribute Fragment --> <ingredient id="91040" count="1200" /> <!-- Fire Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91119" count="1" /> <!-- Ignis Necklace --> <production id="91119" count="1" /> <!-- Ignis Necklace -->
</item> </item>
<item> <item>
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment --> <ingredient id="91041" count="500" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 --> <production id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 -->
</item> </item>
<item> <item>
<ingredient id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 --> <ingredient id="91049" count="1" /> <!-- Procellas Old Necklace Lv1 -->
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment --> <ingredient id="91041" count="600" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 --> <production id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 -->
</item> </item>
<item> <item>
<ingredient id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 --> <ingredient id="91050" count="1" /> <!-- Procellas Old Necklace Lv2 -->
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment --> <ingredient id="91041" count="800" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 --> <production id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 -->
</item> </item>
<item> <item>
<ingredient id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 --> <ingredient id="91051" count="1" /> <!-- Procellas Old Necklace Lv3 -->
<ingredient id="91041" count="300" /> <!-- Wind Attribute Fragment --> <ingredient id="91041" count="900" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="40000" /> <!-- Adena -->
<production id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 --> <production id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 -->
</item> </item>
<item> <item>
<ingredient id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 --> <ingredient id="91120" count="1" /> <!-- Procellas Old Necklace Lv4 -->
<ingredient id="91041" count="400" /> <!-- Wind Attribute Fragment --> <ingredient id="91041" count="1200" /> <!-- Wind Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91121" count="1" /> <!-- Procellas Necklace --> <production id="91121" count="1" /> <!-- Procellas Necklace -->
</item> </item>
<item> <item>
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment --> <ingredient id="91042" count="500" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="100000" /> <!-- Adena -->
<production id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 --> <production id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 -->
</item> </item>
<item> <item>
<ingredient id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 --> <ingredient id="91052" count="1" /> <!-- Petrams Old Necklace Lv1 -->
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment --> <ingredient id="91042" count="600" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="200000" /> <!-- Adena -->
<production id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 --> <production id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 -->
</item> </item>
<item> <item>
<ingredient id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 --> <ingredient id="91053" count="1" /> <!-- Petrams Old Necklace Lv2 -->
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment --> <ingredient id="91042" count="800" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="300000" /> <!-- Adena -->
<production id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 --> <production id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 -->
</item> </item>
<item> <item>
<ingredient id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 --> <ingredient id="91054" count="1" /> <!-- Petrams Old Necklace Lv3 -->
<ingredient id="91042" count="300" /> <!-- Earth Attribute Fragment --> <ingredient id="91042" count="900" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="400000" /> <!-- Adena -->
<production id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 --> <production id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 -->
</item> </item>
<item> <item>
<ingredient id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 --> <ingredient id="91122" count="1" /> <!-- Petrams Old Necklace Lv4 -->
<ingredient id="91042" count="400" /> <!-- Earth Attribute Fragment --> <ingredient id="91042" count="1200" /> <!-- Earth Attribute Fragment -->
<ingredient id="57" count="3000000" /> <!-- Adena --> <ingredient id="57" count="900000" /> <!-- Adena -->
<production id="91123" count="1" /> <!-- Petrams Necklace --> <production id="91123" count="1" /> <!-- Petrams Necklace -->
</item> </item>
</list> </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.OlympiadDailyMissionHandler;
import handlers.dailymissionhandlers.QuestDailyMissionHandler; import handlers.dailymissionhandlers.QuestDailyMissionHandler;
import handlers.dailymissionhandlers.SiegeDailyMissionHandler; import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
import handlers.dailymissionhandlers.SpiritDailyMissionHandler;
/** /**
* @author UnAfraid * @author UnAfraid
@@ -48,6 +49,7 @@ public class DailyMissionMasterHandler
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new); DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new); DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new); DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
DailyMissionHandler.getInstance().registerHandler("spirit", SpiritDailyMissionHandler::new);
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers."); 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("DispelBySlotProbability", DispelBySlotProbability::new);
EffectHandler.getInstance().registerHandler("DoubleCast", DoubleCast::new); EffectHandler.getInstance().registerHandler("DoubleCast", DoubleCast::new);
EffectHandler.getInstance().registerHandler("DuelistFury", DuelistFury::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("EnableCloak", EnableCloak::new);
EffectHandler.getInstance().registerHandler("EnergyAttack", EnergyAttack::new); EffectHandler.getInstance().registerHandler("EnergyAttack", EnergyAttack::new);
EffectHandler.getInstance().registerHandler("EnlargeAbnormalSlot", EnlargeAbnormalSlot::new); EffectHandler.getInstance().registerHandler("EnlargeAbnormalSlot", EnlargeAbnormalSlot::new);
@@ -309,6 +311,7 @@ public final class EffectMasterHandler
EffectHandler.getInstance().registerHandler("Sow", Sow::new); EffectHandler.getInstance().registerHandler("Sow", Sow::new);
EffectHandler.getInstance().registerHandler("Speed", Speed::new); EffectHandler.getInstance().registerHandler("Speed", Speed::new);
EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new); EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new);
EffectHandler.getInstance().registerHandler("SpiritXpModify", SpiritExpModify::new);
EffectHandler.getInstance().registerHandler("SpModify", SpModify::new); EffectHandler.getInstance().registerHandler("SpModify", SpModify::new);
EffectHandler.getInstance().registerHandler("Spoil", Spoil::new); EffectHandler.getInstance().registerHandler("Spoil", Spoil::new);
EffectHandler.getInstance().registerHandler("StatBonusSkillCritical", StatBonusSkillCritical::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; final double damage = -amount;
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false); 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; final double damage = -amount;
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false); 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); effected.reduceCurrentHp(_power, effector, skill, false, false, false, false);
if (effector.isPlayer()) 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="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="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="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 --> <npc id="30767" x="148009" y="28603" z="-2264" heading="52880" respawnTime="60sec" > <!-- Auctioneer -->
<parameters> <parameters>
<param name="fnAgitMap" value="aden"/> <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="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="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="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> </group>
</spawn> </spawn>
</list> </list>

View File

@@ -3428,7 +3428,7 @@
</spoil> </spoil>
</dropLists> </dropLists>
</npc> </npc>
<npc id="20792" level="79" type="Monster" name="Coral"> <npc id="20792" level="76" type="Monster" name="Coral" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="70" /> <param name="MoveAroundSocial" value="70" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -3445,7 +3445,7 @@
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="192" /> <!-- Monster Only (Parhit Staff) --> <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"> <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" /> <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" /> <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> </spoil>
</dropLists> </dropLists>
</npc> </npc>
<npc id="20794" level="78" type="Monster" name="Stakato"> <npc id="20794" level="76" type="Monster" name="Stakato" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -3575,7 +3575,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="223" /> <!-- Kukuri --> <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"> <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" /> <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" /> <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" /> <height normal="36" />
</collision> </collision>
</npc> </npc>
<npc id="20795" level="80" type="Monster" name="Stakato Worker"> <npc id="20795" level="77" type="Monster" name="Stakato Worker" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="70" /> <param name="MoveAroundSocial" value="70" />
<param name="MoveAroundSocial1" value="70" /> <param name="MoveAroundSocial1" value="70" />
@@ -3624,7 +3624,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="226" /> <!-- Cursed Dagger --> <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"> <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" /> <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" /> <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" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="20796" level="80" type="Monster" name="Stakato Warrior"> <npc id="20796" level="77" type="Monster" name="Stakato Warrior" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -3672,7 +3672,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="232" /> <!-- Dark Elven Dagger --> <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"> <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" /> <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" /> <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" /> <height normal="38" />
</collision> </collision>
</npc> </npc>
<npc id="20797" level="81" type="Monster" name="Stakato Drone"> <npc id="20797" level="78" type="Monster" name="Stakato Drone" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="62" /> <param name="MoveAroundSocial" value="62" />
<param name="MoveAroundSocial1" value="62" /> <param name="MoveAroundSocial1" value="62" />
@@ -3726,7 +3726,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="74" /> <!-- Katana --> <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"> <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" /> <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" /> <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" /> <height normal="39" />
</collision> </collision>
</npc> </npc>
<npc id="20798" level="81" type="Monster" name="Water Giant"> <npc id="20798" level="78" type="Monster" name="Water Giant" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3779,7 +3779,7 @@
<race>GIANT</race> <race>GIANT</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="5132" /> <!-- Monster Only (Giant Trident) --> <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"> <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" /> <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" /> <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" /> <height normal="44" />
</collision> </collision>
</npc> </npc>
<npc id="20799" level="82" type="Monster" name="Queen Lad"> <npc id="20799" level="79" type="Monster" name="Queen Lad" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3829,7 +3829,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>FEMALE</sex> <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"> <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" /> <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" /> <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"?> <?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd"> <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> <parameters>
<param name="MoveAroundSocial" value="40" /> <param name="MoveAroundSocial" value="40" />
<param name="MoveAroundSocial1" value="40" /> <param name="MoveAroundSocial1" value="40" />
@@ -14,7 +14,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="30" />
</collision> </collision>
</npc> </npc>
<npc id="20801" level="82" type="Monster" name="Piker"> <npc id="20801" level="80" type="Monster" name="Piker" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -62,7 +62,7 @@
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="302" /> <!-- Body Slasher --> <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"> <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" /> <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" /> <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" /> <height normal="34.8" />
</collision> </collision>
</npc> </npc>
<npc id="20802" level="82" type="Monster" name="Mage"> <npc id="20802" level="80" type="Monster" name="Mage" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -115,7 +115,7 @@
<race>DEMONIC</race> <race>DEMONIC</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="192" /> <!-- Crystal Staff --> <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"> <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" /> <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" /> <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" /> <height normal="32.5" />
</collision> </collision>
</npc> </npc>
<npc id="20803" level="83" type="Monster" name="Doll Master"> <npc id="20803" level="82" type="Monster" name="Doll Master" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -168,7 +168,7 @@
</parameters> </parameters>
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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> </spoil>
</dropLists> </dropLists>
</npc> </npc>
<npc id="20849" level="83" type="Monster" name="Light Worm"> <npc id="20849" level="83" type="Monster" name="Light Worm" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3400,7 +3400,7 @@
</parameters> </parameters>
<race>ANIMAL</race> <race>ANIMAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="28" />
</collision> </collision>
</npc> </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> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -5145,7 +5145,7 @@
</parameters> </parameters>
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="34.05" />
</collision> </collision>
</npc> </npc>
<npc id="20995" level="82" type="Monster" name="Garden Guard"> <npc id="20995" level="81" type="Monster" name="Garden Guard" element="WATER">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -5194,8 +5194,10 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <sex>MALE</sex>
<acquire exp="100658" sp="3019" attribute_exp="1134"/>
<equipment rhand="94" /> <!-- Bec de Corbin --> <equipment rhand="94" /> <!-- Bec de Corbin -->
<stats str="40" int="21" dex="30" wit="20" con="43" men="10"> <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" /> <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" /> <defence physical="2103.00075" magical="3505.00125" />
<speed> <speed>

View File

@@ -3637,7 +3637,7 @@
</spoil> </spoil>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21661" level="82" type="Monster" name="Scarlet Worker"> <npc id="21661" level="79" type="Monster" name="Scarlet Worker" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" /> <skill name="Skill01_ID" id="4560" level="9" />
@@ -3645,7 +3645,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="235" /> <!-- Bloody Orchid --> <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"> <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" /> <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" /> <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" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21662" level="82" type="Monster" name="Scarlet Soldier"> <npc id="21662" level="79" type="Monster" name="Scarlet Soldier" element="FIRE">
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -3694,7 +3694,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="148" /> <!-- Sword of Valhalla --> <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"> <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" /> <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" /> <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" /> <height normal="38" />
</collision> </collision>
</npc> </npc>
<npc id="21663" level="82" type="Monster" name="Scarlet Noble"> <npc id="21663" level="79" type="Monster" name="Scarlet Noble" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" /> <param name="Skill01_AttackSplash" value="1" />
@@ -3742,7 +3742,7 @@
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="235" /> <!-- Bloody Orchid --> <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"> <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" /> <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" /> <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" /> <height normal="39" />
</collision> </collision>
</npc> </npc>
<npc id="21664" level="82" type="Monster" name="Tepra Scorpion"> <npc id="21664" level="80" type="Monster" name="Tepra Scorpion" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" /> <skill name="Skill01_ID" id="4560" level="9" />
</parameters> </parameters>
<race>BUG</race> <race>BUG</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="52.8" />
</collision> </collision>
</npc> </npc>
<npc id="21665" level="82" type="Monster" name="Tepra Scarab"> <npc id="21665" level="80" type="Monster" name="Tepra Scarab" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" /> <skill name="Skill01_ID" id="4560" level="9" />
</parameters> </parameters>
<race>BUG</race> <race>BUG</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="22" />
</collision> </collision>
</npc> </npc>
<npc id="21666" level="82" type="Monster" name="Assassin Beetle"> <npc id="21666" level="80" type="Monster" name="Assassin Beetle" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" /> <param name="Skill01_AttackSplash" value="1" />
@@ -3866,7 +3866,7 @@
</parameters> </parameters>
<race>BUG</race> <race>BUG</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="54.5" />
</collision> </collision>
</npc> </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> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<param name="Skill01_AttackSplash" value="1" /> <param name="Skill01_AttackSplash" value="1" />
@@ -3909,7 +3909,7 @@
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="70" /> <!-- Homunkulus' Sword --> <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"> <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" /> <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" /> <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" /> <height normal="30.6" />
</collision> </collision>
</npc> </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> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4560" level="9" /> <skill name="Skill01_ID" id="4560" level="9" />
@@ -3951,7 +3951,7 @@
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="946" lhand="945" /> <!-- Skeleton Dagger / Skeleton Buckler --> <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"> <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" /> <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" /> <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" /> <height normal="34.8" />
</collision> </collision>
</npc> </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> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
</skillList> </skillList>
</npc> </npc>
<npc id="21670" level="83" type="Monster" name="Lavastone Golem"> <npc id="21670" level="82" type="Monster" name="Lavastone Golem" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4591" level="9" /> <skill name="Skill01_ID" id="4591" level="9" />
@@ -4021,7 +4021,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="31" />
</collision> </collision>
</npc> </npc>
<npc id="21671" level="83" type="Monster" name="Magma Golem"> <npc id="21671" level="82" type="Monster" name="Magma Golem" element="FIRE">
<parameters> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4157" level="9" /> <skill name="Skill01_ID" id="4157" level="9" />
@@ -4063,7 +4063,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="45" />
</collision> </collision>
</npc> </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> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4589" level="9" /> <skill name="Skill01_ID" id="4589" level="9" />
@@ -4105,7 +4105,7 @@
<race>DEMONIC</race> <race>DEMONIC</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="6722" /> <!-- Monster Only (Ahrimanes) --> <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"> <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" /> <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" /> <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" /> <height normal="57.75" grown="69" />
</collision> </collision>
</npc> </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> <parameters>
<param name="IsAggressive" value="1" /> <param name="IsAggressive" value="1" />
<skill name="Skill01_ID" id="4599" level="9" /> <skill name="Skill01_ID" id="4599" level="9" />
</parameters> </parameters>
<race>DEMONIC</race> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="55" />
</collision> </collision>
</npc> </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> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4413" level="7" /> <!-- Weak M. Def. -->
</skillList> </skillList>
</npc> </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> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4413" level="8" /> <!-- Weak M. Def. -->
</skillList> </skillList>
</npc> </npc>
<npc id="21676" level="80" type="Monster" name="Lavasillisk"> <npc id="21676" level="77" type="Monster" name="Lavasillisk" element="FIRE">
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="55" />
</collision> </collision>
</npc> </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> <race>DRAGON</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4412" level="17" /> <!-- Very Strong P. Def. -->
</skillList> </skillList>
</npc> </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> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
</skillList> </skillList>
</npc> </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> <race>DRAGON</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="36" />
</collision> </collision>
</npc> </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> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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> </drop>
</dropLists> </dropLists>
</npc> </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> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21763" level="83" type="Monster" name="Firen" title="Master"> <npc id="21763" level="82" type="Monster" name="Firen" title="Master" element="FIRE">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78"> <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" /> <vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed> <speed>
@@ -2603,10 +2603,9 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21764" level="82" type="Monster" name="Growler" title="Elite"> <npc id="21764" level="76" type="Monster" name="Growler" title="Elite" element="EARTH">
<!-- Classic Seven Sings -->
<race>ELEMENTAL</race> <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"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -2635,10 +2634,9 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21765" level="83" type="Monster" name="Tree Soldier" title="Elite"> <npc id="21765" level="77" type="Monster" name="Tree Soldier" title="Elite" element="EARTH">
<!-- Classic Seven Sings -->
<race>ETC</race> <!-- TODO: Magic Creatures --> <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"> <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" /> <vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed> <speed>
@@ -2667,10 +2665,9 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21766" level="83" type="Monster" name="Tortay" title="Master"> <npc id="21766" level="82" type="Monster" name="Tortay" title="Master" element="EARTH">
<!-- Classic Seven Sings -->
<race>ELEMENTAL</race> <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"> <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" /> <vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed> <speed>
@@ -2700,10 +2697,10 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21767" level="82" type="Monster" name="Undine" title="Elite"> <npc id="21767" level="76" type="Monster" name="Undine" title="Elite" element="WATER">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="240547" sp="7216" attribute_exp="684"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -2732,10 +2729,10 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21768" level="83" type="Monster" name="Snow Golem" title="Elite"> <npc id="21768" level="77" type="Monster" name="Snow Golem" title="Elite" element="WATER">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="355562" sp="10666" attribute_exp="770"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78"> <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" /> <vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed> <speed>
@@ -2764,10 +2761,10 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </npc>
<npc id="21769" level="83" type="Monster" name="Ishtir" title="Master"> <npc id="21769" level="82" type="Monster" name="Ishtir" title="Master" element="WATER">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78"> <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" /> <vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed> <speed>
@@ -2797,7 +2794,7 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </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> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -2812,7 +2809,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -2849,7 +2846,7 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </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> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -2864,7 +2861,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed> <speed>
@@ -2901,7 +2898,7 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </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> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -2916,7 +2913,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed> <speed>
@@ -2954,10 +2951,10 @@
</drop> </drop>
</dropLists> </dropLists>
</npc> </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> <race>ETC</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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. --> <skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
</skillList> </skillList>
</npc> </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 --> <!-- Classic Seven Sings -->
<race>BEAST</race> <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"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -3005,10 +3002,10 @@
<height normal="37.8" /> <height normal="37.8" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<race>DIVINE</race> <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"> <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" /> <vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
<speed> <speed>
@@ -3022,7 +3019,7 @@
<skillList> <skillList>
<skill id="4416" level="8" /> <!-- Angel --> <skill id="4416" level="8" /> <!-- Angel -->
<skill id="4408" level="12" /> <!-- HP Increase (4x) --> <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="4411" level="14" /> <!-- Strong M. Atk. -->
<skill id="4412" level="15" /> <!-- Strong P. Def. --> <skill id="4412" level="15" /> <!-- Strong P. Def. -->
<skill id="4413" level="12" /> <!-- Slightly Strong M. Def. --> <skill id="4413" level="12" /> <!-- Slightly Strong M. Def. -->
@@ -3032,7 +3029,7 @@
<height normal="44" /> <height normal="44" />
</collision> </collision>
</npc> </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> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3047,7 +3044,7 @@
</parameters> </parameters>
<race>DEMONIC</race> <race>DEMONIC</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -3078,7 +3075,7 @@
<height normal="31.44" /> <height normal="31.44" />
</collision> </collision>
</npc> </npc>
<npc id="21777" level="78" type="Monster" name="White Tiger"> <npc id="21777" level="76" type="Monster" name="White Tiger" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3093,7 +3090,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
<speed> <speed>
@@ -3124,7 +3121,7 @@
<height normal="28" /> <height normal="28" />
</collision> </collision>
</npc> </npc>
<npc id="21778" level="79" type="Monster" name="Black Tiger"> <npc id="21778" level="76" type="Monster" name="Black Tiger" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3139,7 +3136,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<speed> <speed>
@@ -3170,7 +3167,7 @@
<height normal="28" /> <height normal="28" />
</collision> </collision>
</npc> </npc>
<npc id="21779" level="79" type="Monster" name="Scorn Warrior"> <npc id="21779" level="77" type="Monster" name="Scorn Warrior" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3185,7 +3182,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
<speed> <speed>
@@ -3215,7 +3212,7 @@
<height normal="40" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21780" level="80" type="Monster" name="Porcupine"> <npc id="21780" level="77" type="Monster" name="Porcupine" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3230,7 +3227,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<speed> <speed>
@@ -3261,7 +3258,7 @@
<height normal="21.3" /> <height normal="21.3" />
</collision> </collision>
</npc> </npc>
<npc id="21781" level="80" type="Monster" name="Scorn Soldier"> <npc id="21781" level="78" type="Monster" name="Scorn Soldier" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3276,7 +3273,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
<speed> <speed>
@@ -3307,7 +3304,7 @@
<height normal="40" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21782" level="81" type="Monster" name="Scorn Seeker"> <npc id="21782" level="78" type="Monster" name="Scorn Seeker" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3322,7 +3319,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<speed> <speed>
@@ -3353,7 +3350,7 @@
<height normal="40" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21783" level="81" type="Monster" name="Nero Commander"> <npc id="21783" level="81" type="Monster" name="Nero Commander" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3368,7 +3365,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
<speed> <speed>
@@ -3399,7 +3396,7 @@
<height normal="28" /> <height normal="28" />
</collision> </collision>
</npc> </npc>
<npc id="21784" level="82" type="Monster" name="Storm Tapo"> <npc id="21784" level="79" type="Monster" name="Storm Tapo" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3414,7 +3411,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -3445,7 +3442,7 @@
<height normal="28" /> <height normal="28" />
</collision> </collision>
</npc> </npc>
<npc id="21785" level="82" type="Monster" name="Breeze Warrior"> <npc id="21785" level="80" type="Monster" name="Breeze Warrior" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3460,7 +3457,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -3491,7 +3488,7 @@
<height normal="40" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21786" level="82" type="Monster" name="Sharp Kau"> <npc id="21786" level="80" type="Monster" name="Sharp Kau" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3506,7 +3503,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2423.3825125" hpRegen="8.5" mp="3415.215" mpRegen="3" />
<speed> <speed>
@@ -3537,7 +3534,7 @@
<height normal="21.3" /> <height normal="21.3" />
</collision> </collision>
</npc> </npc>
<npc id="21787" level="82" type="Monster" name="Breeze Piker"> <npc id="21787" level="80" type="Monster" name="Breeze Piker" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3552,7 +3549,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
<speed> <speed>
@@ -3583,7 +3580,7 @@
<height normal="40" /> <height normal="40" />
</collision> </collision>
</npc> </npc>
<npc id="21788" level="82" type="Monster" name="Breeze Mage"> <npc id="21788" level="81" type="Monster" name="Breeze Mage" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3598,7 +3595,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2423.3825125" hpRegen="8.5" mp="3753.285" mpRegen="3" />
<speed> <speed>
@@ -3630,7 +3627,7 @@
<height normal="48.6" /> <height normal="48.6" />
</collision> </collision>
</npc> </npc>
<npc id="21789" level="83" type="Monster" name="Folding"> <npc id="21789" level="81" type="Monster" name="Folding" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3645,7 +3642,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2450.5997675" hpRegen="8.5" mp="3166.53" mpRegen="3" />
<speed> <speed>
@@ -3676,7 +3673,7 @@
<height normal="27.6" /> <height normal="27.6" />
</collision> </collision>
</npc> </npc>
<npc id="21790" level="83" type="Monster" name="Wingrow"> <npc id="21790" level="81" type="Monster" name="Wingrow" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3691,7 +3688,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed> <speed>
@@ -3722,7 +3719,7 @@
<height normal="43" /> <height normal="43" />
</collision> </collision>
</npc> </npc>
<npc id="21791" level="83" type="Monster" name="Storm Lucifer"> <npc id="21791" level="82" type="Monster" name="Storm Lucifer" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3737,7 +3734,7 @@
</parameters> </parameters>
<race>ELEMENTAL</race> <race>ELEMENTAL</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
<speed> <speed>
@@ -3769,7 +3766,7 @@
<height normal="50" /> <height normal="50" />
</collision> </collision>
</npc> </npc>
<npc id="21792" level="83" type="Monster" name="Blow Breaker"> <npc id="21792" level="82" type="Monster" name="Blow Breaker" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3784,7 +3781,7 @@
</parameters> </parameters>
<race>HUMANOID</race> <race>HUMANOID</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2940.744352" hpRegen="8.5" mp="2907.225" mpRegen="3" />
<speed> <speed>
@@ -3815,7 +3812,7 @@
<height normal="27.6" /> <height normal="27.6" />
</collision> </collision>
</npc> </npc>
<npc id="21793" level="83" type="Monster" name="Brolly Seeker"> <npc id="21793" level="82" type="Monster" name="Brolly Seeker" element="WIND">
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
<param name="MoveAroundSocial1" value="0" /> <param name="MoveAroundSocial1" value="0" />
@@ -3830,7 +3827,7 @@
</parameters> </parameters>
<race>UNDEAD</race> <race>UNDEAD</race>
<sex>MALE</sex> <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"> <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" /> <vitals hp="2940.744352" hpRegen="8.5" mp="3828.51" mpRegen="3" />
<speed> <speed>

View File

@@ -820,7 +820,7 @@
<height normal="39" grown="47.5" /> <height normal="39" grown="47.5" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="80" /> <param name="MoveAroundSocial" value="80" />
@@ -835,7 +835,7 @@
</parameters> </parameters>
<race>ANIMAL</race> <race>ANIMAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="34" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="80" /> <param name="MoveAroundSocial" value="80" />
@@ -886,7 +886,7 @@
</parameters> </parameters>
<race>ANIMAL</race> <race>ANIMAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="34" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="78" /> <param name="MoveAroundSocial" value="78" />
@@ -937,7 +937,7 @@
</parameters> </parameters>
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="25" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="78" /> <param name="MoveAroundSocial" value="78" />
@@ -988,7 +988,7 @@
</parameters> </parameters>
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="25" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="0" /> <param name="MoveAroundSocial" value="0" />
@@ -1038,7 +1038,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="43" />
</collision> </collision>
</npc> </npc>
<npc id="21818" level="80" type="Monster" name="Valley Buffalo"> <npc id="21818" level="78" type="Monster" name="Valley Buffalo" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="120" /> <param name="MoveAroundSocial" value="120" />
<param name="MoveAroundSocial1" value="30" /> <param name="MoveAroundSocial1" value="30" />
@@ -1089,7 +1088,7 @@
</parameters> </parameters>
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="31" grown="38" />
</collision> </collision>
</npc> </npc>
<npc id="21819" level="81" type="Monster" name="Eye of Guide"> <npc id="21819" level="78" type="Monster" name="Eye of Guide" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -1145,7 +1143,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="43.2" />
</collision> </collision>
</npc> </npc>
<npc id="21820" level="81" type="Monster" name="Gaze of Nightmares"> <npc id="21820" level="79" type="Monster" name="Gaze of Nightmares" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="40" /> <param name="MoveAroundSocial" value="40" />
<param name="MoveAroundSocial1" value="40" /> <param name="MoveAroundSocial1" value="40" />
@@ -1206,7 +1203,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="30" />
</collision> </collision>
</npc> </npc>
<npc id="21821" level="82" type="Monster" name="Eye of the Watchman"> <npc id="21821" level="79" type="Monster" name="Eye of the Watchman" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -1266,7 +1262,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="49.8" />
</collision> </collision>
</npc> </npc>
<npc id="21822" level="82" type="Monster" name="Homunculus"> <npc id="21822" level="79" type="Monster" name="Homunculus" element="EARTH">
<!-- Classic Seven Sings --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="80" /> <param name="MoveAroundSocial" value="80" />
@@ -1322,7 +1318,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="26" />
</collision> </collision>
</npc> </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 --> <!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="115" /> <param name="MoveAroundSocial" value="115" />
@@ -1377,7 +1373,7 @@
</parameters> </parameters>
<race>ANIMAL</race> <race>ANIMAL</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="39" grown="47.5" />
</collision> </collision>
</npc> </npc>
<npc id="21824" level="82" type="Monster" name="Eye of Pilgrim"> <npc id="21824" level="80" type="Monster" name="Eye of Pilgrim" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -1435,7 +1430,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="63" />
</collision> </collision>
</npc> </npc>
<npc id="21825" level="82" type="Monster" name="Elder Homunculus"> <npc id="21825" level="80" type="Monster" name="Elder Homunculus" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="80" /> <param name="MoveAroundSocial" value="80" />
<param name="MoveAroundSocial1" value="80" /> <param name="MoveAroundSocial1" value="80" />
@@ -1492,7 +1486,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="32.5" />
</collision> </collision>
</npc> </npc>
<npc id="21826" level="82" type="Monster" name="Eye of Ruler"> <npc id="21826" level="80" type="Monster" name="Eye of Ruler" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="90" /> <param name="MoveAroundSocial" value="90" />
<param name="MoveAroundSocial1" value="90" /> <param name="MoveAroundSocial1" value="90" />
@@ -1549,7 +1542,7 @@
</parameters> </parameters>
<race>CONSTRUCT</race> <race>CONSTRUCT</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="56.4" />
</collision> </collision>
</npc> </npc>
<npc id="21827" level="83" type="Monster" name="Sly Hound Dog"> <npc id="21827" level="81" type="Monster" name="Sly Hound Dog" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="78" /> <param name="MoveAroundSocial" value="78" />
<param name="MoveAroundSocial1" value="78" /> <param name="MoveAroundSocial1" value="78" />
@@ -1605,7 +1597,7 @@
</parameters> </parameters>
<race>BEAST</race> <race>BEAST</race>
<sex>MALE</sex> <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"> <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" /> <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" /> <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" /> <height normal="25" />
</collision> </collision>
</npc> </npc>
<npc id="21828" level="83" type="Monster" name="Disciple of Protection"> <npc id="21828" level="81" type="Monster" name="Disciple of Protection" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="130" /> <param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" /> <param name="MoveAroundSocial1" value="130" />
@@ -1657,7 +1648,7 @@
<race>DIVINE</race> <race>DIVINE</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) --> <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"> <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" /> <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" /> <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" /> <height normal="30" grown="36.5" />
</collision> </collision>
</npc> </npc>
<npc id="21829" level="83" type="Monster" name="Disciple of Punishment"> <npc id="21829" level="81" type="Monster" name="Disciple of Punishment" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="130" /> <param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" /> <param name="MoveAroundSocial1" value="130" />
@@ -1711,7 +1701,7 @@
<race>DIVINE</race> <race>DIVINE</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) --> <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"> <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" /> <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" /> <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" /> <height normal="30" grown="36.5" />
</collision> </collision>
</npc> </npc>
<npc id="21830" level="83" type="Monster" name="Disciple of Conquest"> <npc id="21830" level="82" type="Monster" name="Disciple of Conquest" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="130" /> <param name="MoveAroundSocial" value="130" />
<param name="MoveAroundSocial1" value="130" /> <param name="MoveAroundSocial1" value="130" />
@@ -1765,7 +1754,7 @@
<race>DIVINE</race> <race>DIVINE</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) --> <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"> <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" /> <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" /> <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" /> <height normal="30" grown="36.5" />
</collision> </collision>
</npc> </npc>
<npc id="21831" level="83" type="Monster" name="Disciple of Power"> <npc id="21831" level="82" type="Monster" name="Disciple of Power" element="EARTH">
<!-- Classic Seven Sings -->
<parameters> <parameters>
<param name="MoveAroundSocial" value="85" /> <param name="MoveAroundSocial" value="85" />
<param name="MoveAroundSocial1" value="85" /> <param name="MoveAroundSocial1" value="85" />
@@ -1816,7 +1804,7 @@
<race>DIVINE</race> <race>DIVINE</race>
<sex>MALE</sex> <sex>MALE</sex>
<equipment rhand="6718" /> <!-- Monster Only (Einhasad Shaman) --> <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"> <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" /> <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" /> <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" /> <height normal="38.5" grown="46.5" />
</collision> </collision>
</npc> </npc>
<npc id="21832" level="83" type="Npc" name="Disciple of Authority"> <npc id="21832" level="82" type="Npc" name="Disciple of Authority">
<!-- AUTO GENERATED NPC TODO: FIX IT -->
<race>DIVINE</race> <race>DIVINE</race>
<sex>FEMALE</sex> <sex>FEMALE</sex>
<equipment rhand="6718" /> <equipment rhand="6718" />
<acquire exp="190827" sp="5724" attribute_exp="1230"/>
<stats str="88" int="79" dex="55" wit="78" con="82" men="78"> <stats str="88" int="79" dex="55" wit="78" con="82" men="78">
<vitals hp="6297" hpRegen="10.5" mp="2666" mpRegen="3.6" /> <vitals hp="6297" hpRegen="10.5" mp="2666" mpRegen="3.6" />
<speed> <speed>

View File

@@ -727,21 +727,69 @@
<!-- Fire Attribute Attack +100. --> <!-- Fire Attribute Attack +100. -->
<icon>icon.agathion_fire_1</icon> <icon>icon.agathion_fire_1</icon>
<operateType>P</operateType> <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>
<skill id="51094" toLevel="1" name="Water Attribute Attack"> <skill id="51094" toLevel="1" name="Water Attribute Attack">
<!-- Water Attribute Attack +100. --> <!-- Water Attribute Attack +100. -->
<icon>icon.agathion_water_1</icon> <icon>icon.agathion_water_1</icon>
<operateType>P</operateType> <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>
<skill id="51095" toLevel="1" name="Wind Attribute Attack"> <skill id="51095" toLevel="1" name="Wind Attribute Attack">
<!-- Wind Attribute Attack +100. --> <!-- Wind Attribute Attack +100. -->
<icon>icon.agathion_wind_1</icon> <icon>icon.agathion_wind_1</icon>
<operateType>P</operateType> <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>
<skill id="51096" toLevel="1" name="Earth Attribute Attack"> <skill id="51096" toLevel="1" name="Earth Attribute Attack">
<!-- Earth Attribute Attack +100. --> <!-- Earth Attribute Attack +100. -->
<icon>icon.agathion_earth_1</icon> <icon>icon.agathion_earth_1</icon>
<operateType>P</operateType> <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>
<skill id="51097" toLevel="1" name="Radiant Spirit's Varnish"> <skill id="51097" toLevel="1" name="Radiant Spirit's Varnish">
<icon>icon.ev_charge_scroll</icon> <icon>icon.ev_charge_scroll</icon>

View File

@@ -8,26 +8,70 @@
<skill id="51101" toLevel="1" name="Agathion Summon - Ignis"> <skill id="51101" toLevel="1" name="Agathion Summon - Ignis">
<!-- Summon Ignis Agathion. --> <!-- Summon Ignis Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon> <icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime> <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>
<skill id="51102" toLevel="1" name="Agathion Summon - Nebula"> <skill id="51102" toLevel="1" name="Agathion Summon - Nebula">
<!-- Summon Nebula Agathion. --> <!-- Summon Nebula Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon> <icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime> <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>
<skill id="51103" toLevel="1" name="Agathion Summon - Procella"> <skill id="51103" toLevel="1" name="Agathion Summon - Procella">
<!-- Summon Procella Agathion. --> <!-- Summon Procella Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon> <icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime> <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>
<skill id="51104" toLevel="1" name="Agathion Summon - Petram"> <skill id="51104" toLevel="1" name="Agathion Summon - Petram">
<!-- Summon Petram Agathion. --> <!-- Summon Petram Agathion. -->
<icon>icon.etc_summon_aga_agit_i00</icon> <icon>icon.etc_summon_aga_agit_i00</icon>
<operateType>A1</operateType>
<hitTime>3000</hitTime> <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>
<skill id="51105" toLevel="1" name="Improved Master Fisherman's Blessing"> <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. --> <!-- 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"> <skill id="51125" toLevel="1" name="Quick MP Recovery Potion">
<icon>icon.etc_potion_blue_i00</icon> <icon>icon.etc_potion_blue_i00</icon>
<operateType>A1</operateType> <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>
<skill id="51126" toLevel="1" name="Intermediate Spirit's Blessing"> <skill id="51126" toLevel="1" name="Intermediate Spirit's Blessing">
<!-- For 20 min. Acquired XP +30%. --> <!-- For 20 min. Acquired XP +30%. -->
<icon>icon.elemental_bless_scrl_i00</icon> <icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <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>
<skill id="51127" toLevel="1" name="Advanced Spirit's Blessing"> <skill id="51127" toLevel="1" name="Advanced Spirit's Blessing">
<!-- For 20 min. Acquired XP +50%. --> <!-- For 20 min. Acquired XP +50%. -->
<icon>icon.elemental_bless_scrl_i00</icon> <icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <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>
<skill id="51128" toLevel="1" name="Spirit's Varnish"> <skill id="51128" toLevel="1" name="Spirit's Varnish">
<icon>icon.ev_charge_scroll</icon> <icon>icon.ev_charge_scroll</icon>
@@ -185,30 +265,74 @@
<skill id="51130" toLevel="1" name="Fire Attribute Attack Potion"> <skill id="51130" toLevel="1" name="Fire Attribute Attack Potion">
<!-- Use to get Fire Attack Power +50 for 20 min. --> <!-- Use to get Fire Attack Power +50 for 20 min. -->
<icon>icon.etc_fire_potion_i00</icon> <icon>icon.etc_fire_potion_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay> <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>
<skill id="51131" toLevel="1" name="Water Attribute Attack Potion"> <skill id="51131" toLevel="1" name="Water Attribute Attack Potion">
<!-- Use to get Water Attack Power +50 for 20 min. --> <!-- Use to get Water Attack Power +50 for 20 min. -->
<icon>icon.etc_water_potion_i00</icon> <icon>icon.etc_water_potion_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay> <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>
<skill id="51132" toLevel="1" name="Wind Attribute Attack Potion"> <skill id="51132" toLevel="1" name="Wind Attribute Attack Potion">
<!-- Use to get Wind Attack Power +50 for 20 min. --> <!-- Use to get Wind Attack Power +50 for 20 min. -->
<icon>icon.etc_wind_potion_i00</icon> <icon>icon.etc_wind_potion_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay> <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>
<skill id="51133" toLevel="1" name="Earth Attribute Attack Potion"> <skill id="51133" toLevel="1" name="Earth Attribute Attack Potion">
<!-- Use to get Earth Attack Power +50 for 20 min. --> <!-- Use to get Earth Attack Power +50 for 20 min. -->
<icon>icon.etc_earth_potion_i00</icon> <icon>icon.etc_earth_potion_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <abnormalLvl>1</abnormalLvl>
<abnormalTime>1200</abnormalTime>
<magicLvl>1</magicLvl>
<reuseDelay>60000</reuseDelay> <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>
<skill id="51134" toLevel="1" name="Scroll of Escape: Forge of the Gods"> <skill id="51134" toLevel="1" name="Scroll of Escape: Forge of the Gods">
<operateType>A1</operateType> <operateType>A1</operateType>
@@ -356,7 +480,20 @@
<skill id="51162" toLevel="1" name="Quality Quick MP Recovery Potion"> <skill id="51162" toLevel="1" name="Quality Quick MP Recovery Potion">
<!-- Instantly recovers 300 MP. --> <!-- Instantly recovers 300 MP. -->
<icon>icon.etc_potion_blue_i00</icon> <icon>icon.etc_potion_blue_i00</icon>
<blockedInOlympiad>true</blockedInOlympiad>
<isMagic>2</isMagic> <!-- Static Skill -->
<magicLvl>1</magicLvl>
<operateType>A1</operateType> <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>
<skill id="51163" toLevel="1" name="Sealed Rune Lvl 14"> <skill id="51163" toLevel="1" name="Sealed Rune Lvl 14">
<operateType>A1</operateType> <operateType>A1</operateType>

View File

@@ -153,33 +153,108 @@
<!-- Water Attack Defense +20. --> <!-- Water Attack Defense +20. -->
<icon>icon.elemental_necklace_water_i00</icon> <icon>icon.elemental_necklace_water_i00</icon>
<operateType>P</operateType> <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>
<skill id="54024" toLevel="5" name="Fire Attack Defense"> <skill id="54024" toLevel="5" name="Fire Attack Defense">
<!-- Fire Attack Defense +20. --> <!-- Fire Attack Defense +20. -->
<icon>icon.elemental_necklace_fire_i00</icon> <icon>icon.elemental_necklace_fire_i00</icon>
<operateType>P</operateType> <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>
<skill id="54025" toLevel="5" name="Wind Attack Defense"> <skill id="54025" toLevel="5" name="Wind Attack Defense">
<!-- Wind Attack Defense +20. --> <!-- Wind Attack Defense +20. -->
<icon>icon.elemental_necklace_wind_i00</icon> <icon>icon.elemental_necklace_wind_i00</icon>
<operateType>P</operateType> <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>
<skill id="54026" toLevel="5" name="Earth Attack Defense"> <skill id="54026" toLevel="5" name="Earth Attack Defense">
<!-- Earth Attack Defense +20. --> <!-- Earth Attack Defense +20. -->
<icon>icon.elemental_necklace_earth_i00</icon> <icon>icon.elemental_necklace_earth_i00</icon>
<operateType>P</operateType> <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>
<skill id="54027" toLevel="5" name="Attribute XP Increase"> <skill id="54027" toLevel="5" name="Attribute XP Increase">
<!-- Acquired attribute XP +3%. --> <!-- Acquired attribute XP +3%. -->
<icon>icon.skill_transform_s_attack</icon> <icon>icon.skill_transform_s_attack</icon>
<operateType>P</operateType> <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>
<skill id="54028" toLevel="1" name="Spirit's Blessing"> <skill id="54028" toLevel="1" name="Spirit's Blessing">
<!-- For 20 min. Acquired XP +50%. --> <!-- For 20 min. Acquired XP +50%. -->
<icon>icon.elemental_bless_scrl_i00</icon> <icon>icon.elemental_bless_scrl_i00</icon>
<operateType>A1</operateType> <operateType>A2</operateType>
<isMagic>4</isMagic> <abnormalLvl>1</abnormalLvl>
<effectPoint>1</effectPoint> <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>
<skill id="54029" toLevel="4" name="Venir's Blessing"> <skill id="54029" toLevel="4" name="Venir's Blessing">
<!-- When equipped, CON, MEN, DEX, WIT, STR, INT +$s1. --> <!-- When equipped, CON, MEN, DEX, WIT, STR, INT +$s1. -->
@@ -195,21 +270,153 @@
<!-- Max HP +50. --> <!-- Max HP +50. -->
<icon>icon.elemental_necklace_fire_i00</icon> <icon>icon.elemental_necklace_fire_i00</icon>
<operateType>P</operateType> <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>
<skill id="54031" toLevel="11" name="Nebula's Necklace Basic Effect"> <skill id="54031" toLevel="11" name="Nebula's Necklace Basic Effect">
<!-- Max HP +50. --> <!-- Max HP +50. -->
<icon>icon.elemental_necklace_water_i00</icon> <icon>icon.elemental_necklace_water_i00</icon>
<operateType>P</operateType> <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>
<skill id="54032" toLevel="11" name="Procella's Necklace Basic Effect"> <skill id="54032" toLevel="11" name="Procella's Necklace Basic Effect">
<!-- Max HP +50. --> <!-- Max HP +50. -->
<icon>icon.elemental_necklace_wind_i00</icon> <icon>icon.elemental_necklace_wind_i00</icon>
<operateType>P</operateType> <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>
<skill id="54033" toLevel="11" name="Petram's Necklace Basic Effect"> <skill id="54033" toLevel="11" name="Petram's Necklace Basic Effect">
<!-- Max HP +50. --> <!-- Max HP +50. -->
<icon>icon.elemental_necklace_earth_i00</icon> <icon>icon.elemental_necklace_earth_i00</icon>
<operateType>P</operateType> <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>
<skill id="54034" toLevel="10" name="Anakim's Power"> <skill id="54034" toLevel="10" name="Anakim's Power">
<!-- When using the Recharge skill, MP Recovery Rate +5, M. Atk. +1%. --> <!-- 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. 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. DoubleCast: Triggers Fire, Water, Wind, Earth stance and enables the ability to cast two skills at once.
DuelistFury: Synergy effect for Faceoff effect. (l2jmobius) 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. EnableCloak: See/unsee cloaks.
EnemyCharge: Charges towards the enemy. Rush Impact. EnemyCharge: Charges towards the enemy. Rush Impact.
EnergyAttack: Physical attack based on Momentum formula. Triple Sonic Slash, Double Sonic Slash etc. 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. Sow: Planting a seed into NPC target. Manor stuff.
Speed: Speed stat. Speed: Speed stat.
SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range. SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range.
SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson)
SpModify: Bonus SP stat. SpModify: Bonus SP stat.
Spoil: Spoils a mob activating its extra sweep drop. Spoil: Spoils a mob activating its extra sweep drop.
StatBonusSkillCritical: Changes skill critical rate to depend on the specified base stat. 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="exp" type="xs:decimal" />
<xs:attribute name="sp" type="xs:decimal" /> <xs:attribute name="sp" type="xs:decimal" />
<xs:attribute name="raidPoints" type="xs:decimal" /> <xs:attribute name="raidPoints" type="xs:decimal" />
<xs:attribute name="attribute_exp" type="xs:decimal" />
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="mpReward" minOccurs="0" maxOccurs="1"> <xs:element name="mpReward" minOccurs="0" maxOccurs="1">
@@ -302,6 +303,7 @@
<xs:attribute name="usingServerSideName" type="xs:boolean" /> <xs:attribute name="usingServerSideName" type="xs:boolean" />
<xs:attribute name="title" type="xs:string" /> <xs:attribute name="title" type="xs:string" />
<xs:attribute name="usingServerSideTitle" type="xs:boolean" /> <xs:attribute name="usingServerSideTitle" type="xs:boolean" />
<xs:attribute name="element" type="xs:string" />
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:sequence> </xs:sequence>

View File

@@ -16,6 +16,9 @@
*/ */
package org.l2jmobius.commons.util; package org.l2jmobius.commons.util;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -27,11 +30,14 @@ import java.time.DayOfWeek;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.function.Predicate;
import java.util.function.ToIntFunction;
import org.l2jmobius.Config; import org.l2jmobius.Config;
@@ -587,4 +593,29 @@ public final class CommonUtil
final DecimalFormat formatter = new DecimalFormat(format, new DecimalFormatSymbols(Locale.ENGLISH)); final DecimalFormat formatter = new DecimalFormat(format, new DecimalFormatSymbols(Locale.ENGLISH));
return formatter.format(val); 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.CubicData;
import org.l2jmobius.gameserver.data.xml.impl.DailyMissionData; import org.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
import org.l2jmobius.gameserver.data.xml.impl.DoorData; 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.EnchantItemData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData;
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData; import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
@@ -239,6 +240,7 @@ public class GameServer
ClanRewardData.getInstance(); ClanRewardData.getInstance();
DailyMissionHandler.getInstance().executeScript(); DailyMissionHandler.getInstance().executeScript();
DailyMissionData.getInstance(); DailyMissionData.getInstance();
ElementalSpiritData.getInstance();
printSection("Skills"); printSection("Skills");
SkillConditionHandler.getInstance().executeScript(); 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.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.AISkillScope; import org.l2jmobius.gameserver.enums.AISkillScope;
import org.l2jmobius.gameserver.enums.DropType; import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType; import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.MpRewardType; import org.l2jmobius.gameserver.enums.MpRewardType;
import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.StatsSet;
@@ -110,6 +111,7 @@ public class NpcData implements IXmlReader
set.set("usingServerSideName", parseBoolean(attrs, "usingServerSideName")); set.set("usingServerSideName", parseBoolean(attrs, "usingServerSideName"));
set.set("title", parseString(attrs, "title")); set.set("title", parseString(attrs, "title"));
set.set("usingServerSideTitle", parseBoolean(attrs, "usingServerSideTitle")); set.set("usingServerSideTitle", parseBoolean(attrs, "usingServerSideTitle"));
set.set("elementalType", parseEnum(attrs, ElementalType.class, "element"));
for (Node npcNode = listNode.getFirstChild(); npcNode != null; npcNode = npcNode.getNextSibling()) for (Node npcNode = listNode.getFirstChild(); npcNode != null; npcNode = npcNode.getNextSibling())
{ {
attrs = npcNode.getAttributes(); attrs = npcNode.getAttributes();
@@ -143,6 +145,7 @@ public class NpcData implements IXmlReader
set.set("exp", parseDouble(attrs, "exp")); set.set("exp", parseDouble(attrs, "exp"));
set.set("sp", parseDouble(attrs, "sp")); set.set("sp", parseDouble(attrs, "sp"));
set.set("raidPoints", parseDouble(attrs, "raidPoints")); set.set("raidPoints", parseDouble(attrs, "raidPoints"));
set.set("attribute_exp", parseLong(attrs, "attribute_exp"));
break; break;
} }
case "mpreward": 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.datatables.ItemTable;
import org.l2jmobius.gameserver.enums.ChatType; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.DropType; import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.Team; import org.l2jmobius.gameserver.enums.Team;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; 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.AggroInfo;
import org.l2jmobius.gameserver.model.CommandChannel; import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.DamageDoneInfo; import org.l2jmobius.gameserver.model.DamageDoneInfo;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party;
import org.l2jmobius.gameserver.model.Seed; import org.l2jmobius.gameserver.model.Seed;
import org.l2jmobius.gameserver.model.WorldObject; import org.l2jmobius.gameserver.model.WorldObject;
@@ -519,6 +521,8 @@ public class Attackable extends Npc
attacker.updateVitalityPoints(getVitalityPoints(attacker.getLevel(), exp, _isRaid), true, false); attacker.updateVitalityPoints(getVitalityPoints(attacker.getLevel(), exp, _isRaid), true, false);
PcCafePointsManager.getInstance().givePcCafePoint(attacker, exp); PcCafePointsManager.getInstance().givePcCafePoint(attacker, exp);
} }
rewardAttributeExp(attacker, damage, totalDamage);
} }
} }
} }
@@ -616,6 +620,11 @@ public class Attackable extends Npc
if (partyDmg > 0) if (partyDmg > 0)
{ {
attackerParty.distributeXpAndSp(exp, sp, rewardedMembers, partyLvl, partyDmg, this); 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 @Override
public void addAttackerToAttackByList(Creature creature) 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.AttributeType;
import org.l2jmobius.gameserver.enums.BasicProperty; import org.l2jmobius.gameserver.enums.BasicProperty;
import org.l2jmobius.gameserver.enums.CategoryType; import org.l2jmobius.gameserver.enums.CategoryType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.ItemSkillType; import org.l2jmobius.gameserver.enums.ItemSkillType;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
@@ -2691,6 +2692,18 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
info.addComponentType(UserInfoType.ATK_ELEMENTAL); info.addComponentType(UserInfoType.ATK_ELEMENTAL);
break; 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); double elementalDamage = 0;
if (damageCap > 0)
{
value = Math.min(value, damageCap);
}
// Calculate PvP/PvE damage received. It is a post-attack stat. // Calculate PvP/PvE damage received. It is a post-attack stat.
if (attacker != null) 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; 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)) 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) 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 target
* @param skill * @param skill
* @param damage * @param damage
* @param elementalDamage
* @param crit * @param crit
* @param miss * @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; _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.AISkillScope;
import org.l2jmobius.gameserver.enums.AIType; import org.l2jmobius.gameserver.enums.AIType;
import org.l2jmobius.gameserver.enums.ChatType; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.InstanceType; import org.l2jmobius.gameserver.enums.InstanceType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType; import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.PrivateStoreType; import org.l2jmobius.gameserver.enums.PrivateStoreType;
@@ -868,6 +869,17 @@ public class Npc extends Creature
return getTemplate().getSP() * rateMul; 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> * Kill the NpcInstance (the corpse disappeared after 7 seconds).<br>
* <B><U>Actions</U>:</B> * <B><U>Actions</U>:</B>

View File

@@ -734,7 +734,7 @@ public abstract class Summon extends Playable
} }
@Override @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)) 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) 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); 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 @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()) if (miss || (getSummoner() == null) || !getSummoner().isPlayer())
{ {

View File

@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.database.DatabaseFactory;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.GameTimeController; import org.l2jmobius.gameserver.GameTimeController;
import org.l2jmobius.gameserver.ItemsAutoDestroy; 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.CategoryType;
import org.l2jmobius.gameserver.enums.ChatType; import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.enums.ClanWarState; import org.l2jmobius.gameserver.enums.ClanWarState;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.GroupType; import org.l2jmobius.gameserver.enums.GroupType;
import org.l2jmobius.gameserver.enums.HtmlActionScope; import org.l2jmobius.gameserver.enums.HtmlActionScope;
import org.l2jmobius.gameserver.enums.IllegalActionPunishmentType; 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.CastleManager;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import org.l2jmobius.gameserver.instancemanager.DuelManager; import org.l2jmobius.gameserver.instancemanager.DuelManager;
import org.l2jmobius.gameserver.instancemanager.ElementalSpiritInstanceManager;
import org.l2jmobius.gameserver.instancemanager.FortManager; import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager; import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager; 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.BlockList;
import org.l2jmobius.gameserver.model.CommandChannel; import org.l2jmobius.gameserver.model.CommandChannel;
import org.l2jmobius.gameserver.model.ContactList; import org.l2jmobius.gameserver.model.ContactList;
import org.l2jmobius.gameserver.model.ElementalSpirit;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.Macro; import org.l2jmobius.gameserver.model.Macro;
import org.l2jmobius.gameserver.model.MacroList; 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.events.impl.creature.player.OnPlayerSubChange;
import org.l2jmobius.gameserver.model.fishing.Fishing; import org.l2jmobius.gameserver.model.fishing.Fishing;
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder; 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.ItemHolder;
import org.l2jmobius.gameserver.model.holders.MovieHolder; import org.l2jmobius.gameserver.model.holders.MovieHolder;
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder; 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 final Set<Integer> _whisperers = ConcurrentHashMap.newKeySet();
private ElementalSpirit[] _spirits;
private ElementalType _activeElementalSpiritType;
// Selling buffs system // Selling buffs system
private boolean _isSellingBuffs = false; private boolean _isSellingBuffs = false;
private List<SellBuffHolder> _sellingBuffs = null; private List<SellBuffHolder> _sellingBuffs = null;
@@ -2350,6 +2358,7 @@ public final class PlayerInstance extends Playable
if (getClassId().level() == 3) if (getClassId().level() == 3)
{ {
sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_YOUR_THIRD_CLASS_TRANSFER_QUEST); sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_YOUR_THIRD_CLASS_TRANSFER_QUEST);
initElementalSpirits();
} }
else else
{ {
@@ -6662,6 +6671,11 @@ public final class PlayerInstance extends Playable
player.setSponsor(rset.getInt("sponsor")); player.setSponsor(rset.getInt("sponsor"));
player.setLvlJoinedAcademy(rset.getInt("lvl_joined_academy")); player.setLvlJoinedAcademy(rset.getInt("lvl_joined_academy"));
if ((player.getLevel() >= 76) && (player.getClassId().level() > 2))
{
player.initElementalSpirits();
}
CursedWeaponsManager.getInstance().checkPlayer(player); CursedWeaponsManager.getInstance().checkPlayer(player);
// Set the x,y,z position of the PlayerInstance and make it invisible // 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(); aVars.storeMe();
} }
if (_spirits != null)
{
for (ElementalSpirit spirit : _spirits)
{
if (spirit != null)
{
spirit.save();
}
}
}
} }
@Override @Override
@@ -11434,7 +11459,7 @@ public final class PlayerInstance extends Playable
} }
@Override @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 // Check if hit is missed
if (miss) if (miss)
@@ -11497,7 +11522,15 @@ public final class PlayerInstance extends Playable
} }
else if (this != target) else if (this != target)
{ {
sm = new SystemMessage(SystemMessageId.C1_HAS_INFLICTED_S3_DAMAGE_ON_C2); 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); sm.addPcName(this);
// Localisation related. // Localisation related.
@@ -11513,6 +11546,10 @@ public final class PlayerInstance extends Playable
sm.addString(targetName); sm.addString(targetName);
sm.addInt(damage); sm.addInt(damage);
if (elementalDamage != 0)
{
sm.addInt((int) elementalDamage);
}
sm.addPopup(target.getObjectId(), getObjectId(), -damage); sm.addPopup(target.getObjectId(), getObjectId(), -damage);
} }
@@ -13922,4 +13959,139 @@ public final class PlayerInstance extends Playable
getVariables().set(ATTENDANCE_INDEX_VAR, rewardIndex); 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) 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); 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 @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)) if (miss || (_owner == null))
{ {

View File

@@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData; 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.PartySmallWindowUpdateType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party;
@@ -684,6 +685,31 @@ public class PlayerStat extends PlayableStat
return (int) getValue(Stats.ARTIFACT_SLOTS, 0); 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 @Override
protected void onRecalculateStats(boolean broadcast) 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.AISkillScope;
import org.l2jmobius.gameserver.enums.AIType; import org.l2jmobius.gameserver.enums.AIType;
import org.l2jmobius.gameserver.enums.DropType; import org.l2jmobius.gameserver.enums.DropType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.MpRewardAffectType; import org.l2jmobius.gameserver.enums.MpRewardAffectType;
import org.l2jmobius.gameserver.enums.MpRewardType; import org.l2jmobius.gameserver.enums.MpRewardType;
import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.enums.Race;
@@ -118,6 +119,9 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
private List<Integer> _extendDrop; private List<Integer> _extendDrop;
private ElementalType _elementalType;
private long _attributeExp;
/** /**
* Constructor of Creature. * Constructor of Creature.
* @param set The StatsSet object to transfer data to the method * @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)); setRace(set.getEnum("race", Race.class, Race.NONE));
_sex = set.getEnum("sex", Sex.class, Sex.ETC); _sex = set.getEnum("sex", Sex.class, Sex.ETC);
_elementalType = set.getEnum("elementalType", ElementalType.class, ElementalType.NONE);
_chestId = set.getInt("chestId", 0); _chestId = set.getInt("chestId", 0);
_rhandId = set.getInt("rhandId", 0); _rhandId = set.getInt("rhandId", 0);
_lhandId = set.getInt("lhandId", 0); _lhandId = set.getInt("lhandId", 0);
@@ -150,6 +156,7 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
_exp = set.getDouble("exp", 0); _exp = set.getDouble("exp", 0);
_sp = set.getDouble("sp", 0); _sp = set.getDouble("sp", 0);
_raidPoints = set.getDouble("raidPoints", 0); _raidPoints = set.getDouble("raidPoints", 0);
_attributeExp = set.getLong("attribute_exp", 0);
_unique = set.getBoolean("unique", false); _unique = set.getBoolean("unique", false);
_attackable = set.getBoolean("attackable", true); _attackable = set.getBoolean("attackable", true);
@@ -354,6 +361,16 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
return _raidPoints; return _raidPoints;
} }
public long getAttributeExp()
{
return _attributeExp;
}
public ElementalType getElementalType()
{
return _elementalType;
}
public boolean isUnique() public boolean isUnique()
{ {
return _unique; 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.OnCreatureTeleported;
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter; 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.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.OnAttackableAggroRangeEnter;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAttack; import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAttack;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableFactionCall; 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.OnNpcSpawn;
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleport; 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.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.OnPlayableExpChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged; import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment; 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_DESTROY(OnInstanceDestroy.class, void.class),
ON_INSTANCE_ENTER(OnInstanceEnter.class, void.class), ON_INSTANCE_ENTER(OnInstanceEnter.class, void.class),
ON_INSTANCE_LEAVE(OnInstanceLeave.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<? extends IBaseEvent> _eventClass;
private final Class<?>[] _returnClass; 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.AttributeType;
import org.l2jmobius.gameserver.enums.BasicProperty; import org.l2jmobius.gameserver.enums.BasicProperty;
import org.l2jmobius.gameserver.enums.DispelSlotType; import org.l2jmobius.gameserver.enums.DispelSlotType;
import org.l2jmobius.gameserver.enums.ElementalType;
import org.l2jmobius.gameserver.enums.Position; import org.l2jmobius.gameserver.enums.Position;
import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.enums.ShotType;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
@@ -1652,4 +1653,77 @@ public final class Formulas
return 1; 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"), HATE_ATTACK("attackHate"),
REAR_DAMAGE_RATE("rearDamage"), 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 BONUS
PVP_PHYSICAL_ATTACK_DAMAGE("pvpPhysDmg"), PVP_PHYSICAL_ATTACK_DAMAGE("pvpPhysDmg"),
PVP_MAGICAL_SKILL_DAMAGE("pvpMagicalDmg"), 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.crystalization.RequestCrystallizeItemCancel;
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestOneDayRewardReceive; import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestOneDayRewardReceive;
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestTodoList; 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.ExElementalSpiritInfo;
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritSetTalent;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul; import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction; import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo; 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_INFO(0x14E, null, ConnectionState.IN_GAME),
EX_PLEDGE_ITEM_BUY(0x14F, 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_INFO(0x150, ExElementalSpiritInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, ExElementalSpiritExtractInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, ExElementalSpiritExtract::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, ExElementalSpiritEvolutionInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, ExElementalSpiritEvolution::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, ExElementalSpiritSetTalent::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, ExElementalInitTalent::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, ExElementalSpiritAbsorbInfo::new, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_ABSORB(0x158, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_ABSORB(0x158, ExElementalSpiritAbsorb::new, ConnectionState.IN_GAME),
EX_REQUEST_LOCKED_ITEM(0x159, null, ConnectionState.IN_GAME), EX_REQUEST_LOCKED_ITEM(0x159, null, ConnectionState.IN_GAME),
EX_REQUEST_UNLOCKED_ITEM(0x15A, null, ConnectionState.IN_GAME), EX_REQUEST_UNLOCKED_ITEM(0x15A, null, ConnectionState.IN_GAME),
EX_LOCKED_ITEM_CANCEL(0x15B, null, ConnectionState.IN_GAME), EX_LOCKED_ITEM_CANCEL(0x15B, null, ConnectionState.IN_GAME),
EX_UNLOCKED_ITEM_CANCEL(0x15C, null, ConnectionState.IN_GAME), EX_UNLOCKED_ITEM_CANCEL(0x15C, null, ConnectionState.IN_GAME),
REQUEST_BLOCK_LIST_FOR_AD(0x15D, null, ConnectionState.IN_GAME), EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15D, ExElementalSpiritChangeType::new, ConnectionState.IN_GAME), // 152
REQUEST_USER_BAN_INFO(0x15E, null, ConnectionState.IN_GAME), REQUEST_BLOCK_LIST_FOR_AD(0x15E, null, ConnectionState.IN_GAME),
EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15F, null, ConnectionState.IN_GAME), // 152 REQUEST_USER_BAN_INFO(0x15F, null, ConnectionState.IN_GAME),
EX_INTERACT_MODIFY(0x160, null, ConnectionState.IN_GAME), // 152 EX_INTERACT_MODIFY(0x160, null, ConnectionState.IN_GAME), // 152
EX_TRY_ENCHANT_ARTIFACT(0x161, null, ConnectionState.IN_GAME), // 152 EX_TRY_ENCHANT_ARTIFACT(0x161, null, ConnectionState.IN_GAME), // 152
EX_XIGN_CODE(0x162, 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.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket; import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
/** /**
* @author Mobius * @author JoeAlisson
*/ */
public class ExElementalSpiritInfo implements IClientIncomingPacket public class ExElementalSpiritInfo implements IClientIncomingPacket
{ {
@SuppressWarnings("unused") private byte _type;
private int _id;
@Override @Override
public boolean read(GameClient client, PacketReader packet) public boolean read(GameClient client, PacketReader packet)
{ {
_id = packet.readC(); _type = (byte) packet.readC();
return true; return true;
} }
@@ -45,6 +45,6 @@ public class ExElementalSpiritInfo implements IClientIncomingPacket
return; 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_ELEMENT_NAME:
case SystemMessage.TYPE_BYTE: case SystemMessage.TYPE_BYTE:
case SystemMessage.TYPE_FACTION_NAME: case SystemMessage.TYPE_FACTION_NAME:
case SystemMessage.TYPE_ELEMENTAL_SPIRIT:
{ {
packet.writeC(param.getIntValue()); packet.writeC(param.getIntValue());
break; 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. public static final byte TYPE_FACTION_NAME = 24; // c(short), faction id.
// id 22 d (shared with 1-3,17,22 // id 22 d (shared with 1-3,17,22
// id 21 h // id 21 h
@@ -374,6 +375,12 @@ public final class SystemMessage implements IClientOutgoingPacket
return this; return this;
} }
public SystemMessage addElementalSpirit(int elementType)
{
append(new SMParam(TYPE_ELEMENTAL_SPIRIT, elementType));
return this;
}
public SMParam[] getParams() public SMParam[] getParams()
{ {
return _params; return _params;
@@ -419,6 +426,7 @@ public final class SystemMessage implements IClientOutgoingPacket
case TYPE_ELEMENT_NAME: case TYPE_ELEMENT_NAME:
case TYPE_BYTE: case TYPE_BYTE:
case TYPE_FACTION_NAME: case TYPE_FACTION_NAME:
case TYPE_ELEMENTAL_SPIRIT:
{ {
packet.writeC(param.getIntValue()); packet.writeC(param.getIntValue());
break; break;

View File

@@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.Config; import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter; import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData; import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
import org.l2jmobius.gameserver.enums.AttributeType;
import org.l2jmobius.gameserver.enums.UserInfoType; import org.l2jmobius.gameserver.enums.UserInfoType;
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager; import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import org.l2jmobius.gameserver.model.Party; import org.l2jmobius.gameserver.model.Party;
@@ -376,12 +375,12 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
if (containsMask(UserInfoType.ATT_SPIRITS)) // 152 if (containsMask(UserInfoType.ATT_SPIRITS)) // 152
{ {
packet.writeH(26); packet.writeH(26);
packet.writeD(_player.getAttackElementValue(_player.getAttackElement())); // Attribute Attack Power packet.writeD((int) _player.getActiveElementalSpiritAttack());
packet.writeD(_player.getDefenseElementValue(AttributeType.FIRE)); // Fire defence packet.writeD((int) _player.getFireSpiritDefense());
packet.writeD(_player.getDefenseElementValue(AttributeType.WATER)); // Water defence packet.writeD((int) _player.getWaterSpiritDefense());
packet.writeD(_player.getDefenseElementValue(AttributeType.WIND)); // Wind defence packet.writeD((int) _player.getWindSpiritDefense());
packet.writeD(_player.getDefenseElementValue(AttributeType.EARTH)); // Earth defence packet.writeD((int) _player.getEarthSpiritDefense());
packet.writeD(0x00); // Enabled 1 - Disabled 0 // Third class player? packet.writeD(_player.getActiveElementalSpiritType());
} }
return true; 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 -Parsed new NPCs from client
-Updated skiltrees and skills from L2Wiki -Updated skiltrees and skills from L2Wiki
-Updated experience values from L2Wiki -Updated experience values from L2Wiki
-Elemental Spirits
-Land of Winds spawns -Land of Winds spawns
-Goddard territory spawns -Goddard territory spawns
-Goddard clanhalls -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