Addition of Elemental Spirits.
Author: JoeAlisson Source: https://github.com/JoeAlisson/L2jOrg
This commit is contained in:
parent
18e0a4c4cd
commit
e97ef7dead
17
L2J_Mobius_Classic_2.3_SevenSigns/dist/db_installer/sql/game/character_spirits.sql
vendored
Normal file
17
L2J_Mobius_Classic_2.3_SevenSigns/dist/db_installer/sql/game/character_spirits.sql
vendored
Normal 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;
|
187
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/ElementalSpiritData.xml
vendored
Normal file
187
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/ElementalSpiritData.xml
vendored
Normal 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>
|
14
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-1.htm
vendored
Normal file
14
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-1.htm
vendored
Normal 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>
|
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-11.htm
vendored
Normal file
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-11.htm
vendored
Normal 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>
|
15
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-12.htm
vendored
Normal file
15
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-12.htm
vendored
Normal 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>
|
14
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-13.htm
vendored
Normal file
14
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-13.htm
vendored
Normal 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>
|
9
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-14.htm
vendored
Normal file
9
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-14.htm
vendored
Normal 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>
|
6
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-15.htm
vendored
Normal file
6
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-15.htm
vendored
Normal 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>
|
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-16.htm
vendored
Normal file
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-16.htm
vendored
Normal 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>
|
5
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-17.htm
vendored
Normal file
5
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-17.htm
vendored
Normal 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>
|
9
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-18.htm
vendored
Normal file
9
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-18.htm
vendored
Normal 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>
|
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-19.htm
vendored
Normal file
8
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/html/merchant/34053-19.htm
vendored
Normal 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>
|
@ -1,11 +1,11 @@
|
||||
<html><body>Svein:<br><br>
|
||||
Have you heard of <font color="LEVEL">Spirits</font>?<br1>
|
||||
Honestly, there are not many people who actually know about them.<br1>
|
||||
Not all Spirits are hostile, as the common opinion goes. Moreover, there are those among them who would like to befriend a mighty warrior, like yourself.
|
||||
I can tell you more if you want.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500000">Use Attribute Fragment</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500001">Ask about Attribute Spirits</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500002">Ask about Spirit Agathions</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500003">Ask about Spirit Necklaces</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500004">Ask about materials for Spirits</Button>
|
||||
<html><body>Svein:<br>
|
||||
Adventurer, have you heard of <font color="LEVEL">Spirits</font>?<br1>
|
||||
There are few who know of the spirits.<br1>
|
||||
Not all Spirits are hostile, as many believe. There are those who wish to befriend mortals. If you're interested, I can also Help you.<br>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500002">Use fragments of each attribute.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest AttributeMaster learn">Ask to be introduced to Spirits.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500001">Ask about Spirit Agathions.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500000">Ask about Spirit Necklaces.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Multisell 3500003">Ask about materials for Spirits.</Button>
|
||||
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Chat 1">Ask about Spirits.</Button>
|
||||
</body></html>
|
@ -1,122 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list applyTaxes="false" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
|
||||
<list applyTaxes="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/multisell.xsd">
|
||||
<npcs>
|
||||
<npc>34053</npc> <!-- Attribute Master Svein -->
|
||||
</npcs>
|
||||
<item>
|
||||
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91039" count="500" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="100000" /> <!-- Adena -->
|
||||
<production id="91043" count="1" /> <!-- Nebula’ Old Necklace Lv1 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91043" count="1" /> <!-- Nebula’ Old Necklace Lv1 -->
|
||||
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91039" count="600" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="200000" /> <!-- Adena -->
|
||||
<production id="91044" count="1" /> <!-- Nebula’ Old Necklace Lv2 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91044" count="1" /> <!-- Nebula’ Old Necklace Lv2 -->
|
||||
<ingredient id="91039" count="200" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91039" count="800" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="300000" /> <!-- Adena -->
|
||||
<production id="91045" count="1" /> <!-- Nebula’ Old Necklace Lv3 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91045" count="1" /> <!-- Nebula’ Old Necklace Lv3 -->
|
||||
<ingredient id="91039" count="300" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91039" count="900" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="400000" /> <!-- Adena -->
|
||||
<production id="91116" count="1" /> <!-- Nebula’ Old Necklace Lv4 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91116" count="1" /> <!-- Nebula’ Old Necklace Lv4 -->
|
||||
<ingredient id="91039" count="400" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91039" count="1200" /> <!-- Water Attribute Fragment -->
|
||||
<ingredient id="57" count="900000" /> <!-- Adena -->
|
||||
<production id="91117" count="1" /> <!-- Nebula’ Necklace -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91040" count="500" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="100000" /> <!-- Adena -->
|
||||
<production id="91046" count="1" /> <!-- Ignis’ Old Necklace Lv1 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91046" count="1" /> <!-- Ignis’ Old Necklace Lv1 -->
|
||||
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91040" count="600" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="200000" /> <!-- Adena -->
|
||||
<production id="91047" count="1" /> <!-- Ignis’ Old Necklace Lv2 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91047" count="1" /> <!-- Ignis’ Old Necklace Lv2 -->
|
||||
<ingredient id="91040" count="200" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91040" count="800" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="300000" /> <!-- Adena -->
|
||||
<production id="91048" count="1" /> <!-- Ignis’ Old Necklace Lv3 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91048" count="1" /> <!-- Ignis’ Old Necklace Lv3 -->
|
||||
<ingredient id="91040" count="300" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91040" count="900" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="400000" /> <!-- Adena -->
|
||||
<production id="91118" count="1" /> <!-- Ignis’ Old Necklace Lv4 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91118" count="1" /> <!-- Ignis’ Old Necklace Lv4 -->
|
||||
<ingredient id="91040" count="400" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91040" count="1200" /> <!-- Fire Attribute Fragment -->
|
||||
<ingredient id="57" count="900000" /> <!-- Adena -->
|
||||
<production id="91119" count="1" /> <!-- Ignis’ Necklace -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91041" count="500" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="100000" /> <!-- Adena -->
|
||||
<production id="91049" count="1" /> <!-- Procella’s Old Necklace Lv1 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91049" count="1" /> <!-- Procella’s Old Necklace Lv1 -->
|
||||
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91041" count="600" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="200000" /> <!-- Adena -->
|
||||
<production id="91050" count="1" /> <!-- Procella’s Old Necklace Lv2 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91050" count="1" /> <!-- Procella’s Old Necklace Lv2 -->
|
||||
<ingredient id="91041" count="200" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91041" count="800" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="300000" /> <!-- Adena -->
|
||||
<production id="91051" count="1" /> <!-- Procella’s Old Necklace Lv3 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91051" count="1" /> <!-- Procella’s Old Necklace Lv3 -->
|
||||
<ingredient id="91041" count="300" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91041" count="900" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="40000" /> <!-- Adena -->
|
||||
<production id="91120" count="1" /> <!-- Procella’s Old Necklace Lv4 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91120" count="1" /> <!-- Procella’s Old Necklace Lv4 -->
|
||||
<ingredient id="91041" count="400" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91041" count="1200" /> <!-- Wind Attribute Fragment -->
|
||||
<ingredient id="57" count="900000" /> <!-- Adena -->
|
||||
<production id="91121" count="1" /> <!-- Procella’s Necklace -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91042" count="500" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="100000" /> <!-- Adena -->
|
||||
<production id="91052" count="1" /> <!-- Petram’s Old Necklace Lv1 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91052" count="1" /> <!-- Petram’s Old Necklace Lv1 -->
|
||||
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91042" count="600" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="200000" /> <!-- Adena -->
|
||||
<production id="91053" count="1" /> <!-- Petram’s Old Necklace Lv2 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91053" count="1" /> <!-- Petram’s Old Necklace Lv2 -->
|
||||
<ingredient id="91042" count="200" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91042" count="800" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="300000" /> <!-- Adena -->
|
||||
<production id="91054" count="1" /> <!-- Petram’s Old Necklace Lv3 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91054" count="1" /> <!-- Petram’s Old Necklace Lv3 -->
|
||||
<ingredient id="91042" count="300" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91042" count="900" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="400000" /> <!-- Adena -->
|
||||
<production id="91122" count="1" /> <!-- Petram’s Old Necklace Lv4 -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91122" count="1" /> <!-- Petram’s Old Necklace Lv4 -->
|
||||
<ingredient id="91042" count="400" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="3000000" /> <!-- Adena -->
|
||||
<ingredient id="91042" count="1200" /> <!-- Earth Attribute Fragment -->
|
||||
<ingredient id="57" count="900000" /> <!-- Adena -->
|
||||
<production id="91123" count="1" /> <!-- Petram’s Necklace -->
|
||||
</item>
|
||||
</list>
|
26
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500001.xml
vendored
Normal file
26
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500001.xml
vendored
Normal 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" /> <!-- Nebula’s Breath-->
|
||||
<ingredient id="57" count="2000000" /> <!-- Adena -->
|
||||
<production id="91130" count="1" /> <!-- Agathion Nebula -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91127" count="1" /> <!-- Procella’s Breath-->
|
||||
<ingredient id="57" count="2000000" /> <!-- Adena -->
|
||||
<production id="91131" count="1" /> <!-- Agathion Procella -->
|
||||
</item>
|
||||
<item>
|
||||
<ingredient id="91128" count="1" /> <!-- Petram’s Breath-->
|
||||
<ingredient id="57" count="2000000" /> <!-- Adena -->
|
||||
<production id="91132" count="1" /> <!-- Agathion Petram -->
|
||||
</item>
|
||||
</list>
|
146
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500002.xml
vendored
Normal file
146
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500002.xml
vendored
Normal 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>
|
139
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500003.xml
vendored
Normal file
139
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/multisell/3500003.xml
vendored
Normal 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>
|
@ -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();
|
||||
}
|
||||
}
|
@ -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>
|
7
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/ai/others/AttributeMaster/learn.htm
vendored
Normal file
7
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/ai/others/AttributeMaster/learn.htm
vendored
Normal 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>
|
@ -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>
|
@ -29,6 +29,7 @@ import handlers.dailymissionhandlers.LoginWeekendDailyMissionHandler;
|
||||
import handlers.dailymissionhandlers.OlympiadDailyMissionHandler;
|
||||
import handlers.dailymissionhandlers.QuestDailyMissionHandler;
|
||||
import handlers.dailymissionhandlers.SiegeDailyMissionHandler;
|
||||
import handlers.dailymissionhandlers.SpiritDailyMissionHandler;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
@ -48,6 +49,7 @@ public class DailyMissionMasterHandler
|
||||
DailyMissionHandler.getInstance().registerHandler("ceremonyofchaos", CeremonyOfChaosDailyMissionHandler::new);
|
||||
DailyMissionHandler.getInstance().registerHandler("boss", BossDailyMissionHandler::new);
|
||||
DailyMissionHandler.getInstance().registerHandler("fishing", FishingDailyMissionHandler::new);
|
||||
DailyMissionHandler.getInstance().registerHandler("spirit", SpiritDailyMissionHandler::new);
|
||||
LOGGER.info(DailyMissionMasterHandler.class.getSimpleName() + ": Loaded " + DailyMissionHandler.getInstance().size() + " handlers.");
|
||||
}
|
||||
}
|
||||
|
@ -130,6 +130,8 @@ public final class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("DispelBySlotProbability", DispelBySlotProbability::new);
|
||||
EffectHandler.getInstance().registerHandler("DoubleCast", DoubleCast::new);
|
||||
EffectHandler.getInstance().registerHandler("DuelistFury", DuelistFury::new);
|
||||
EffectHandler.getInstance().registerHandler("ElementalSpiritAttack", ElementalSpiritAttack::new);
|
||||
EffectHandler.getInstance().registerHandler("ElementalSpiritDefense", ElementalSpiritDefense::new);
|
||||
EffectHandler.getInstance().registerHandler("EnableCloak", EnableCloak::new);
|
||||
EffectHandler.getInstance().registerHandler("EnergyAttack", EnergyAttack::new);
|
||||
EffectHandler.getInstance().registerHandler("EnlargeAbnormalSlot", EnlargeAbnormalSlot::new);
|
||||
@ -309,6 +311,7 @@ public final class EffectMasterHandler
|
||||
EffectHandler.getInstance().registerHandler("Sow", Sow::new);
|
||||
EffectHandler.getInstance().registerHandler("Speed", Speed::new);
|
||||
EffectHandler.getInstance().registerHandler("SphericBarrier", SphericBarrier::new);
|
||||
EffectHandler.getInstance().registerHandler("SpiritXpModify", SpiritExpModify::new);
|
||||
EffectHandler.getInstance().registerHandler("SpModify", SpModify::new);
|
||||
EffectHandler.getInstance().registerHandler("Spoil", Spoil::new);
|
||||
EffectHandler.getInstance().registerHandler("StatBonusSkillCritical", StatBonusSkillCritical::new);
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -97,7 +97,7 @@ public final class HealPercent extends AbstractEffect
|
||||
{
|
||||
final double damage = -amount;
|
||||
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false);
|
||||
effector.sendDamageMessage(effected, skill, (int) damage, false, false);
|
||||
effector.sendDamageMessage(effected, skill, (int) damage, 0, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ public final class Hp extends AbstractEffect
|
||||
{
|
||||
final double damage = -amount;
|
||||
effected.reduceCurrentHp(damage, effector, skill, false, false, false, false);
|
||||
effector.sendDamageMessage(effected, skill, (int) damage, false, false);
|
||||
effector.sendDamageMessage(effected, skill, (int) damage, 0, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ public class RealDamage extends AbstractEffect
|
||||
effected.reduceCurrentHp(_power, effector, skill, false, false, false, false);
|
||||
if (effector.isPlayer())
|
||||
{
|
||||
effector.sendDamageMessage(effected, skill, (int) _power, false, false);
|
||||
effector.sendDamageMessage(effected, skill, (int) _power, 0, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -136,6 +136,7 @@
|
||||
<npc id="31688" x="147688" y="28527" z="-2264" heading="38406" respawnTime="60sec"/>
|
||||
<npc id="31690" x="147648" y="28599" z="-2264" heading="40508" respawnTime="60sec"/>
|
||||
<npc id="35233" x="147464" y="1532" z="-468" heading="16383" respawnTime="60sec"/>
|
||||
<npc id="34053" x="147626" y="27368" z="-2206" heading="49449" respawnTime="60sec" /> <!-- Svein -->
|
||||
<npc id="30767" x="148009" y="28603" z="-2264" heading="52880" respawnTime="60sec" > <!-- Auctioneer -->
|
||||
<parameters>
|
||||
<param name="fnAgitMap" value="aden"/>
|
||||
|
@ -107,6 +107,7 @@
|
||||
<npc id="35458" x="81264" y="151728" z="-3528" heading="0" respawnTime="60sec" />
|
||||
<npc id="35459" x="81920" y="151968" z="-3512" heading="0" respawnTime="60sec" />
|
||||
<npc id="35460" x="81808" y="151776" z="-3528" heading="32000" respawnTime="60sec" />
|
||||
<npc id="34053" x="81749" y="147485" z="-3471" heading="16500" respawnTime="60sec" /> <!-- Svein -->
|
||||
</group>
|
||||
</spawn>
|
||||
</list>
|
||||
|
@ -3428,7 +3428,7 @@
|
||||
</spoil>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="20792" level="79" type="Monster" name="Coral">
|
||||
<npc id="20792" level="76" type="Monster" name="Coral" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="70" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -3445,7 +3445,7 @@
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="192" /> <!-- Monster Only (Parhit Staff) -->
|
||||
<acquire exp="40965" sp="1106" />
|
||||
<acquire exp="80991" sp="2429" attribute_exp="684"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<attack physical="182.671236" magical="113.4007" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
|
||||
@ -3560,7 +3560,7 @@
|
||||
</spoil>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="20794" level="78" type="Monster" name="Stakato">
|
||||
<npc id="20794" level="76" type="Monster" name="Stakato" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -3575,7 +3575,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="223" /> <!-- Kukuri -->
|
||||
<acquire exp="22942" sp="688" />
|
||||
<acquire exp="46335" sp="1390" attribute_exp="684" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
|
||||
<attack physical="469.5384" magical="416.6452173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3609,7 +3609,7 @@
|
||||
<height normal="36" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20795" level="80" type="Monster" name="Stakato Worker">
|
||||
<npc id="20795" level="77" type="Monster" name="Stakato Worker" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="70" />
|
||||
<param name="MoveAroundSocial1" value="70" />
|
||||
@ -3624,7 +3624,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="226" /> <!-- Cursed Dagger -->
|
||||
<acquire exp="25632" sp="692" />
|
||||
<acquire exp="50337" sp="1510" attribute_exp="770"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3657,7 +3657,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20796" level="80" type="Monster" name="Stakato Warrior">
|
||||
<npc id="20796" level="77" type="Monster" name="Stakato Warrior" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -3672,7 +3672,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="232" /> <!-- Dark Elven Dagger -->
|
||||
<acquire exp="26400" sp="712" />
|
||||
<acquire exp="88472" sp="2654" attribute_exp="770" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3705,7 +3705,7 @@
|
||||
<height normal="38" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20797" level="81" type="Monster" name="Stakato Drone">
|
||||
<npc id="20797" level="78" type="Monster" name="Stakato Drone" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="62" />
|
||||
<param name="MoveAroundSocial1" value="62" />
|
||||
@ -3726,7 +3726,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="74" /> <!-- Katana -->
|
||||
<acquire exp="29032" sp="783" />
|
||||
<acquire exp="91880" sp="2756" attribute_exp="858"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="488.6718" magical="433.67086956522" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3764,7 +3764,7 @@
|
||||
<height normal="39" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20798" level="81" type="Monster" name="Water Giant">
|
||||
<npc id="20798" level="78" type="Monster" name="Water Giant" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3779,7 +3779,7 @@
|
||||
<race>GIANT</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="5132" /> <!-- Monster Only (Giant Trident) -->
|
||||
<acquire exp="48971" sp="1322" />
|
||||
<acquire exp="93340" sp="2800" attribute_exp="858"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="488.7117" magical="433.70804347826" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3813,7 +3813,7 @@
|
||||
<height normal="44" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20799" level="82" type="Monster" name="Queen Lad">
|
||||
<npc id="20799" level="79" type="Monster" name="Queen Lad" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3829,7 +3829,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="46819" sp="1264" />
|
||||
<acquire exp="96610" sp="2898" attribute_exp="948"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/npcs.xsd">
|
||||
<npc id="20800" level="82" type="Monster" name="Eva's Watchman">
|
||||
<npc id="20800" level="79" type="Monster" name="Eva's Watchman" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="40" />
|
||||
<param name="MoveAroundSocial1" value="40" />
|
||||
@ -14,7 +14,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="303682" sp="9110" />
|
||||
<acquire exp="131997" sp="3959" attribute_exp="948" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="808.61705" magical="731.48967391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -45,7 +45,7 @@
|
||||
<height normal="30" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20801" level="82" type="Monster" name="Piker">
|
||||
<npc id="20801" level="80" type="Monster" name="Piker" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -62,7 +62,7 @@
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="302" /> <!-- Body Slasher -->
|
||||
<acquire exp="384780" sp="10389" />
|
||||
<acquire exp="136896" sp="4106" attribute_exp="1040"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2827.269335" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<attack physical="939.4691" magical="853.40152173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -96,7 +96,7 @@
|
||||
<height normal="34.8" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20802" level="82" type="Monster" name="Mage">
|
||||
<npc id="20802" level="80" type="Monster" name="Mage" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -115,7 +115,7 @@
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="192" /> <!-- Crystal Staff -->
|
||||
<acquire exp="370425" sp="10001" />
|
||||
<acquire exp="168844" sp="5065" attribute_exp="1040" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="4120.56" mpRegen="3" />
|
||||
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -152,7 +152,7 @@
|
||||
<height normal="32.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20803" level="83" type="Monster" name="Doll Master">
|
||||
<npc id="20803" level="82" type="Monster" name="Doll Master" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -168,7 +168,7 @@
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="391426" sp="10568" />
|
||||
<acquire exp="190141" sp="5704" attribute_exp="1230" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3386,7 +3386,7 @@
|
||||
</spoil>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="20849" level="83" type="Monster" name="Light Worm">
|
||||
<npc id="20849" level="83" type="Monster" name="Light Worm" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3400,7 +3400,7 @@
|
||||
</parameters>
|
||||
<race>ANIMAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="303419" sp="8192" />
|
||||
<acquire exp="141914" sp="4257" attribute_exp="1134" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
|
@ -5126,7 +5126,7 @@
|
||||
<height normal="28" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20994" level="83" type="Monster" name="Garden Guard Captain">
|
||||
<npc id="20994" level="82" type="Monster" name="Garden Guard Captain" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -5145,7 +5145,7 @@
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="364541" sp="9842" />
|
||||
<acquire exp="187075" sp="5612" attribute_exp="1230" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -5180,7 +5180,7 @@
|
||||
<height normal="34.05" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="20995" level="82" type="Monster" name="Garden Guard">
|
||||
<npc id="20995" level="81" type="Monster" name="Garden Guard" element="WATER">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -5194,8 +5194,10 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="100658" sp="3019" attribute_exp="1134"/>
|
||||
<equipment rhand="94" /> <!-- Bec de Corbin -->
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
<defence physical="2103.00075" magical="3505.00125" />
|
||||
<speed>
|
||||
|
@ -3637,7 +3637,7 @@
|
||||
</spoil>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21661" level="82" type="Monster" name="Scarlet Worker">
|
||||
<npc id="21661" level="79" type="Monster" name="Scarlet Worker" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4560" level="9" />
|
||||
@ -3645,7 +3645,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="235" /> <!-- Bloody Orchid -->
|
||||
<acquire exp="285232" sp="8556" />
|
||||
<acquire exp="124807" sp="3744" attribute_exp="948"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="808.61705" magical="731.48967391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3679,7 +3679,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21662" level="82" type="Monster" name="Scarlet Soldier">
|
||||
<npc id="21662" level="79" type="Monster" name="Scarlet Soldier" element="FIRE">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -3694,7 +3694,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="148" /> <!-- Sword of Valhalla -->
|
||||
<acquire exp="352209" sp="10566" />
|
||||
<acquire exp="127803" sp="3834" attribute_exp="948" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3733,7 +3733,7 @@
|
||||
<height normal="38" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21663" level="82" type="Monster" name="Scarlet Noble">
|
||||
<npc id="21663" level="79" type="Monster" name="Scarlet Noble" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Skill01_AttackSplash" value="1" />
|
||||
@ -3742,7 +3742,7 @@
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="235" /> <!-- Bloody Orchid -->
|
||||
<acquire exp="351362" sp="9486" />
|
||||
<acquire exp="163526" sp="4905" attribute_exp="948"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="1004.88515" magical="914.34815217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3776,14 +3776,14 @@
|
||||
<height normal="39" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21664" level="82" type="Monster" name="Tepra Scorpion">
|
||||
<npc id="21664" level="80" type="Monster" name="Tepra Scorpion" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4560" level="9" />
|
||||
</parameters>
|
||||
<race>BUG</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="366236" sp="9888" />
|
||||
<acquire exp="168076" sp="5042" attribute_exp="1040" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<attack physical="965.63552" magical="877.78017391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3817,14 +3817,14 @@
|
||||
<height normal="52.8" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21665" level="82" type="Monster" name="Tepra Scarab">
|
||||
<npc id="21665" level="80" type="Monster" name="Tepra Scarab" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4560" level="9" />
|
||||
</parameters>
|
||||
<race>BUG</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="372072" sp="10045" />
|
||||
<acquire exp="172838" sp="5185" attribute_exp="1040" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<attack physical="965.63552" magical="877.78017391304" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3858,7 +3858,7 @@
|
||||
<height normal="22" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21666" level="82" type="Monster" name="Assassin Beetle">
|
||||
<npc id="21666" level="80" type="Monster" name="Assassin Beetle" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Skill01_AttackSplash" value="1" />
|
||||
@ -3866,7 +3866,7 @@
|
||||
</parameters>
|
||||
<race>BUG</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="387793" sp="10470" />
|
||||
<acquire exp="206169" sp="6185" attribute_exp="1040"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2827.269335" hpRegen="8.5" mp="3753.285" mpRegen="3" />
|
||||
<attack physical="939.4691" magical="853.40152173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3900,7 +3900,7 @@
|
||||
<height normal="54.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21667" level="83" type="Monster" name="Mercenary of Destruction">
|
||||
<npc id="21667" level="81" type="Monster" name="Mercenary of Destruction" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<param name="Skill01_AttackSplash" value="1" />
|
||||
@ -3909,7 +3909,7 @@
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="70" /> <!-- Homunkulus' Sword -->
|
||||
<acquire exp="303033" sp="8181" />
|
||||
<acquire exp="178288" sp="5348" attribute_exp="1134" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3943,7 +3943,7 @@
|
||||
<height normal="30.6" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21668" level="83" type="Monster" name="Knight of Destruction">
|
||||
<npc id="21668" level="81" type="Monster" name="Knight of Destruction" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4560" level="9" />
|
||||
@ -3951,7 +3951,7 @@
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="946" lhand="945" /> <!-- Skeleton Dagger / Skeleton Buckler -->
|
||||
<acquire exp="375994" sp="10151" />
|
||||
<acquire exp="181044" sp="5431" attribute_exp="1134"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<attack physical="1016.2039" magical="924.62673913043" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -3985,10 +3985,10 @@
|
||||
<height normal="34.8" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21669" level="83" type="Monster" name="Evil Spirit Wizard of Destruction">
|
||||
<npc id="21669" level="81" type="Monster" name="Evil Spirit Wizard of Destruction" element="FIRE">
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="313883" sp="8474" />
|
||||
<acquire exp="172383" sp="5171" attribute_exp="1134" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<attack physical="817.72135" magical="739.70510869565" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4013,7 +4013,7 @@
|
||||
<skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21670" level="83" type="Monster" name="Lavastone Golem">
|
||||
<npc id="21670" level="82" type="Monster" name="Lavastone Golem" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4591" level="9" />
|
||||
@ -4021,7 +4021,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="384867" sp="10391" />
|
||||
<acquire exp="222900" sp="6687" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<attack physical="976.51936" magical="887.65356521739" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4055,7 +4055,7 @@
|
||||
<height normal="31" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21671" level="83" type="Monster" name="Magma Golem">
|
||||
<npc id="21671" level="82" type="Monster" name="Magma Golem" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4157" level="9" />
|
||||
@ -4063,7 +4063,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="400636" sp="10817" />
|
||||
<acquire exp="227862" sp="6835" attribute_exp="1230" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2859.043325" hpRegen="8.5" mp="3166.53" mpRegen="3" />
|
||||
<attack physical="950.0497" magical="862.99239130435" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4097,7 +4097,7 @@
|
||||
<height normal="45" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21672" level="83" type="Monster" name="Arimanes of Destruction">
|
||||
<npc id="21672" level="82" type="Monster" name="Arimanes of Destruction" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4589" level="9" />
|
||||
@ -4105,7 +4105,7 @@
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="6722" /> <!-- Monster Only (Ahrimanes) -->
|
||||
<acquire exp="399045" sp="10774" />
|
||||
<acquire exp="222497" sp="6674" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2859.043325" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<attack physical="950.0497" magical="862.99239130435" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4142,14 +4142,14 @@
|
||||
<height normal="57.75" grown="69" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21673" level="78" type="Monster" name="Ivlis of Immortality">
|
||||
<npc id="21673" level="76" type="Monster" name="Ivlis of Immortality" element="FIRE">
|
||||
<parameters>
|
||||
<param name="IsAggressive" value="1" />
|
||||
<skill name="Skill01_ID" id="4599" level="9" />
|
||||
</parameters>
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="21409" sp="642" />
|
||||
<acquire exp="40651" sp="1219" attribute_exp="684" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
|
||||
<attack physical="469.5384" magical="416.6452173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4186,10 +4186,10 @@
|
||||
<height normal="55" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21674" level="79" type="Monster" name="Balor of Immortality">
|
||||
<npc id="21674" level="76" type="Monster" name="Balor of Immortality" element="FIRE">
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="23085" sp="623" />
|
||||
<acquire exp="79188" sp="2375" attribute_exp="684"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<attack physical="476.129" magical="422.51869565217" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4213,10 +4213,10 @@
|
||||
<skill id="4413" level="7" /> <!-- Weak M. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21675" level="80" type="Monster" name="Ashuras of Immortality">
|
||||
<npc id="21675" level="76" type="Monster" name="Ashuras of Immortality" element="FIRE">
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="43737" sp="1180" />
|
||||
<acquire exp="82030" sp="2460" attribute_exp="684"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="482.5999" magical="428.28065217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4241,10 +4241,10 @@
|
||||
<skill id="4413" level="8" /> <!-- Weak M. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21676" level="80" type="Monster" name="Lavasillisk">
|
||||
<npc id="21676" level="77" type="Monster" name="Lavasillisk" element="FIRE">
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="25440" sp="686" />
|
||||
<acquire exp="52115" sp="1563" attribute_exp="770"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="482.6398" magical="428.31782608696" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4287,10 +4287,10 @@
|
||||
<height normal="55" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21678" level="81" type="Monster" name="Magma Drake">
|
||||
<npc id="21678" level="77" type="Monster" name="Magma Drake" element="FIRE">
|
||||
<race>DRAGON</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="27733" sp="748" />
|
||||
<acquire exp="50479" sp="1514" attribute_exp="770"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="488.6718" magical="433.67086956522" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4451,10 +4451,10 @@
|
||||
<skill id="4412" level="17" /> <!-- Very Strong P. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21685" level="81" type="Monster" name="Ashuras of Immortality">
|
||||
<npc id="21685" level="78" type="Monster" name="Ashuras of Immortality" element="FIRE">
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="48262" sp="1303" />
|
||||
<acquire exp="94946" sp="2848" attribute_exp="858"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="482.5999" magical="428.28065217391" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -4479,10 +4479,10 @@
|
||||
<skill id="4413" level="9" /> <!-- Slightly Weak M. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21686" level="82" type="Monster" name="Flaming Drake">
|
||||
<npc id="21686" level="78" type="Monster" name="Flaming Drake" element="FIRE">
|
||||
<race>DRAGON</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="51842" sp="1399" />
|
||||
<acquire exp="95603" sp="2868" attribute_exp="858"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
|
@ -2505,10 +2505,10 @@
|
||||
<height normal="36" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21761" level="82" type="Monster" name="Salamander" title="Elite">
|
||||
<npc id="21761" level="76" type="Monster" name="Salamander" title="Elite" element="FIRE">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="133236" sp="3597" />
|
||||
<acquire exp="240547" sp="7216" attribute_exp="684" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="494.5442" magical="438.8752173913" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -2537,10 +2537,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21762" level="83" type="Monster" name="Lava" title="Elite">
|
||||
<npc id="21762" level="79" type="Monster" name="Lava" title="Elite" element="FIRE">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="687418" sp="18560" />
|
||||
<acquire exp="374272" sp="11228" attribute_exp="948" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.6202933333" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<attack physical="817.728" magical="739.71130434783" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -2570,10 +2570,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21763" level="83" type="Monster" name="Firen" title="Master">
|
||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
||||
<npc id="21763" level="82" type="Monster" name="Firen" title="Master" element="FIRE">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2603,10 +2603,9 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21764" level="82" type="Monster" name="Growler" title="Elite">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21764" level="76" type="Monster" name="Growler" title="Elite" element="EARTH">
|
||||
<race>ELEMENTAL</race>
|
||||
<acquire exp="141405" sp="3817" />
|
||||
<acquire exp="240547" sp="7216" attribute_exp="684"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2635,10 +2634,9 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21765" level="83" type="Monster" name="Tree Soldier" title="Elite">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21765" level="77" type="Monster" name="Tree Soldier" title="Elite" element="EARTH">
|
||||
<race>ETC</race> <!-- TODO: Magic Creatures -->
|
||||
<acquire exp="880166" sp="23764" />
|
||||
<acquire exp="356985" sp="10709" attribute_exp="770"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2667,10 +2665,9 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21766" level="83" type="Monster" name="Tortay" title="Master">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21766" level="82" type="Monster" name="Tortay" title="Master" element="EARTH">
|
||||
<race>ELEMENTAL</race>
|
||||
<acquire exp="2525776" sp="68195" />
|
||||
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2700,10 +2697,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21767" level="82" type="Monster" name="Undine" title="Elite">
|
||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
||||
<npc id="21767" level="76" type="Monster" name="Undine" title="Elite" element="WATER">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="240547" sp="7216" attribute_exp="684"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2732,10 +2729,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21768" level="83" type="Monster" name="Snow Golem" title="Elite">
|
||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
||||
<npc id="21768" level="77" type="Monster" name="Snow Golem" title="Elite" element="WATER">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="355562" sp="10666" attribute_exp="770"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2764,10 +2761,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21769" level="83" type="Monster" name="Ishtir" title="Master">
|
||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
||||
<npc id="21769" level="82" type="Monster" name="Ishtir" title="Master" element="WATER">
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>FEMALE</sex>
|
||||
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2797,7 +2794,7 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21770" level="82" type="Monster" name="Sylph" title="Elite">
|
||||
<npc id="21770" level="76" type="Monster" name="Sylph" title="Elite" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -2812,7 +2809,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="141405" sp="3817" />
|
||||
<acquire exp="240547" sp="7216" attribute_exp="684"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2849,7 +2846,7 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21771" level="83" type="Monster" name="Kimerian" title="Elite">
|
||||
<npc id="21771" level="77" type="Monster" name="Kimerian" title="Elite" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -2864,7 +2861,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="880166" sp="23764" />
|
||||
<acquire exp="359475" sp="10784" attribute_exp="770" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2901,7 +2898,7 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21772" level="83" type="Monster" name="Radin" title="Master">
|
||||
<npc id="21772" level="82" type="Monster" name="Radin" title="Master" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -2916,7 +2913,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="2525776" sp="68195" />
|
||||
<acquire exp="1207859" sp="36235" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<speed>
|
||||
@ -2954,10 +2951,10 @@
|
||||
</drop>
|
||||
</dropLists>
|
||||
</npc>
|
||||
<npc id="21773" level="82" type="Monster" name="Captain's Henchman">
|
||||
<npc id="21773" level="82" type="Monster" name="Captain's Henchman" element="WATER">
|
||||
<race>ETC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="165067" sp="4456" />
|
||||
<acquire exp="101142" sp="3034" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2423.44409" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="1055.28566" magical="720.6233026" random="30" critical="4.75" accuracy="4.75" attackSpeed="250" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -2980,10 +2977,10 @@
|
||||
<skill id="4413" level="10" /> <!-- Slightly Weak M. Def. -->
|
||||
</skillList>
|
||||
</npc>
|
||||
<npc id="21774" level="82" type="Monster" name="Buffalo" title="Guardian of Gorge">
|
||||
<npc id="21774" level="78" type="Monster" name="Buffalo" title="Guardian of Gorge" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<race>BEAST</race>
|
||||
<acquire exp="65216" sp="1760" />
|
||||
<acquire exp="96918" sp="2907" attribute_exp="858"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3005,10 +3002,10 @@
|
||||
<height normal="37.8" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21775" level="82" type="Monster" name="Arahan" title="Hero of the Past">
|
||||
<npc id="21775" level="78" type="Monster" name="Arahan" title="Hero of the Past" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<race>DIVINE</race>
|
||||
<acquire exp="591127" sp="15960" />
|
||||
<acquire exp="322658" sp="9679" attribute_exp="858" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3022,7 +3019,7 @@
|
||||
<skillList>
|
||||
<skill id="4416" level="8" /> <!-- Angel -->
|
||||
<skill id="4408" level="12" /> <!-- HP Increase (4x) -->
|
||||
<skill id="4410" level="16" /> <!-- Very Strong P. Atk. -->
|
||||
<skill id="4410" level="13" /> <!-- Very Strong P. Atk. -->
|
||||
<skill id="4411" level="14" /> <!-- Strong M. Atk. -->
|
||||
<skill id="4412" level="15" /> <!-- Strong P. Def. -->
|
||||
<skill id="4413" level="12" /> <!-- Slightly Strong M. Def. -->
|
||||
@ -3032,7 +3029,7 @@
|
||||
<height normal="44" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21776" level="82" type="Monster" name="Fuish" title="Guardian of Wind">
|
||||
<npc id="21776" level="80" type="Monster" name="Fuish" title="Guardian of Wind" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3047,7 +3044,7 @@
|
||||
</parameters>
|
||||
<race>DEMONIC</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="110421" sp="2981" />
|
||||
<acquire exp="182745" sp="5482" attribute_exp="1040"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3078,7 +3075,7 @@
|
||||
<height normal="31.44" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21777" level="78" type="Monster" name="White Tiger">
|
||||
<npc id="21777" level="76" type="Monster" name="White Tiger" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3093,7 +3090,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="22942" sp="688" />
|
||||
<acquire exp="45295" sp="1358" attribute_exp="684"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3124,7 +3121,7 @@
|
||||
<height normal="28" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21778" level="79" type="Monster" name="Black Tiger">
|
||||
<npc id="21778" level="76" type="Monster" name="Black Tiger" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3139,7 +3136,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="42650" sp="1151" />
|
||||
<acquire exp="82723" sp="2481" attribute_exp="684" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3170,7 +3167,7 @@
|
||||
<height normal="28" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21779" level="79" type="Monster" name="Scorn Warrior">
|
||||
<npc id="21779" level="77" type="Monster" name="Scorn Warrior" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3185,7 +3182,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="25744" sp="695" />
|
||||
<acquire exp="50337" sp="1510" attribute_exp="770"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3215,7 +3212,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21780" level="80" type="Monster" name="Porcupine">
|
||||
<npc id="21780" level="77" type="Monster" name="Porcupine" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3230,7 +3227,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="45081" sp="1217" />
|
||||
<acquire exp="86338" sp="2590" attribute_exp="770"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3261,7 +3258,7 @@
|
||||
<height normal="21.3" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21781" level="80" type="Monster" name="Scorn Soldier">
|
||||
<npc id="21781" level="78" type="Monster" name="Scorn Soldier" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3276,7 +3273,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="28320" sp="764" />
|
||||
<acquire exp="54208" sp="1626" attribute_exp="858"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3307,7 +3304,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21782" level="81" type="Monster" name="Scorn Seeker">
|
||||
<npc id="21782" level="78" type="Monster" name="Scorn Seeker" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3322,7 +3319,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="30607" sp="826" />
|
||||
<acquire exp="97356" sp="2920" attribute_exp="858" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3353,7 +3350,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21783" level="81" type="Monster" name="Nero Commander">
|
||||
<npc id="21783" level="81" type="Monster" name="Nero Commander" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3368,7 +3365,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="52317" sp="1412" />
|
||||
<acquire exp="93128" sp="2793" attribute_exp="948" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3399,7 +3396,7 @@
|
||||
<height normal="28" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21784" level="82" type="Monster" name="Storm Tapo">
|
||||
<npc id="21784" level="79" type="Monster" name="Storm Tapo" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3414,7 +3411,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="52205" sp="1409" />
|
||||
<acquire exp="98745" sp="2962" attribute_exp="948"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3445,7 +3442,7 @@
|
||||
<height normal="28" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21785" level="82" type="Monster" name="Breeze Warrior">
|
||||
<npc id="21785" level="80" type="Monster" name="Breeze Warrior" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3460,7 +3457,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="356540" sp="10696" />
|
||||
<acquire exp="169228" sp="5076" attribute_exp="1040" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3491,7 +3488,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21786" level="82" type="Monster" name="Sharp Kau">
|
||||
<npc id="21786" level="80" type="Monster" name="Sharp Kau" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3506,7 +3503,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="297563" sp="8034" />
|
||||
<acquire exp="172684" sp="5180" attribute_exp="1040"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3537,7 +3534,7 @@
|
||||
<height normal="21.3" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21787" level="82" type="Monster" name="Breeze Piker">
|
||||
<npc id="21787" level="80" type="Monster" name="Breeze Piker" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3552,7 +3549,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="357952" sp="9664" />
|
||||
<acquire exp="170380" sp="5111" attribute_exp="1040" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3583,7 +3580,7 @@
|
||||
<height normal="40" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21788" level="82" type="Monster" name="Breeze Mage">
|
||||
<npc id="21788" level="81" type="Monster" name="Breeze Mage" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3598,7 +3595,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="299823" sp="8095" />
|
||||
<acquire exp="143410" sp="4302" attribute_exp="1134"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="3753.285" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3630,7 +3627,7 @@
|
||||
<height normal="48.6" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21789" level="83" type="Monster" name="Folding">
|
||||
<npc id="21789" level="81" type="Monster" name="Folding" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3645,7 +3642,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="311134" sp="8400" />
|
||||
<acquire exp="137190" sp="4115" attribute_exp="1134"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="3166.53" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3676,7 +3673,7 @@
|
||||
<height normal="27.6" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21790" level="83" type="Monster" name="Wingrow">
|
||||
<npc id="21790" level="81" type="Monster" name="Wingrow" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3691,7 +3688,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="405458" sp="10947" />
|
||||
<acquire exp="182264" sp="5467" attribute_exp="1134"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3722,7 +3719,7 @@
|
||||
<height normal="43" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21791" level="83" type="Monster" name="Storm Lucifer">
|
||||
<npc id="21791" level="82" type="Monster" name="Storm Lucifer" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3737,7 +3734,7 @@
|
||||
</parameters>
|
||||
<race>ELEMENTAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="402228" sp="10860" />
|
||||
<acquire exp="184089" sp="5522" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2859.043325" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3769,7 +3766,7 @@
|
||||
<height normal="50" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21792" level="83" type="Monster" name="Blow Breaker">
|
||||
<npc id="21792" level="82" type="Monster" name="Blow Breaker" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3784,7 +3781,7 @@
|
||||
</parameters>
|
||||
<race>HUMANOID</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="398997" sp="10772" />
|
||||
<acquire exp="186389" sp="5591" attribute_exp="1230"/>
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<speed>
|
||||
@ -3815,7 +3812,7 @@
|
||||
<height normal="27.6" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21793" level="83" type="Monster" name="Brolly Seeker">
|
||||
<npc id="21793" level="82" type="Monster" name="Brolly Seeker" element="WIND">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
<param name="MoveAroundSocial1" value="0" />
|
||||
@ -3830,7 +3827,7 @@
|
||||
</parameters>
|
||||
<race>UNDEAD</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="407195" sp="10994" />
|
||||
<acquire exp="193247" sp="5797" attribute_exp="1230" />
|
||||
<stats str="40" int="21" dex="30" wit="20" con="43" men="10">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<speed>
|
||||
|
@ -820,7 +820,7 @@
|
||||
<height normal="39" grown="47.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21813" level="78" type="Monster" name="Canyon Antelope">
|
||||
<npc id="21813" level="76" type="Monster" name="Canyon Antelope" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
@ -835,7 +835,7 @@
|
||||
</parameters>
|
||||
<race>ANIMAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="22942" sp="688" />
|
||||
<acquire exp="81060" sp="2431" attribute_exp="684" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1380.32124" hpRegen="8.5" mp="2629.335" mpRegen="3" />
|
||||
<attack physical="646.17968" magical="441.25696" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -868,7 +868,7 @@
|
||||
<height normal="34" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21814" level="78" type="Monster" name="Canyon Antelope Warrior">
|
||||
<npc id="21814" level="76" type="Monster" name="Canyon Antelope Warrior" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
@ -886,7 +886,7 @@
|
||||
</parameters>
|
||||
<race>ANIMAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="41578" sp="1247" />
|
||||
<acquire exp="82723" sp="2481" attribute_exp="684"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1380.444395" hpRegen="8.5" mp="2629.335" mpRegen="3" />
|
||||
<attack physical="667.50361" magical="455.81844" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -921,7 +921,7 @@
|
||||
<height normal="34" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21815" level="79" type="Monster" name="Canyon Bandersnatch">
|
||||
<npc id="21815" level="77" type="Monster" name="Canyon Bandersnatch" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="78" />
|
||||
@ -937,7 +937,7 @@
|
||||
</parameters>
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="25744" sp="695" />
|
||||
<acquire exp="50337" sp="1510" attribute_exp="770"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1399.77973" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<attack physical="688.86373" magical="470.40463" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -970,7 +970,7 @@
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21816" level="79" type="Monster" name="Canyon Bandersnatch Warrior">
|
||||
<npc id="21816" level="77" type="Monster" name="Canyon Bandersnatch Warrior" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="78" />
|
||||
@ -988,7 +988,7 @@
|
||||
</parameters>
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="45084" sp="1217" />
|
||||
<acquire exp="88472" sp="2654" attribute_exp="770" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1399.902885" hpRegen="8.5" mp="2683.32" mpRegen="3" />
|
||||
<attack physical="710.2185" magical="484.98717" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1023,7 +1023,7 @@
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21817" level="80" type="Monster" name="Eye of Restrainer">
|
||||
<npc id="21817" level="77" type="Monster" name="Eye of Restrainer" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="0" />
|
||||
@ -1038,7 +1038,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="42009" sp="1134" />
|
||||
<acquire exp="85626" sp="2568" attribute_exp="770"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1418.868755" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="710.2185" magical="484.98717" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1071,8 +1071,7 @@
|
||||
<height normal="43" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21818" level="80" type="Monster" name="Valley Buffalo">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21818" level="78" type="Monster" name="Valley Buffalo" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="120" />
|
||||
<param name="MoveAroundSocial1" value="30" />
|
||||
@ -1089,7 +1088,7 @@
|
||||
</parameters>
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="27744" sp="749" />
|
||||
<acquire exp="59684" sp="1790" attribute_exp="858"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1418.99191" hpRegen="8.5" mp="2739.075" mpRegen="3" />
|
||||
<attack physical="731.52506" magical="499.53679" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
|
||||
@ -1124,8 +1123,7 @@
|
||||
<height normal="31" grown="38" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21819" level="81" type="Monster" name="Eye of Guide">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21819" level="78" type="Monster" name="Eye of Guide" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -1145,7 +1143,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="28028" sp="756" />
|
||||
<acquire exp="56362" sp="1690" attribute_exp="858" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1436.72623" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="752.73928" magical="514.02335" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1184,8 +1182,7 @@
|
||||
<height normal="43.2" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21820" level="81" type="Monster" name="Gaze of Nightmares">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21820" level="79" type="Monster" name="Gaze of Nightmares" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="40" />
|
||||
<param name="MoveAroundSocial1" value="40" />
|
||||
@ -1206,7 +1203,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="47455" sp="1281" />
|
||||
<acquire exp="99980" sp="2999" attribute_exp="948"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1436.849385" hpRegen="8.5" mp="2794.83" mpRegen="3" />
|
||||
<attack physical="731.52506" magical="499.53679" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1246,8 +1243,7 @@
|
||||
<height normal="30" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21821" level="82" type="Monster" name="Eye of the Watchman">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21821" level="79" type="Monster" name="Eye of the Watchman" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -1266,7 +1262,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="30721" sp="829" />
|
||||
<acquire exp="96872" sp="2906" attribute_exp="948"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="1453.96793" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1305,7 +1301,7 @@
|
||||
<height normal="49.8" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21822" level="82" type="Monster" name="Homunculus">
|
||||
<npc id="21822" level="79" type="Monster" name="Homunculus" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
@ -1322,7 +1318,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="287208" sp="8616" />
|
||||
<acquire exp="162777" sp="4883" attribute_exp="948" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2423.3825125" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="752.73928" magical="514.02335" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1356,7 +1352,7 @@
|
||||
<height normal="26" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21823" level="82" type="Monster" name="Canyon Grendel Warrior">
|
||||
<npc id="21823" level="80" type="Monster" name="Canyon Grendel Warrior" element="EARTH">
|
||||
<!-- Classic Seven Sings -->
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="115" />
|
||||
@ -1377,7 +1373,7 @@
|
||||
</parameters>
|
||||
<race>ANIMAL</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="357104" sp="10713" />
|
||||
<acquire exp="132364" sp="3970" attribute_exp="1040" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="2850.585" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1415,8 +1411,7 @@
|
||||
<height normal="39" grown="47.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21824" level="82" type="Monster" name="Eye of Pilgrim">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21824" level="80" type="Monster" name="Eye of Pilgrim" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -1435,7 +1430,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="358799" sp="9687" />
|
||||
<acquire exp="133555" sp="4006" attribute_exp="1040"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="3029.1819575" hpRegen="8.5" mp="3104.58" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1474,8 +1469,7 @@
|
||||
<height normal="63" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21825" level="82" type="Monster" name="Elder Homunculus">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21825" level="80" type="Monster" name="Elder Homunculus" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="80" />
|
||||
<param name="MoveAroundSocial1" value="80" />
|
||||
@ -1492,7 +1486,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="377438" sp="10190" />
|
||||
<acquire exp="137011" sp="4110" attribute_exp="1040"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<attack physical="794.70901" magical="542.68324" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1529,8 +1523,7 @@
|
||||
<height normal="32.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21826" level="82" type="Monster" name="Eye of Ruler">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21826" level="80" type="Monster" name="Eye of Ruler" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="90" />
|
||||
<param name="MoveAroundSocial1" value="90" />
|
||||
@ -1549,7 +1542,7 @@
|
||||
</parameters>
|
||||
<race>CONSTRUCT</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="378473" sp="10218" />
|
||||
<acquire exp="133555" sp="4006" attribute_exp="1040"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2908.034384" hpRegen="8.5" mp="3415.215" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1588,8 +1581,7 @@
|
||||
<height normal="56.4" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21827" level="83" type="Monster" name="Sly Hound Dog">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21827" level="81" type="Monster" name="Sly Hound Dog" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="78" />
|
||||
<param name="MoveAroundSocial1" value="78" />
|
||||
@ -1605,7 +1597,7 @@
|
||||
</parameters>
|
||||
<race>BEAST</race>
|
||||
<sex>MALE</sex>
|
||||
<acquire exp="302551" sp="8168" />
|
||||
<acquire exp="175139" sp="5254" attribute_exp="1134" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2450.5997675" hpRegen="8.5" mp="2907.225" mpRegen="3" />
|
||||
<attack physical="731.52506" magical="499.53679" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1640,8 +1632,7 @@
|
||||
<height normal="25" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21828" level="83" type="Monster" name="Disciple of Protection">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21828" level="81" type="Monster" name="Disciple of Protection" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="130" />
|
||||
<param name="MoveAroundSocial1" value="130" />
|
||||
@ -1657,7 +1648,7 @@
|
||||
<race>DIVINE</race>
|
||||
<sex>FEMALE</sex>
|
||||
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
|
||||
<acquire exp="371075" sp="10019" />
|
||||
<acquire exp="178209" sp="5346" attribute_exp="1134"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="3063.234315" hpRegen="8.5" mp="3166.53" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1692,8 +1683,7 @@
|
||||
<height normal="30" grown="36.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21829" level="83" type="Monster" name="Disciple of Punishment">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21829" level="81" type="Monster" name="Disciple of Punishment" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="130" />
|
||||
<param name="MoveAroundSocial1" value="130" />
|
||||
@ -1711,7 +1701,7 @@
|
||||
<race>DIVINE</race>
|
||||
<sex>FEMALE</sex>
|
||||
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
|
||||
<acquire exp="394512" sp="10651" />
|
||||
<acquire exp="184114" sp="5523" attribute_exp="1134"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="3483.36" mpRegen="3" />
|
||||
<attack physical="856.44055895414" magical="584.837886935576" random="10" critical="4" accuracy="5" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1748,8 +1738,7 @@
|
||||
<height normal="30" grown="36.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21830" level="83" type="Monster" name="Disciple of Conquest">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21830" level="82" type="Monster" name="Disciple of Conquest" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="130" />
|
||||
<param name="MoveAroundSocial1" value="130" />
|
||||
@ -1765,7 +1754,7 @@
|
||||
<race>DIVINE</race>
|
||||
<sex>FEMALE</sex>
|
||||
<equipment rhand="6717" /> <!-- Monster Only (Einhasad Warrior) -->
|
||||
<acquire exp="404301" sp="10916" />
|
||||
<acquire exp="190827" sp="5724" attribute_exp="1230"/>
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2940.744352" hpRegen="8.5" mp="3828.51" mpRegen="3" />
|
||||
<attack physical="773.81598" magical="528.41601" random="30" critical="4" accuracy="4.75" attackSpeed="253" type="SWORD" range="40" distance="80" width="120" />
|
||||
@ -1800,8 +1789,7 @@
|
||||
<height normal="30" grown="36.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21831" level="83" type="Monster" name="Disciple of Power">
|
||||
<!-- Classic Seven Sings -->
|
||||
<npc id="21831" level="82" type="Monster" name="Disciple of Power" element="EARTH">
|
||||
<parameters>
|
||||
<param name="MoveAroundSocial" value="85" />
|
||||
<param name="MoveAroundSocial1" value="85" />
|
||||
@ -1816,7 +1804,7 @@
|
||||
<race>DIVINE</race>
|
||||
<sex>MALE</sex>
|
||||
<equipment rhand="6718" /> <!-- Monster Only (Einhasad Shaman) -->
|
||||
<acquire exp="427448" sp="11541" />
|
||||
<acquire exp="232946" sp="6988" attribute_exp="1230" />
|
||||
<stats str="79" int="34" dex="42" wit="66" con="75" men="12">
|
||||
<vitals hp="2859.043325" hpRegen="8.5" mp="3166.53" mpRegen="3" />
|
||||
<attack physical="815.37145" magical="556.793" random="50" critical="1" accuracy="9" attackSpeed="253" type="BLUNT" range="40" distance="80" width="120" />
|
||||
@ -1852,11 +1840,11 @@
|
||||
<height normal="38.5" grown="46.5" />
|
||||
</collision>
|
||||
</npc>
|
||||
<npc id="21832" level="83" type="Npc" name="Disciple of Authority">
|
||||
<!-- AUTO GENERATED NPC TODO: FIX IT -->
|
||||
<npc id="21832" level="82" type="Npc" name="Disciple of Authority">
|
||||
<race>DIVINE</race>
|
||||
<sex>FEMALE</sex>
|
||||
<equipment rhand="6718" />
|
||||
<acquire exp="190827" sp="5724" attribute_exp="1230"/>
|
||||
<stats str="88" int="79" dex="55" wit="78" con="82" men="78">
|
||||
<vitals hp="6297" hpRegen="10.5" mp="2666" mpRegen="3.6" />
|
||||
<speed>
|
||||
|
@ -727,21 +727,69 @@
|
||||
<!-- Fire Attribute Attack +100. -->
|
||||
<icon>icon.agathion_fire_1</icon>
|
||||
<operateType>P</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>100</amount>
|
||||
<type>FIRE</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51094" toLevel="1" name="Water Attribute Attack">
|
||||
<!-- Water Attribute Attack +100. -->
|
||||
<icon>icon.agathion_water_1</icon>
|
||||
<operateType>P</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>100</amount>
|
||||
<type>WATER</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51095" toLevel="1" name="Wind Attribute Attack">
|
||||
<!-- Wind Attribute Attack +100. -->
|
||||
<icon>icon.agathion_wind_1</icon>
|
||||
<operateType>P</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>100</amount>
|
||||
<type>WIND</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51096" toLevel="1" name="Earth Attribute Attack">
|
||||
<!-- Earth Attribute Attack +100. -->
|
||||
<icon>icon.agathion_earth_1</icon>
|
||||
<operateType>P</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>100</amount>
|
||||
<type>EARTH</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51097" toLevel="1" name="Radiant Spirit's Varnish">
|
||||
<icon>icon.ev_charge_scroll</icon>
|
||||
|
@ -8,26 +8,70 @@
|
||||
<skill id="51101" toLevel="1" name="Agathion Summon - Ignis">
|
||||
<!-- Summon Ignis Agathion. -->
|
||||
<icon>icon.etc_summon_aga_agit_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<hitTime>3000</hitTime>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>85</magicLvl>
|
||||
<operateType>A1</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SummonAgathion">
|
||||
<npcId>13568</npcId> <!-- Median Flame Ignis -->
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51102" toLevel="1" name="Agathion Summon - Nebula">
|
||||
<!-- Summon Nebula Agathion. -->
|
||||
<icon>icon.etc_summon_aga_agit_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<hitTime>3000</hitTime>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>85</magicLvl>
|
||||
<operateType>A1</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SummonAgathion">
|
||||
<npcId>13572</npcId> <!-- Median Water Procella-->
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51103" toLevel="1" name="Agathion Summon - Procella">
|
||||
<!-- Summon Procella Agathion. -->
|
||||
<icon>icon.etc_summon_aga_agit_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<hitTime>3000</hitTime>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>85</magicLvl>
|
||||
<operateType>A1</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SummonAgathion">
|
||||
<npcId>13576</npcId> <!-- Median Wind Procella-->
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51104" toLevel="1" name="Agathion Summon - Petram">
|
||||
<!-- Summon Petram Agathion. -->
|
||||
<icon>icon.etc_summon_aga_agit_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<hitTime>3000</hitTime>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>85</magicLvl>
|
||||
<operateType>A1</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SummonAgathion">
|
||||
<npcId>13580</npcId> <!-- Median Earth Petram -->
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51105" toLevel="1" name="Improved Master Fisherman's Blessing">
|
||||
<!-- For 2 hr. Acquired XP/ SP through fishing +200%. Buff remains even after death. -->
|
||||
@ -161,18 +205,54 @@
|
||||
<skill id="51125" toLevel="1" name="Quick MP Recovery Potion">
|
||||
<icon>icon.etc_potion_blue_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<blockedInOlympiad>true</blockedInOlympiad>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>1</magicLvl>
|
||||
<reuseDelay>0</reuseDelay>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="Mp">
|
||||
<amount>100</amount>
|
||||
<mode>DIFF</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51126" toLevel="1" name="Intermediate Spirit's Blessing">
|
||||
<!-- For 20 min. Acquired XP +30%. -->
|
||||
<icon>icon.elemental_bless_scrl_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SpiritExpModify">
|
||||
<amount>30</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51127" toLevel="1" name="Advanced Spirit's Blessing">
|
||||
<!-- For 20 min. Acquired XP +50%. -->
|
||||
<icon>icon.elemental_bless_scrl_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SpiritExpModify">
|
||||
<amount>50</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51128" toLevel="1" name="Spirit's Varnish">
|
||||
<icon>icon.ev_charge_scroll</icon>
|
||||
@ -185,30 +265,74 @@
|
||||
<skill id="51130" toLevel="1" name="Fire Attribute Attack Potion">
|
||||
<!-- Use to get Fire Attack Power +50 for 20 min. -->
|
||||
<icon>icon.etc_fire_potion_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<reuseDelay>60000</reuseDelay>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>50</amount>
|
||||
<type>FIRE</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51131" toLevel="1" name="Water Attribute Attack Potion">
|
||||
<!-- Use to get Water Attack Power +50 for 20 min. -->
|
||||
<icon>icon.etc_water_potion_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<reuseDelay>60000</reuseDelay>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>50</amount>
|
||||
<type>WATER</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51132" toLevel="1" name="Wind Attribute Attack Potion">
|
||||
<!-- Use to get Wind Attack Power +50 for 20 min. -->
|
||||
<icon>icon.etc_wind_potion_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<reuseDelay>60000</reuseDelay>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>50</amount>
|
||||
<type>WIND</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51133" toLevel="1" name="Earth Attribute Attack Potion">
|
||||
<!-- Use to get Earth Attack Power +50 for 20 min. -->
|
||||
<icon>icon.etc_earth_potion_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<reuseDelay>60000</reuseDelay>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="elementalSpiritAttack">
|
||||
<amount>50</amount>
|
||||
<type>EARTH</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51134" toLevel="1" name="Scroll of Escape: Forge of the Gods">
|
||||
<operateType>A1</operateType>
|
||||
@ -356,7 +480,20 @@
|
||||
<skill id="51162" toLevel="1" name="Quality Quick MP Recovery Potion">
|
||||
<!-- Instantly recovers 300 MP. -->
|
||||
<icon>icon.etc_potion_blue_i00</icon>
|
||||
<blockedInOlympiad>true</blockedInOlympiad>
|
||||
<isMagic>2</isMagic> <!-- Static Skill -->
|
||||
<magicLvl>1</magicLvl>
|
||||
<operateType>A1</operateType>
|
||||
<magicCriticalRate>5</magicCriticalRate>
|
||||
<hitCancelTime>0</hitCancelTime>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="Mp">
|
||||
<amount>300</amount>
|
||||
<mode>DIFF</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="51163" toLevel="1" name="Sealed Rune Lvl 14">
|
||||
<operateType>A1</operateType>
|
||||
|
@ -153,33 +153,108 @@
|
||||
<!-- Water Attack Defense +20. -->
|
||||
<icon>icon.elemental_necklace_water_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<magicLvl>1</magicLvl>
|
||||
<effects>
|
||||
<effect name="ElementalSpiritDefense">
|
||||
<amount>
|
||||
<value level="1">20</value>
|
||||
<value level="2">40</value>
|
||||
<value level="3">60</value>
|
||||
<value level="4">80</value>
|
||||
<value level="5">100</value>
|
||||
</amount>
|
||||
<type>WATER</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54024" toLevel="5" name="Fire Attack Defense">
|
||||
<!-- Fire Attack Defense +20. -->
|
||||
<icon>icon.elemental_necklace_fire_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<magicLvl>1</magicLvl>
|
||||
<effects>
|
||||
<effect name="ElementalSpiritDefense">
|
||||
<amount>
|
||||
<value level="1">20</value>
|
||||
<value level="2">40</value>
|
||||
<value level="3">60</value>
|
||||
<value level="4">80</value>
|
||||
<value level="5">100</value>
|
||||
</amount>
|
||||
<type>FIRE</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54025" toLevel="5" name="Wind Attack Defense">
|
||||
<!-- Wind Attack Defense +20. -->
|
||||
<icon>icon.elemental_necklace_wind_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<magicLvl>1</magicLvl>
|
||||
<effects>
|
||||
<effect name="ElementalSpiritDefense">
|
||||
<amount>
|
||||
<value level="1">20</value>
|
||||
<value level="2">40</value>
|
||||
<value level="3">60</value>
|
||||
<value level="4">80</value>
|
||||
<value level="5">100</value>
|
||||
</amount>
|
||||
<type>WIND</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54026" toLevel="5" name="Earth Attack Defense">
|
||||
<!-- Earth Attack Defense +20. -->
|
||||
<icon>icon.elemental_necklace_earth_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<magicLvl>1</magicLvl>
|
||||
<effects>
|
||||
<effect name="ElementalSpiritDefense">
|
||||
<amount>
|
||||
<value level="1">20</value>
|
||||
<value level="2">40</value>
|
||||
<value level="3">60</value>
|
||||
<value level="4">80</value>
|
||||
<value level="5">100</value>
|
||||
</amount>
|
||||
<type>EARTH</type>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54027" toLevel="5" name="Attribute XP Increase">
|
||||
<!-- Acquired attribute XP +3%. -->
|
||||
<icon>icon.skill_transform_s_attack</icon>
|
||||
<operateType>P</operateType>
|
||||
<magicLvl>1</magicLvl>
|
||||
<effects>
|
||||
<effect name="SpiritExpModify">
|
||||
<amount>
|
||||
<value level="1">3</value>
|
||||
<value level="2">6</value>
|
||||
<value level="3">10</value>
|
||||
<value level="4">15</value>
|
||||
<value level="5">30</value>
|
||||
</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54028" toLevel="1" name="Spirit's Blessing">
|
||||
<!-- For 20 min. Acquired XP +50%. -->
|
||||
<icon>icon.elemental_bless_scrl_i00</icon>
|
||||
<operateType>A1</operateType>
|
||||
<isMagic>4</isMagic>
|
||||
<effectPoint>1</effectPoint>
|
||||
<operateType>A2</operateType>
|
||||
<abnormalLvl>1</abnormalLvl>
|
||||
<abnormalTime>1200</abnormalTime>
|
||||
<magicLvl>1</magicLvl>
|
||||
<stayAfterDeath>true</stayAfterDeath>
|
||||
<targetType>SELF</targetType>
|
||||
<affectScope>SINGLE</affectScope>
|
||||
<effects>
|
||||
<effect name="SpiritExpModify">
|
||||
<amount>20</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54029" toLevel="4" name="Venir's Blessing">
|
||||
<!-- When equipped, CON, MEN, DEX, WIT, STR, INT +$s1. -->
|
||||
@ -195,21 +270,153 @@
|
||||
<!-- Max HP +50. -->
|
||||
<icon>icon.elemental_necklace_fire_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<effects>
|
||||
<effect name="MaxHp">
|
||||
<amount>
|
||||
<value level="1">50</value>
|
||||
<value level="2">50</value>
|
||||
<value level="3">100</value>
|
||||
<value level="4">100</value>
|
||||
<value level="5">150</value>
|
||||
<value level="6">150</value>
|
||||
<value level="7">200</value>
|
||||
<value level="8">200</value>
|
||||
<value level="9">300</value>
|
||||
<value level="10">300</value>
|
||||
<value level="11">500</value>
|
||||
</amount>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>
|
||||
<value level="1">0</value>
|
||||
<value level="2">1</value>
|
||||
<value level="3">1</value>
|
||||
<value level="4">2</value>
|
||||
<value level="5">2</value>
|
||||
<value level="6">3</value>
|
||||
<value level="7">3</value>
|
||||
<value level="8">5</value>
|
||||
<value level="9">7</value>
|
||||
<value level="10">10</value>
|
||||
<value level="11">15</value>
|
||||
</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54031" toLevel="11" name="Nebula's Necklace Basic Effect">
|
||||
<!-- Max HP +50. -->
|
||||
<icon>icon.elemental_necklace_water_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<effects>
|
||||
<effect name="MaxHp">
|
||||
<amount>
|
||||
<value level="1">50</value>
|
||||
<value level="2">50</value>
|
||||
<value level="3">100</value>
|
||||
<value level="4">100</value>
|
||||
<value level="5">150</value>
|
||||
<value level="6">150</value>
|
||||
<value level="7">200</value>
|
||||
<value level="8">200</value>
|
||||
<value level="9">300</value>
|
||||
<value level="10">300</value>
|
||||
<value level="11">500</value>
|
||||
</amount>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>
|
||||
<value level="1">0</value>
|
||||
<value level="2">1</value>
|
||||
<value level="3">1</value>
|
||||
<value level="4">2</value>
|
||||
<value level="5">2</value>
|
||||
<value level="6">3</value>
|
||||
<value level="7">3</value>
|
||||
<value level="8">5</value>
|
||||
<value level="9">7</value>
|
||||
<value level="10">10</value>
|
||||
<value level="11">15</value>
|
||||
</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54032" toLevel="11" name="Procella's Necklace Basic Effect">
|
||||
<!-- Max HP +50. -->
|
||||
<icon>icon.elemental_necklace_wind_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<effects>
|
||||
<effect name="MaxHp">
|
||||
<amount>
|
||||
<value level="1">50</value>
|
||||
<value level="2">50</value>
|
||||
<value level="3">100</value>
|
||||
<value level="4">100</value>
|
||||
<value level="5">150</value>
|
||||
<value level="6">150</value>
|
||||
<value level="7">200</value>
|
||||
<value level="8">200</value>
|
||||
<value level="9">300</value>
|
||||
<value level="10">300</value>
|
||||
<value level="11">500</value>
|
||||
</amount>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>
|
||||
<value level="1">0</value>
|
||||
<value level="2">1</value>
|
||||
<value level="3">1</value>
|
||||
<value level="4">2</value>
|
||||
<value level="5">2</value>
|
||||
<value level="6">3</value>
|
||||
<value level="7">3</value>
|
||||
<value level="8">5</value>
|
||||
<value level="9">7</value>
|
||||
<value level="10">10</value>
|
||||
<value level="11">15</value>
|
||||
</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54033" toLevel="11" name="Petram's Necklace Basic Effect">
|
||||
<!-- Max HP +50. -->
|
||||
<icon>icon.elemental_necklace_earth_i00</icon>
|
||||
<operateType>P</operateType>
|
||||
<effects>
|
||||
<effect name="MaxHp">
|
||||
<amount>
|
||||
<value level="1">50</value>
|
||||
<value level="2">50</value>
|
||||
<value level="3">100</value>
|
||||
<value level="4">100</value>
|
||||
<value level="5">150</value>
|
||||
<value level="6">150</value>
|
||||
<value level="7">200</value>
|
||||
<value level="8">200</value>
|
||||
<value level="9">300</value>
|
||||
<value level="10">300</value>
|
||||
<value level="11">500</value>
|
||||
</amount>
|
||||
</effect>
|
||||
<effect name="PAtk">
|
||||
<amount>
|
||||
<value level="1">0</value>
|
||||
<value level="2">1</value>
|
||||
<value level="3">1</value>
|
||||
<value level="4">2</value>
|
||||
<value level="5">2</value>
|
||||
<value level="6">3</value>
|
||||
<value level="7">3</value>
|
||||
<value level="8">5</value>
|
||||
<value level="9">7</value>
|
||||
<value level="10">10</value>
|
||||
<value level="11">15</value>
|
||||
</amount>
|
||||
<mode>PER</mode>
|
||||
</effect>
|
||||
</effects>
|
||||
</skill>
|
||||
<skill id="54034" toLevel="10" name="Anakim's Power">
|
||||
<!-- When using the Recharge skill, MP Recovery Rate +5, M. Atk. +1%. -->
|
||||
|
@ -100,6 +100,8 @@ DispelBySlotMyself: Removes given amount of effects by specified AbnormalType
|
||||
DispelBySlotProbability: Removes given amount of effects by specified AbnormalType at a given rate.
|
||||
DoubleCast: Triggers Fire, Water, Wind, Earth stance and enables the ability to cast two skills at once.
|
||||
DuelistFury: Synergy effect for Faceoff effect. (l2jmobius)
|
||||
ElementalSpiritAttack: Elemental spirit attack stat effect. (JoeAlisson)
|
||||
ElementalSpiritDefense: Elemental spirit defense stat effect. (JoeAlisson)
|
||||
EnableCloak: See/unsee cloaks.
|
||||
EnemyCharge: Charges towards the enemy. Rush Impact.
|
||||
EnergyAttack: Physical attack based on Momentum formula. Triple Sonic Slash, Double Sonic Slash etc.
|
||||
@ -278,6 +280,7 @@ SoulEating: Absorbs souls when taking exp from mobs and sets max soul count.
|
||||
Sow: Planting a seed into NPC target. Manor stuff.
|
||||
Speed: Speed stat.
|
||||
SphericBarrier: Blocks damage and buff/debuff incoming from outside the specified range.
|
||||
SpiritExpModify: Spirit EXP modify stat effect. (JoeAlisson)
|
||||
SpModify: Bonus SP stat.
|
||||
Spoil: Spoils a mob activating its extra sweep drop.
|
||||
StatBonusSkillCritical: Changes skill critical rate to depend on the specified base stat.
|
||||
|
54
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/ElementalSpiritData.xsd
vendored
Normal file
54
L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/xsd/ElementalSpiritData.xsd
vendored
Normal 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>
|
@ -66,6 +66,7 @@
|
||||
<xs:attribute name="exp" type="xs:decimal" />
|
||||
<xs:attribute name="sp" type="xs:decimal" />
|
||||
<xs:attribute name="raidPoints" type="xs:decimal" />
|
||||
<xs:attribute name="attribute_exp" type="xs:decimal" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
<xs:element name="mpReward" minOccurs="0" maxOccurs="1">
|
||||
@ -302,6 +303,7 @@
|
||||
<xs:attribute name="usingServerSideName" type="xs:boolean" />
|
||||
<xs:attribute name="title" type="xs:string" />
|
||||
<xs:attribute name="usingServerSideTitle" type="xs:boolean" />
|
||||
<xs:attribute name="element" type="xs:string" />
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:sequence>
|
||||
|
@ -16,6 +16,9 @@
|
||||
*/
|
||||
package org.l2jmobius.commons.util;
|
||||
|
||||
import static java.util.Objects.isNull;
|
||||
import static java.util.Objects.nonNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
@ -27,11 +30,14 @@ import java.time.DayOfWeek;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.ToIntFunction;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
|
||||
@ -587,4 +593,29 @@ public final class CommonUtil
|
||||
final DecimalFormat formatter = new DecimalFormat(format, new DecimalFormatSymbols(Locale.ENGLISH));
|
||||
return formatter.format(val);
|
||||
}
|
||||
|
||||
public static boolean isNullOrEmpty(final CharSequence value)
|
||||
{
|
||||
return isNull(value) || (value.length() == 0);
|
||||
}
|
||||
|
||||
public static boolean isNotEmpty(final String value)
|
||||
{
|
||||
return nonNull(value) && !value.isEmpty();
|
||||
}
|
||||
|
||||
public static boolean isNullOrEmpty(final Collection<?> collection)
|
||||
{
|
||||
return isNull(collection) || collection.isEmpty();
|
||||
}
|
||||
|
||||
public static <T> int zeroIfNullOrElse(T obj, ToIntFunction<T> action)
|
||||
{
|
||||
return isNull(obj) ? 0 : action.applyAsInt(obj);
|
||||
}
|
||||
|
||||
public static <T> boolean falseIfNullOrElse(T obj, Predicate<T> predicate)
|
||||
{
|
||||
return nonNull(obj) && predicate.test(obj);
|
||||
}
|
||||
}
|
||||
|
@ -55,6 +55,7 @@ import org.l2jmobius.gameserver.data.xml.impl.CombinationItemsData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.CubicData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.DailyMissionData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ElementalSpiritData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.EnchantItemHPBonusData;
|
||||
@ -239,6 +240,7 @@ public class GameServer
|
||||
ClanRewardData.getInstance();
|
||||
DailyMissionHandler.getInstance().executeScript();
|
||||
DailyMissionData.getInstance();
|
||||
ElementalSpiritData.getInstance();
|
||||
|
||||
printSection("Skills");
|
||||
SkillConditionHandler.getInstance().executeScript();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
@ -42,6 +42,7 @@ import org.l2jmobius.commons.util.IXmlReader;
|
||||
import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.AISkillScope;
|
||||
import org.l2jmobius.gameserver.enums.DropType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
|
||||
import org.l2jmobius.gameserver.enums.MpRewardType;
|
||||
import org.l2jmobius.gameserver.model.StatsSet;
|
||||
@ -110,6 +111,7 @@ public class NpcData implements IXmlReader
|
||||
set.set("usingServerSideName", parseBoolean(attrs, "usingServerSideName"));
|
||||
set.set("title", parseString(attrs, "title"));
|
||||
set.set("usingServerSideTitle", parseBoolean(attrs, "usingServerSideTitle"));
|
||||
set.set("elementalType", parseEnum(attrs, ElementalType.class, "element"));
|
||||
for (Node npcNode = listNode.getFirstChild(); npcNode != null; npcNode = npcNode.getNextSibling())
|
||||
{
|
||||
attrs = npcNode.getAttributes();
|
||||
@ -143,6 +145,7 @@ public class NpcData implements IXmlReader
|
||||
set.set("exp", parseDouble(attrs, "exp"));
|
||||
set.set("sp", parseDouble(attrs, "sp"));
|
||||
set.set("raidPoints", parseDouble(attrs, "raidPoints"));
|
||||
set.set("attribute_exp", parseLong(attrs, "attribute_exp"));
|
||||
break;
|
||||
}
|
||||
case "mpreward":
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -42,6 +42,7 @@ import org.l2jmobius.gameserver.datatables.EventDroplist.DateDrop;
|
||||
import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.DropType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||
import org.l2jmobius.gameserver.enums.Team;
|
||||
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
||||
@ -50,6 +51,7 @@ import org.l2jmobius.gameserver.instancemanager.WalkingManager;
|
||||
import org.l2jmobius.gameserver.model.AggroInfo;
|
||||
import org.l2jmobius.gameserver.model.CommandChannel;
|
||||
import org.l2jmobius.gameserver.model.DamageDoneInfo;
|
||||
import org.l2jmobius.gameserver.model.ElementalSpirit;
|
||||
import org.l2jmobius.gameserver.model.Party;
|
||||
import org.l2jmobius.gameserver.model.Seed;
|
||||
import org.l2jmobius.gameserver.model.WorldObject;
|
||||
@ -519,6 +521,8 @@ public class Attackable extends Npc
|
||||
attacker.updateVitalityPoints(getVitalityPoints(attacker.getLevel(), exp, _isRaid), true, false);
|
||||
PcCafePointsManager.getInstance().givePcCafePoint(attacker, exp);
|
||||
}
|
||||
|
||||
rewardAttributeExp(attacker, damage, totalDamage);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -616,6 +620,11 @@ public class Attackable extends Npc
|
||||
if (partyDmg > 0)
|
||||
{
|
||||
attackerParty.distributeXpAndSp(exp, sp, rewardedMembers, partyLvl, partyDmg, this);
|
||||
|
||||
for (PlayerInstance rewardedMember : rewardedMembers)
|
||||
{
|
||||
rewardAttributeExp(rewardedMember, damage, totalDamage);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -627,6 +636,19 @@ public class Attackable extends Npc
|
||||
}
|
||||
}
|
||||
|
||||
private void rewardAttributeExp(PlayerInstance player, long damage, long totalDamage)
|
||||
{
|
||||
if ((player.getActiveElementalSpiritType() > 0) && (getAttributeExp() > 0) && (getElementalSpiritType() != ElementalType.NONE))
|
||||
{
|
||||
final long attributeExp = (long) (((getAttributeExp() * damage) / totalDamage) * player.getElementalSpiritXpBonus());
|
||||
final ElementalSpirit spirit = player.getElementalSpirit(getElementalSpiritType().getDominating());
|
||||
if (spirit != null)
|
||||
{
|
||||
spirit.addExperience(attributeExp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addAttackerToAttackByList(Creature creature)
|
||||
{
|
||||
|
@ -54,6 +54,7 @@ import org.l2jmobius.gameserver.data.xml.impl.TransformData;
|
||||
import org.l2jmobius.gameserver.enums.AttributeType;
|
||||
import org.l2jmobius.gameserver.enums.BasicProperty;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||
import org.l2jmobius.gameserver.enums.ItemSkillType;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
@ -2691,6 +2692,18 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
info.addComponentType(UserInfoType.ATK_ELEMENTAL);
|
||||
break;
|
||||
}
|
||||
case ELEMENTAL_SPIRIT_EARTH_ATTACK:
|
||||
case ELEMENTAL_SPIRIT_EARTH_DEFENSE:
|
||||
case ELEMENTAL_SPIRIT_FIRE_ATTACK:
|
||||
case ELEMENTAL_SPIRIT_FIRE_DEFENSE:
|
||||
case ELEMENTAL_SPIRIT_WATER_ATTACK:
|
||||
case ELEMENTAL_SPIRIT_WATER_DEFENSE:
|
||||
case ELEMENTAL_SPIRIT_WIND_ATTACK:
|
||||
case ELEMENTAL_SPIRIT_WIND_DEFENSE:
|
||||
{
|
||||
info.addComponentType(UserInfoType.ATT_SPIRITS);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4506,11 +4519,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
}
|
||||
}
|
||||
|
||||
final double damageCap = _stat.getValue(Stats.DAMAGE_LIMIT);
|
||||
if (damageCap > 0)
|
||||
{
|
||||
value = Math.min(value, damageCap);
|
||||
}
|
||||
double elementalDamage = 0;
|
||||
|
||||
// Calculate PvP/PvE damage received. It is a post-attack stat.
|
||||
if (attacker != null)
|
||||
@ -4523,6 +4532,15 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
{
|
||||
value *= (100 + _stat.getValue(Stats.PVE_DAMAGE_TAKEN)) / 100;
|
||||
}
|
||||
|
||||
elementalDamage = Formulas.calcSpiritElementalDamage(attacker, this);
|
||||
value += elementalDamage;
|
||||
}
|
||||
|
||||
final double damageCap = _stat.getValue(Stats.DAMAGE_LIMIT);
|
||||
if (damageCap > 0)
|
||||
{
|
||||
value = Math.min(value, damageCap);
|
||||
}
|
||||
|
||||
if (Config.CHAMPION_ENABLE && isChampion() && (Config.CHAMPION_HP != 0))
|
||||
@ -4540,7 +4558,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
|
||||
if (attacker != null)
|
||||
{
|
||||
attacker.sendDamageMessage(this, skill, (int) value, critical, false);
|
||||
attacker.sendDamageMessage(this, skill, (int) value, elementalDamage, critical, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4671,10 +4689,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
* @param target
|
||||
* @param skill
|
||||
* @param damage
|
||||
* @param elementalDamage
|
||||
* @param crit
|
||||
* @param miss
|
||||
*/
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
|
||||
{
|
||||
|
||||
}
|
||||
@ -5472,4 +5491,14 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
|
||||
_buffFinishTask = null;
|
||||
}
|
||||
}
|
||||
|
||||
public double getElementalSpiritDefenseOf(ElementalType type)
|
||||
{
|
||||
return getElementalSpiritType() == type ? 100 : 0;
|
||||
}
|
||||
|
||||
public ElementalType getElementalSpiritType()
|
||||
{
|
||||
return ElementalType.NONE;
|
||||
}
|
||||
}
|
||||
|
@ -29,6 +29,7 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.AISkillScope;
|
||||
import org.l2jmobius.gameserver.enums.AIType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
|
||||
import org.l2jmobius.gameserver.enums.PrivateStoreType;
|
||||
@ -868,6 +869,17 @@ public class Npc extends Creature
|
||||
return getTemplate().getSP() * rateMul;
|
||||
}
|
||||
|
||||
public long getAttributeExp()
|
||||
{
|
||||
return getTemplate().getAttributeExp();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementalType getElementalSpiritType()
|
||||
{
|
||||
return getTemplate().getElementalType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Kill the NpcInstance (the corpse disappeared after 7 seconds).<br>
|
||||
* <B><U>Actions</U>:</B>
|
||||
|
@ -734,7 +734,7 @@ public abstract class Summon extends Playable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
|
||||
{
|
||||
if (miss || (_owner == null))
|
||||
{
|
||||
|
@ -124,11 +124,11 @@ public class DoppelgangerInstance extends Npc
|
||||
public void doAttack(double damage, Creature target, Skill skill, boolean isDOT, boolean directlyToHp, boolean critical, boolean reflect)
|
||||
{
|
||||
super.doAttack(damage, target, skill, isDOT, directlyToHp, critical, reflect);
|
||||
sendDamageMessage(target, skill, (int) damage, critical, false);
|
||||
sendDamageMessage(target, skill, (int) damage, 0, critical, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
|
||||
{
|
||||
if (miss || (getSummoner() == null) || !getSummoner().isPlayer())
|
||||
{
|
||||
|
@ -47,6 +47,7 @@ import java.util.stream.Collectors;
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.commons.database.DatabaseFactory;
|
||||
import org.l2jmobius.commons.util.CommonUtil;
|
||||
import org.l2jmobius.commons.util.Rnd;
|
||||
import org.l2jmobius.gameserver.GameTimeController;
|
||||
import org.l2jmobius.gameserver.ItemsAutoDestroy;
|
||||
@ -83,6 +84,7 @@ import org.l2jmobius.gameserver.enums.CastleSide;
|
||||
import org.l2jmobius.gameserver.enums.CategoryType;
|
||||
import org.l2jmobius.gameserver.enums.ChatType;
|
||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.GroupType;
|
||||
import org.l2jmobius.gameserver.enums.HtmlActionScope;
|
||||
import org.l2jmobius.gameserver.enums.IllegalActionPunishmentType;
|
||||
@ -108,6 +110,7 @@ import org.l2jmobius.gameserver.instancemanager.AntiFeedManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.CastleManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.DuelManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.ElementalSpiritInstanceManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.FortManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
|
||||
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
|
||||
@ -125,6 +128,7 @@ import org.l2jmobius.gameserver.model.ArenaParticipantsHolder;
|
||||
import org.l2jmobius.gameserver.model.BlockList;
|
||||
import org.l2jmobius.gameserver.model.CommandChannel;
|
||||
import org.l2jmobius.gameserver.model.ContactList;
|
||||
import org.l2jmobius.gameserver.model.ElementalSpirit;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
import org.l2jmobius.gameserver.model.Macro;
|
||||
import org.l2jmobius.gameserver.model.MacroList;
|
||||
@ -213,6 +217,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerReputa
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerSubChange;
|
||||
import org.l2jmobius.gameserver.model.fishing.Fishing;
|
||||
import org.l2jmobius.gameserver.model.holders.AttendanceInfoHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.ElementalSpiritDataHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.MovieHolder;
|
||||
import org.l2jmobius.gameserver.model.holders.PlayerEventHolder;
|
||||
@ -847,6 +852,9 @@ public final class PlayerInstance extends Playable
|
||||
|
||||
private final Set<Integer> _whisperers = ConcurrentHashMap.newKeySet();
|
||||
|
||||
private ElementalSpirit[] _spirits;
|
||||
private ElementalType _activeElementalSpiritType;
|
||||
|
||||
// Selling buffs system
|
||||
private boolean _isSellingBuffs = false;
|
||||
private List<SellBuffHolder> _sellingBuffs = null;
|
||||
@ -2350,6 +2358,7 @@ public final class PlayerInstance extends Playable
|
||||
if (getClassId().level() == 3)
|
||||
{
|
||||
sendPacket(SystemMessageId.CONGRATULATIONS_YOU_VE_COMPLETED_YOUR_THIRD_CLASS_TRANSFER_QUEST);
|
||||
initElementalSpirits();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -6662,6 +6671,11 @@ public final class PlayerInstance extends Playable
|
||||
player.setSponsor(rset.getInt("sponsor"));
|
||||
player.setLvlJoinedAcademy(rset.getInt("lvl_joined_academy"));
|
||||
|
||||
if ((player.getLevel() >= 76) && (player.getClassId().level() > 2))
|
||||
{
|
||||
player.initElementalSpirits();
|
||||
}
|
||||
|
||||
CursedWeaponsManager.getInstance().checkPlayer(player);
|
||||
|
||||
// Set the x,y,z position of the PlayerInstance and make it invisible
|
||||
@ -7085,6 +7099,17 @@ public final class PlayerInstance extends Playable
|
||||
{
|
||||
aVars.storeMe();
|
||||
}
|
||||
|
||||
if (_spirits != null)
|
||||
{
|
||||
for (ElementalSpirit spirit : _spirits)
|
||||
{
|
||||
if (spirit != null)
|
||||
{
|
||||
spirit.save();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -11434,7 +11459,7 @@ public final class PlayerInstance extends Playable
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
|
||||
{
|
||||
// Check if hit is missed
|
||||
if (miss)
|
||||
@ -11496,8 +11521,16 @@ public final class PlayerInstance extends Playable
|
||||
sm.addInt(damage);
|
||||
}
|
||||
else if (this != target)
|
||||
{
|
||||
if (elementalDamage != 0)
|
||||
{
|
||||
sm = new SystemMessage(SystemMessageId.S1_HAS_INFLICTED_S3_DAMAGE_ATTRIBUTE_DAMAGE_S4_TO_S2);
|
||||
}
|
||||
else
|
||||
{
|
||||
sm = new SystemMessage(SystemMessageId.C1_HAS_INFLICTED_S3_DAMAGE_ON_C2);
|
||||
}
|
||||
|
||||
sm.addPcName(this);
|
||||
|
||||
// Localisation related.
|
||||
@ -11513,6 +11546,10 @@ public final class PlayerInstance extends Playable
|
||||
|
||||
sm.addString(targetName);
|
||||
sm.addInt(damage);
|
||||
if (elementalDamage != 0)
|
||||
{
|
||||
sm.addInt((int) elementalDamage);
|
||||
}
|
||||
sm.addPopup(target.getObjectId(), getObjectId(), -damage);
|
||||
}
|
||||
|
||||
@ -13922,4 +13959,139 @@ public final class PlayerInstance extends Playable
|
||||
getVariables().set(ATTENDANCE_INDEX_VAR, rewardIndex);
|
||||
}
|
||||
}
|
||||
|
||||
public void initElementalSpirits()
|
||||
{
|
||||
tryLoadSpirits();
|
||||
|
||||
if (_spirits == null)
|
||||
{
|
||||
final ElementalType[] types = ElementalType.values();
|
||||
_spirits = new ElementalSpirit[types.length - 1]; // exclude None
|
||||
|
||||
for (ElementalType type : types)
|
||||
{
|
||||
if (ElementalType.NONE == type)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final ElementalSpirit spirit = new ElementalSpirit(type, this);
|
||||
_spirits[type.getId() - 1] = spirit;
|
||||
spirit.save();
|
||||
}
|
||||
}
|
||||
|
||||
if (_activeElementalSpiritType == null)
|
||||
{
|
||||
changeElementalSpirit(ElementalType.FIRE.getId());
|
||||
}
|
||||
}
|
||||
|
||||
private void tryLoadSpirits()
|
||||
{
|
||||
final List<ElementalSpiritDataHolder> spiritsData = ElementalSpiritInstanceManager.getInstance().findByPlayerId(getObjectId());
|
||||
if (!spiritsData.isEmpty())
|
||||
{
|
||||
_spirits = new ElementalSpirit[ElementalType.values().length - 1];
|
||||
for (ElementalSpiritDataHolder spiritData : spiritsData)
|
||||
{
|
||||
_spirits[spiritData.getType() - 1] = new ElementalSpirit(spiritData, this);
|
||||
if (spiritData.isInUse())
|
||||
{
|
||||
_activeElementalSpiritType = ElementalType.of(spiritData.getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public double getActiveElementalSpiritAttack()
|
||||
{
|
||||
return getStat().getElementalSpiritPower(_activeElementalSpiritType, CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getAttack));
|
||||
}
|
||||
|
||||
public double getFireSpiritDefense()
|
||||
{
|
||||
return getElementalSpiritDefenseOf(ElementalType.FIRE);
|
||||
}
|
||||
|
||||
public double getWaterSpiritDefense()
|
||||
{
|
||||
return getElementalSpiritDefenseOf(ElementalType.WATER);
|
||||
}
|
||||
|
||||
public double getWindSpiritDefense()
|
||||
{
|
||||
return getElementalSpiritDefenseOf(ElementalType.WIND);
|
||||
}
|
||||
|
||||
public double getEarthSpiritDefense()
|
||||
{
|
||||
return getElementalSpiritDefenseOf(ElementalType.EARTH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getElementalSpiritDefenseOf(ElementalType type)
|
||||
{
|
||||
return getStat().getElementalSpiritDefense(type, CommonUtil.zeroIfNullOrElse(getElementalSpirit(type), ElementalSpirit::getDefense));
|
||||
}
|
||||
|
||||
public double getElementalSpiritCritRate()
|
||||
{
|
||||
return getStat().getElementalSpiritCriticalRate(CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getCriticalRate));
|
||||
}
|
||||
|
||||
public double getElementalSpiritCritDamage()
|
||||
{
|
||||
return getStat().getElementalSpiritCriticalDamage(CommonUtil.zeroIfNullOrElse(getElementalSpirit(_activeElementalSpiritType), ElementalSpirit::getCriticalDamage));
|
||||
}
|
||||
|
||||
public double getElementalSpiritXpBonus()
|
||||
{
|
||||
return getStat().getElementalSpiritXpBonus();
|
||||
}
|
||||
|
||||
public ElementalSpirit getElementalSpirit(ElementalType type)
|
||||
{
|
||||
if ((_spirits == null) || (type == null) || (type == ElementalType.NONE))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return _spirits[type.getId() - 1];
|
||||
}
|
||||
|
||||
public byte getActiveElementalSpiritType()
|
||||
{
|
||||
return (byte) CommonUtil.zeroIfNullOrElse(_activeElementalSpiritType, ElementalType::getId);
|
||||
}
|
||||
|
||||
public void changeElementalSpirit(byte element)
|
||||
{
|
||||
_activeElementalSpiritType = ElementalType.of(element);
|
||||
|
||||
if (_spirits != null)
|
||||
{
|
||||
for (ElementalSpirit spirit : _spirits)
|
||||
{
|
||||
if (spirit != null)
|
||||
{
|
||||
spirit.setInUse(spirit.getType() == element);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final UserInfo userInfo = new UserInfo(this, false);
|
||||
userInfo.addComponentType(UserInfoType.ATT_SPIRITS);
|
||||
sendPacket(userInfo);
|
||||
}
|
||||
|
||||
public ElementalSpirit[] getSpirits()
|
||||
{
|
||||
return _spirits;
|
||||
}
|
||||
|
||||
public boolean isInBattle()
|
||||
{
|
||||
return AttackStanceTaskManager.getInstance().hasAttackStanceTask(this);
|
||||
}
|
||||
}
|
||||
|
@ -249,11 +249,11 @@ public final class TrapInstance extends Npc
|
||||
public void doAttack(double damage, Creature target, Skill skill, boolean isDOT, boolean directlyToHp, boolean critical, boolean reflect)
|
||||
{
|
||||
super.doAttack(damage, target, skill, isDOT, directlyToHp, critical, reflect);
|
||||
sendDamageMessage(target, skill, (int) damage, critical, false);
|
||||
sendDamageMessage(target, skill, (int) damage, 0, critical, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, boolean crit, boolean miss)
|
||||
public void sendDamageMessage(Creature target, Skill skill, int damage, double elementalDamage, boolean crit, boolean miss)
|
||||
{
|
||||
if (miss || (_owner == null))
|
||||
{
|
||||
|
@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.PartySmallWindowUpdateType;
|
||||
import org.l2jmobius.gameserver.enums.UserInfoType;
|
||||
import org.l2jmobius.gameserver.model.Party;
|
||||
@ -684,6 +685,31 @@ public class PlayerStat extends PlayableStat
|
||||
return (int) getValue(Stats.ARTIFACT_SLOTS, 0);
|
||||
}
|
||||
|
||||
public double getElementalSpiritXpBonus()
|
||||
{
|
||||
return getValue(Stats.ELEMENTAL_SPIRIT_BONUS_EXP, 1);
|
||||
}
|
||||
|
||||
public double getElementalSpiritPower(ElementalType type, double base)
|
||||
{
|
||||
return type == null ? 0 : getValue(type.getAttackStat(), base);
|
||||
}
|
||||
|
||||
public double getElementalSpiritCriticalRate(int base)
|
||||
{
|
||||
return getValue(Stats.ELEMENTAL_SPIRIT_CRITICAL_RATE, base);
|
||||
}
|
||||
|
||||
public double getElementalSpiritCriticalDamage(double base)
|
||||
{
|
||||
return getValue(Stats.ELEMENTAL_SPIRIT_CRITICAL_DAMAGE, base);
|
||||
}
|
||||
|
||||
public double getElementalSpiritDefense(ElementalType type, double base)
|
||||
{
|
||||
return type == null ? 0 : getValue(type.getDefenseStat(), base);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRecalculateStats(boolean broadcast)
|
||||
{
|
||||
|
@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.datatables.ItemTable;
|
||||
import org.l2jmobius.gameserver.enums.AISkillScope;
|
||||
import org.l2jmobius.gameserver.enums.AIType;
|
||||
import org.l2jmobius.gameserver.enums.DropType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.MpRewardAffectType;
|
||||
import org.l2jmobius.gameserver.enums.MpRewardType;
|
||||
import org.l2jmobius.gameserver.enums.Race;
|
||||
@ -118,6 +119,9 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
|
||||
|
||||
private List<Integer> _extendDrop;
|
||||
|
||||
private ElementalType _elementalType;
|
||||
private long _attributeExp;
|
||||
|
||||
/**
|
||||
* Constructor of Creature.
|
||||
* @param set The StatsSet object to transfer data to the method
|
||||
@ -142,6 +146,8 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
|
||||
setRace(set.getEnum("race", Race.class, Race.NONE));
|
||||
_sex = set.getEnum("sex", Sex.class, Sex.ETC);
|
||||
|
||||
_elementalType = set.getEnum("elementalType", ElementalType.class, ElementalType.NONE);
|
||||
|
||||
_chestId = set.getInt("chestId", 0);
|
||||
_rhandId = set.getInt("rhandId", 0);
|
||||
_lhandId = set.getInt("lhandId", 0);
|
||||
@ -150,6 +156,7 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
|
||||
_exp = set.getDouble("exp", 0);
|
||||
_sp = set.getDouble("sp", 0);
|
||||
_raidPoints = set.getDouble("raidPoints", 0);
|
||||
_attributeExp = set.getLong("attribute_exp", 0);
|
||||
|
||||
_unique = set.getBoolean("unique", false);
|
||||
_attackable = set.getBoolean("attackable", true);
|
||||
@ -354,6 +361,16 @@ public final class NpcTemplate extends CreatureTemplate implements IIdentifiable
|
||||
return _raidPoints;
|
||||
}
|
||||
|
||||
public long getAttributeExp()
|
||||
{
|
||||
return _attributeExp;
|
||||
}
|
||||
|
||||
public ElementalType getElementalType()
|
||||
{
|
||||
return _elementalType;
|
||||
}
|
||||
|
||||
public boolean isUnique()
|
||||
{
|
||||
return _unique;
|
||||
|
@ -37,6 +37,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleport;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneExit;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnElementalSpiritUpgrade;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAggroRangeEnter;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableAttack;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnAttackableFactionCall;
|
||||
@ -56,6 +57,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSkillSee;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSpawn;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleport;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcTeleportRequest;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnElementalSpiritLearn;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayableExpChanged;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAbilityPointsChanged;
|
||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerAugment;
|
||||
@ -286,7 +288,10 @@ public enum EventType
|
||||
ON_INSTANCE_DESTROY(OnInstanceDestroy.class, void.class),
|
||||
ON_INSTANCE_ENTER(OnInstanceEnter.class, void.class),
|
||||
ON_INSTANCE_LEAVE(OnInstanceLeave.class, void.class),
|
||||
ON_INSTANCE_STATUS_CHANGE(OnInstanceStatusChange.class, void.class);
|
||||
ON_INSTANCE_STATUS_CHANGE(OnInstanceStatusChange.class, void.class),
|
||||
|
||||
ON_ELEMENTAL_SPIRIT_UPGRADE(OnElementalSpiritUpgrade.class, void.class),
|
||||
ON_ELEMENTAL_SPIRIT_LEARN(OnElementalSpiritLearn.class, void.class);
|
||||
|
||||
private final Class<? extends IBaseEvent> _eventClass;
|
||||
private final Class<?>[] _returnClass;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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++;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -27,6 +27,7 @@ import org.l2jmobius.gameserver.data.xml.impl.KarmaData;
|
||||
import org.l2jmobius.gameserver.enums.AttributeType;
|
||||
import org.l2jmobius.gameserver.enums.BasicProperty;
|
||||
import org.l2jmobius.gameserver.enums.DispelSlotType;
|
||||
import org.l2jmobius.gameserver.enums.ElementalType;
|
||||
import org.l2jmobius.gameserver.enums.Position;
|
||||
import org.l2jmobius.gameserver.enums.ShotType;
|
||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||
@ -1652,4 +1653,77 @@ public final class Formulas
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
public static double calcSpiritElementalDamage(Creature attacker, Creature target)
|
||||
{
|
||||
if (attacker.isPlayer())
|
||||
{
|
||||
final PlayerInstance attackerPlayer = attacker.getActingPlayer();
|
||||
ElementalType type = ElementalType.of(attackerPlayer.getActiveElementalSpiritType());
|
||||
|
||||
if (ElementalType.NONE == type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
final double critRate = attackerPlayer.getElementalSpiritCritRate();
|
||||
final boolean isCrit = Math.min(critRate, 380) > Rnd.get(1000);
|
||||
final double critDamage = attackerPlayer.getElementalSpiritCritDamage();
|
||||
final double attack = attackerPlayer.getActiveElementalSpiritAttack() - target.getElementalSpiritDefenseOf(type);
|
||||
if (target.isPlayer())
|
||||
{
|
||||
return calcSpiritElementalPvPDamage(attack, critDamage, isCrit);
|
||||
}
|
||||
return calcSpiritElementalPvEDamage(type, target.getElementalSpiritType(), attack, critDamage, isCrit);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static double calcSpiritElementalPvPDamage(double attack, double critDamage, boolean isCrit)
|
||||
{
|
||||
double damage = (attack * 1.223) + Rnd.get(-20, +20);
|
||||
if (isCrit)
|
||||
{
|
||||
damage += (attack * 1.223) + (((attack * 0.03) + 24) * critDamage) + Rnd.get(-5, 30);
|
||||
}
|
||||
return damage;
|
||||
}
|
||||
|
||||
private static double calcSpiritElementalPvEDamage(ElementalType attackerType, ElementalType targetType, double attack, double critDamage, boolean isCrit)
|
||||
{
|
||||
double damage;
|
||||
double baseDamage = (attack * 0.8) + Rnd.get(-25, 25);
|
||||
double bonus = 1;
|
||||
if (targetType == ElementalType.NONE)
|
||||
{
|
||||
damage = attack * 0.735;
|
||||
}
|
||||
else if (attackerType.getDominating() == targetType)
|
||||
{
|
||||
damage = (-1136 + baseDamage) * 0.6;
|
||||
bonus = 0.6;
|
||||
}
|
||||
else if (targetType.getDominating() == attackerType)
|
||||
{
|
||||
damage = (185 + baseDamage) * 1.2;
|
||||
bonus = 1.2;
|
||||
}
|
||||
else if (targetType == attackerType)
|
||||
{
|
||||
damage = baseDamage;
|
||||
}
|
||||
else
|
||||
{
|
||||
damage = (-477 + baseDamage) * 0.8;
|
||||
bonus = 0.8;
|
||||
}
|
||||
|
||||
if (isCrit)
|
||||
{
|
||||
damage += ((40 + ((9.2 + (attack * 0.048)) * critDamage)) * bonus) + Rnd.get(-10, 50);
|
||||
}
|
||||
|
||||
return damage;
|
||||
}
|
||||
}
|
||||
|
@ -89,6 +89,19 @@ public enum Stats
|
||||
HATE_ATTACK("attackHate"),
|
||||
REAR_DAMAGE_RATE("rearDamage"),
|
||||
|
||||
// ELEMENTAL SPIRITS
|
||||
ELEMENTAL_SPIRIT_FIRE_ATTACK("elementalSpiritFireAttack"),
|
||||
ELEMENTAL_SPIRIT_WATER_ATTACK("elementalSpiritWaterAttack"),
|
||||
ELEMENTAL_SPIRIT_WIND_ATTACK("elementalSpiritWindAttack"),
|
||||
ELEMENTAL_SPIRIT_EARTH_ATTACK("elementalSpiritEarthAttack"),
|
||||
ELEMENTAL_SPIRIT_FIRE_DEFENSE("elementalSpiritFireDefense"),
|
||||
ELEMENTAL_SPIRIT_WATER_DEFENSE("elementalSpiritWaterDefense"),
|
||||
ELEMENTAL_SPIRIT_WIND_DEFENSE("elementalSpiritWindDefense"),
|
||||
ELEMENTAL_SPIRIT_EARTH_DEFENSE("elementalSpiritEarthDefense"),
|
||||
ELEMENTAL_SPIRIT_CRITICAL_RATE("elementalSpiritCriticalRate"),
|
||||
ELEMENTAL_SPIRIT_CRITICAL_DAMAGE("elementalSpiritCriticalDamage"),
|
||||
ELEMENTAL_SPIRIT_BONUS_EXP("elementalSpiritExp"),
|
||||
|
||||
// PVP BONUS
|
||||
PVP_PHYSICAL_ATTACK_DAMAGE("pvpPhysDmg"),
|
||||
PVP_MAGICAL_SKILL_DAMAGE("pvpMagicalDmg"),
|
||||
|
@ -60,7 +60,16 @@ import org.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrys
|
||||
import org.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrystallizeItemCancel;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestOneDayRewardReceive;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.dailymission.RequestTodoList;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalInitTalent;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritAbsorb;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritAbsorbInfo;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritChangeType;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritEvolution;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritEvolutionInfo;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritExtract;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritExtractInfo;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritInfo;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.elementalspirits.ExElementalSpiritSetTalent;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
|
||||
@ -423,21 +432,21 @@ public enum ExIncomingPackets implements IIncomingPackets<GameClient>
|
||||
EX_PLEDGE_ITEM_INFO(0x14E, null, ConnectionState.IN_GAME),
|
||||
EX_PLEDGE_ITEM_BUY(0x14F, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_INFO(0x150, ExElementalSpiritInfo::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_ABSORB(0x158, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EXTRACT_INFO(0x151, ExElementalSpiritExtractInfo::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EXTRACT(0x152, ExElementalSpiritExtract::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EVOLUTION_INFO(0x153, ExElementalSpiritEvolutionInfo::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_EVOLUTION(0x154, ExElementalSpiritEvolution::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_SET_TALENT(0x155, ExElementalSpiritSetTalent::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_INIT_TALENT(0x156, ExElementalInitTalent::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_ABSORB_INFO(0x157, ExElementalSpiritAbsorbInfo::new, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_ABSORB(0x158, ExElementalSpiritAbsorb::new, ConnectionState.IN_GAME),
|
||||
EX_REQUEST_LOCKED_ITEM(0x159, null, ConnectionState.IN_GAME),
|
||||
EX_REQUEST_UNLOCKED_ITEM(0x15A, null, ConnectionState.IN_GAME),
|
||||
EX_LOCKED_ITEM_CANCEL(0x15B, null, ConnectionState.IN_GAME),
|
||||
EX_UNLOCKED_ITEM_CANCEL(0x15C, null, ConnectionState.IN_GAME),
|
||||
REQUEST_BLOCK_LIST_FOR_AD(0x15D, null, ConnectionState.IN_GAME),
|
||||
REQUEST_USER_BAN_INFO(0x15E, null, ConnectionState.IN_GAME),
|
||||
EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15F, null, ConnectionState.IN_GAME), // 152
|
||||
EX_ELEMENTAL_SPIRIT_CHANGE_TYPE(0x15D, ExElementalSpiritChangeType::new, ConnectionState.IN_GAME), // 152
|
||||
REQUEST_BLOCK_LIST_FOR_AD(0x15E, null, ConnectionState.IN_GAME),
|
||||
REQUEST_USER_BAN_INFO(0x15F, null, ConnectionState.IN_GAME),
|
||||
EX_INTERACT_MODIFY(0x160, null, ConnectionState.IN_GAME), // 152
|
||||
EX_TRY_ENCHANT_ARTIFACT(0x161, null, ConnectionState.IN_GAME), // 152
|
||||
EX_XIGN_CODE(0x162, null, ConnectionState.IN_GAME); // 152
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -20,19 +20,19 @@ import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ElementalSpiritInfo;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
* @author JoeAlisson
|
||||
*/
|
||||
public class ExElementalSpiritInfo implements IClientIncomingPacket
|
||||
{
|
||||
@SuppressWarnings("unused")
|
||||
private int _id;
|
||||
private byte _type;
|
||||
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_id = packet.readC();
|
||||
_type = (byte) packet.readC();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -45,6 +45,6 @@ public class ExElementalSpiritInfo implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
// player.sendPacket(new org.l2jmobius.gameserver.network.serverpackets.elementalspirits.ExElementalSpiritInfo());
|
||||
client.sendPacket(new ElementalSpiritInfo(player, player.getActiveElementalSpiritType(), _type));
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -80,6 +80,7 @@ public class ConfirmDlg implements IClientOutgoingPacket
|
||||
case SystemMessage.TYPE_ELEMENT_NAME:
|
||||
case SystemMessage.TYPE_BYTE:
|
||||
case SystemMessage.TYPE_FACTION_NAME:
|
||||
case SystemMessage.TYPE_ELEMENTAL_SPIRIT:
|
||||
{
|
||||
packet.writeC(param.getIntValue());
|
||||
break;
|
||||
|
@ -80,6 +80,7 @@ public final class SystemMessage implements IClientOutgoingPacket
|
||||
}
|
||||
}
|
||||
|
||||
public static final byte TYPE_ELEMENTAL_SPIRIT = 26;
|
||||
public static final byte TYPE_FACTION_NAME = 24; // c(short), faction id.
|
||||
// id 22 d (shared with 1-3,17,22
|
||||
// id 21 h
|
||||
@ -374,6 +375,12 @@ public final class SystemMessage implements IClientOutgoingPacket
|
||||
return this;
|
||||
}
|
||||
|
||||
public SystemMessage addElementalSpirit(int elementType)
|
||||
{
|
||||
append(new SMParam(TYPE_ELEMENTAL_SPIRIT, elementType));
|
||||
return this;
|
||||
}
|
||||
|
||||
public SMParam[] getParams()
|
||||
{
|
||||
return _params;
|
||||
@ -419,6 +426,7 @@ public final class SystemMessage implements IClientOutgoingPacket
|
||||
case TYPE_ELEMENT_NAME:
|
||||
case TYPE_BYTE:
|
||||
case TYPE_FACTION_NAME:
|
||||
case TYPE_ELEMENTAL_SPIRIT:
|
||||
{
|
||||
packet.writeC(param.getIntValue());
|
||||
break;
|
||||
|
@ -19,7 +19,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.gameserver.data.xml.impl.ExperienceData;
|
||||
import org.l2jmobius.gameserver.enums.AttributeType;
|
||||
import org.l2jmobius.gameserver.enums.UserInfoType;
|
||||
import org.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
|
||||
import org.l2jmobius.gameserver.model.Party;
|
||||
@ -376,12 +375,12 @@ public class UserInfo extends AbstractMaskPacket<UserInfoType>
|
||||
if (containsMask(UserInfoType.ATT_SPIRITS)) // 152
|
||||
{
|
||||
packet.writeH(26);
|
||||
packet.writeD(_player.getAttackElementValue(_player.getAttackElement())); // Attribute Attack Power
|
||||
packet.writeD(_player.getDefenseElementValue(AttributeType.FIRE)); // Fire defence
|
||||
packet.writeD(_player.getDefenseElementValue(AttributeType.WATER)); // Water defence
|
||||
packet.writeD(_player.getDefenseElementValue(AttributeType.WIND)); // Wind defence
|
||||
packet.writeD(_player.getDefenseElementValue(AttributeType.EARTH)); // Earth defence
|
||||
packet.writeD(0x00); // Enabled 1 - Disabled 0 // Third class player?
|
||||
packet.writeD((int) _player.getActiveElementalSpiritAttack());
|
||||
packet.writeD((int) _player.getFireSpiritDefense());
|
||||
packet.writeD((int) _player.getWaterSpiritDefense());
|
||||
packet.writeD((int) _player.getWindSpiritDefense());
|
||||
packet.writeD((int) _player.getEarthSpiritDefense());
|
||||
packet.writeD(_player.getActiveElementalSpiritType());
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -79,6 +79,7 @@ Seven Signs: https://eu.4gameforum.com/threads/658543/
|
||||
-Parsed new NPCs from client
|
||||
-Updated skiltrees and skills from L2Wiki
|
||||
-Updated experience values from L2Wiki
|
||||
-Elemental Spirits
|
||||
-Land of Winds spawns
|
||||
-Goddard territory spawns
|
||||
-Goddard clanhalls
|
||||
|
17
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/db_installer/sql/game/character_spirits.sql
vendored
Normal file
17
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/db_installer/sql/game/character_spirits.sql
vendored
Normal 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;
|
187
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/ElementalSpiritData.xml
vendored
Normal file
187
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/ElementalSpiritData.xml
vendored
Normal 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>
|
14
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-1.htm
vendored
Normal file
14
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-1.htm
vendored
Normal 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>
|
8
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-11.htm
vendored
Normal file
8
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-11.htm
vendored
Normal 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>
|
15
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-12.htm
vendored
Normal file
15
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-12.htm
vendored
Normal 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>
|
14
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-13.htm
vendored
Normal file
14
L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/html/merchant/34053-13.htm
vendored
Normal 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
Loading…
Reference in New Issue
Block a user