New henna pattern potential system.

Thanks to Serenitty and Index.
This commit is contained in:
MobiusDevelopment
2022-02-09 17:50:39 +00:00
parent 384abd5695
commit c4acf141fe
44 changed files with 17260 additions and 16526 deletions

View File

@@ -0,0 +1,8 @@
DROP TABLE IF EXISTS `character_potens`;
CREATE TABLE IF NOT EXISTS `character_potens` (
`charId` INT UNSIGNED NOT NULL DEFAULT 0,
`enchant_level` INT,
`enchant_exp` INT,
`poten_id` INT,
PRIMARY KEY (`charId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

View File

@@ -241,6 +241,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("MpShield", MpShield::new);
EffectHandler.getInstance().registerHandler("MpVampiricAttack", MpVampiricAttack::new);
EffectHandler.getInstance().registerHandler("Mute", Mute::new);
EffectHandler.getInstance().registerHandler("HennaSlotsAdd", NewHennaSlotsAdd::new);
EffectHandler.getInstance().registerHandler("NoblesseBless", NoblesseBless::new);
EffectHandler.getInstance().registerHandler("OpenChest", OpenChest::new);
EffectHandler.getInstance().registerHandler("OpenCommonRecipeBook", OpenCommonRecipeBook::new);

View File

@@ -0,0 +1,31 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package handlers.effecthandlers;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.stats.Stat;
/**
* @author Serenitty
*/
public class NewHennaSlotsAdd extends AbstractStatPercentEffect
{
public NewHennaSlotsAdd(StatSet params)
{
super(params, Stat.HENNA_SLOTS_AVAILABLE);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/hennaPatternPotential.xsd">
<enchantFees>
<fee step="1">
<requiredItem id="57" count="500000" />
<dailyCount>5</dailyCount>
<enchantExp count="0" chance="50" />
<enchantExp count="1" chance="50" />
</fee>
<fee step="2">
<requiredItem id="57" count="2000000" />
<dailyCount>5</dailyCount>
<enchantExp count="1" chance="90" />
<enchantExp count="2" chance="29" />
<enchantExp count="3" chance="1" />
</fee>
<fee step="3">
<requiredItem id="96623" count="1" />
<dailyCount>10</dailyCount>
<enchantExp count="1" chance="10" />
<enchantExp count="2" chance="75" />
<enchantExp count="3" chance="12" />
<enchantExp count="4" chance="2" />
<enchantExp count="5" chance="1" />
</fee>
</enchantFees>
<experiencePoints>
<hiddenPower level="1" exp="20" /> <!-- 1 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="2" exp="30" /> <!-- 2 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="3" exp="40" /> <!-- 3 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="4" exp="50" /> <!-- 4 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="5" exp="100" /> <!-- 5 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="6" exp="110" /> <!-- 6 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="7" exp="120" /> <!-- 7 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="8" exp="130" /> <!-- 8 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="9" exp="140" /> <!-- 9 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="10" exp="150" /> <!-- 10 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="11" exp="170" /> <!-- 11 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="12" exp="190" /> <!-- 12 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="13" exp="210" /> <!-- 13 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="14" exp="230" /> <!-- 14 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="15" exp="250" /> <!-- 15 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="16" exp="300" /> <!-- 16 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="17" exp="350" /> <!-- 17 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="18" exp="400" /> <!-- 18 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="19" exp="450" /> <!-- 19 window, how many points do you need to fill a skillbonus. -->
<hiddenPower level="20" exp="500" /> <!-- 20 window, how many points do you need to fill a skillbonus. -->
</experiencePoints>
<hiddenPotentials>
<poten id="1" slotId="1" maxSkillLevel="20" skillId="83001" /> <!-- P and M. Atk. -->
<poten id="2" slotId="1" maxSkillLevel="20" skillId="83002" /> <!-- P and M. Def. -->
<poten id="3" slotId="1" maxSkillLevel="20" skillId="83003" /> <!-- Atk Spdeed and Casting Spdpeed. -->
<poten id="4" slotId="2" maxSkillLevel="20" skillId="83004" /> <!-- Skill damage bonus in PvE -->
<poten id="5" slotId="2" maxSkillLevel="20" skillId="83005" /> <!-- You Received skill damage in PvE -->
<poten id="6" slotId="2" maxSkillLevel="20" skillId="83006" /> <!-- Skill Damage Bonus in PvP -->
<poten id="7" slotId="2" maxSkillLevel="20" skillId="83007" /> <!-- Received skill damage in PvP -->
<poten id="8" slotId="3" maxSkillLevel="20" skillId="83008" /> <!-- Skill Critical Damage -->
<poten id="9" slotId="3" maxSkillLevel="20" skillId="83009" /> <!-- Skill Critical Rate -->
<poten id="10" slotId="3" maxSkillLevel="20" skillId="83010" /> <!-- You Received Skill Critical Damage -->
<poten id="11" slotId="3" maxSkillLevel="20" skillId="83011" /> <!-- You Received Skill Critical Rate -->
<poten id="12" slotId="4" maxSkillLevel="20" skillId="83012" /> <!-- Soulshot and Spiritshot damage -->
<poten id="13" slotId="4" maxSkillLevel="20" skillId="83013" /> <!-- Soulshot and Spiritshot Damage Resistance -->
<poten id="14" slotId="4" maxSkillLevel="20" skillId="83014" /> <!-- Damage decrease -->
<poten id="15" slotId="4" maxSkillLevel="20" skillId="83015" /> <!-- Damage decrease ignore -->
<poten id="16" slotId="4" maxSkillLevel="20" skillId="83016" /> <!-- Anomaly Atk Rate -->
</hiddenPotentials>
</list>

View File

@@ -570,496 +570,541 @@
<item id="96355" name="STR Dye" additionalName="Lv. 1" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +2 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 1. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96356" name="STR Dye" additionalName="Lv. 2" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +3 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 2. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96357" name="STR Dye" additionalName="Lv. 3" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +25 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 3. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96358" name="STR Dye" additionalName="Lv. 4" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +50 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 4. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96359" name="STR Dye" additionalName="Lv. 5" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +75 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 5. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96360" name="STR Dye" additionalName="Lv. 6" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +100 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 6. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96361" name="STR Dye" additionalName="Lv. 7" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +125 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 7. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96362" name="STR Dye" additionalName="Lv. 8" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +150 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 8. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96363" name="STR Dye" additionalName="Lv. 9" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +175 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 9. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96364" name="STR Dye" additionalName="Lv. 10" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +4 <Additional effect> P. Atk. +200 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 10. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96365" name="STR Dye" additionalName="Lv. 11" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +225 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 11. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96366" name="STR Dye" additionalName="Lv. 12" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +250 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 12. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96367" name="STR Dye" additionalName="Lv. 13" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +275 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 13. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96368" name="STR Dye" additionalName="Lv. 14" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +300 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 14. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96369" name="STR Dye" additionalName="Lv. 15" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +325 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 15. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96370" name="STR Dye" additionalName="Lv. 16" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +350 P. Skill Critical Rate +0.5% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 16. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96371" name="STR Dye" additionalName="Lv. 17" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +375 P. Skill Critical Rate +1% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 17. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96372" name="STR Dye" additionalName="Lv. 18" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +400 P. Skill Critical Rate +1.5% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 18. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96373" name="STR Dye" additionalName="Lv. 19" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +425 P. Skill Critical Rate +2% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 19. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96374" name="STR Dye" additionalName="Lv. 20" type="EtcItem">
<!-- Required for applying STR Pattern. Applying the pattern requires 1 dye. <Effect> STR +5 <Additional effect> P. Atk. +450 P. Skill Critical Rate +3% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon1.g_premium_dye_attribute_unholy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96375" name="CON Dye" additionalName="Lv. 1" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +2 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 1. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96376" name="CON Dye" additionalName="Lv. 2" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +3 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 2. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96377" name="CON Dye" additionalName="Lv. 3" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +32 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 3. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96378" name="CON Dye" additionalName="Lv. 4" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +65 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 4. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96379" name="CON Dye" additionalName="Lv. 5" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +97 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 5. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96380" name="CON Dye" additionalName="Lv. 6" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +130 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 6. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96381" name="CON Dye" additionalName="Lv. 7" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +162 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 7. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96382" name="CON Dye" additionalName="Lv. 8" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +195 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 8. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96383" name="CON Dye" additionalName="Lv. 9" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +227 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 9. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96384" name="CON Dye" additionalName="Lv. 10" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +4 <Additional effect> P. Def. +260 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 10. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96385" name="CON Dye" additionalName="Lv. 11" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +292 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 11. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96386" name="CON Dye" additionalName="Lv. 12" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +325 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 12. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96387" name="CON Dye" additionalName="Lv. 13" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +357 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 13. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96388" name="CON Dye" additionalName="Lv. 14" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +390 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 14. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96389" name="CON Dye" additionalName="Lv. 15" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +422 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 15. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96390" name="CON Dye" additionalName="Lv. 16" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +455 Received P. Skill Damage -1% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 16. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96391" name="CON Dye" additionalName="Lv. 17" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +487 Received P. Skill Damage -1.5% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 17. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96392" name="CON Dye" additionalName="Lv. 18" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +520 Received P. Skill Damage -2% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 18. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96393" name="CON Dye" additionalName="Lv. 19" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +552 Received P. Skill Damage -3% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 19. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96394" name="CON Dye" additionalName="Lv. 20" type="EtcItem">
<!-- Required for applying CON Pattern. Applying the pattern requires 1 dye. <Effect> CON +5 <Additional effect> P. Def. +585 Received P. Skill Damage -5% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon5.g_premium_dye_attribute_fire" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96395" name="DEX Dye" additionalName="Lv. 1" type="EtcItem">
<!-- Required for applying DEX Pattern. Applying the pattern requires 1 dye. <Effect> DEX +2 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 1. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon3.g_premium_dye_attribute_holy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96396" name="DEX Dye" additionalName="Lv. 2" type="EtcItem">
<!-- Required for applying DEX Pattern. Applying the pattern requires 1 dye. <Effect> DEX +3 <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 2. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. -->
<set name="icon" val="BranchSys3.icon3.g_premium_dye_attribute_holy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96397" name="DEX Dye" additionalName="Lv. 3" type="EtcItem">
<!-- Required for applying DEX Pattern. Applying the pattern requires 1 dye. <Effect> DEX +4 <Additional effect> Received P. Skill Critical Rate -0.4% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 3. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon3.g_premium_dye_attribute_holy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96398" name="DEX Dye" additionalName="Lv. 4" type="EtcItem">
<!-- Required for applying DEX Pattern. Applying the pattern requires 1 dye. <Effect> DEX +4 <Additional effect> Received P. Skill Critical Rate -0.8% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 4. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon3.g_premium_dye_attribute_holy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
<item id="96399" name="DEX Dye" additionalName="Lv. 5" type="EtcItem">
<!-- Required for applying DEX Pattern. Applying the pattern requires 1 dye. <Effect> DEX +4 <Additional effect> Received P. Skill Critical Rate -1.2% <font color=ff6666>Note!</font> Requirements: all classes after the 1st class change. Hidden power: Lv. 5. Patterns and dyes can be upgraded through compounding. Costs for upgrading patterns and dyes differ. <font color=eeaa22>Additional effects of similar applied patterns do not stack.</font> -->
<set name="icon" val="BranchSys3.icon3.g_premium_dye_attribute_holy" />
<set name="default_action" val="NONE" />
<set name="etcitem_type" val="DYE" />
<set name="immediate_effect" val="true" />
<set name="material" val="LIQUID" />
<set name="weight" val="1" />
<set name="price" val="240000" />
<set name="is_dropable" val="false" />
<set name="weight" val="150" />
<set name="price" val="21000" />
<set name="commissionItemType" val="DYES" />
<set name="is_stackable" val="true" />
<set name="is_sellable" val="false" />
</item>
</list>

View File

@@ -1,49 +1,467 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/skills.xsd">
<skill id="83001" toLevel="20" name="P./ M. Atk.">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PAtk">
<amount>
<value level="1">20</value>
<value level="2">30</value>
<value level="3">40</value>
<value level="4">50</value>
<value level="5">100</value>
<value level="6">200</value>
<value level="7">300</value>
<value level="8">400</value>
<value level="9">500</value>
<value level="10">700</value>
<value level="11">900</value>
<value level="12">1000</value>
<value level="13">1100</value>
<value level="14">1200</value>
<value level="15">1400</value>
<value level="16">1500</value>
<value level="17">1600</value>
<value level="18">1700</value>
<value level="19">1800</value>
<value level="20">2000</value>
</amount>
<mode>DIFF</mode>
</effect>
<effect name="MAtk">
<amount>
<value level="1">20</value>
<value level="2">30</value>
<value level="3">40</value>
<value level="4">50</value>
<value level="5">100</value>
<value level="6">200</value>
<value level="7">300</value>
<value level="8">400</value>
<value level="9">500</value>
<value level="10">700</value>
<value level="11">900</value>
<value level="12">1000</value>
<value level="13">1100</value>
<value level="14">1200</value>
<value level="15">1400</value>
<value level="16">1500</value>
<value level="17">1600</value>
<value level="18">1700</value>
<value level="19">1800</value>
<value level="20">2000</value>
</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="83002" toLevel="20" name="P./ M. Def.">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PAtk">
<amount>
<value level="1">20</value>
<value level="2">30</value>
<value level="3">40</value>
<value level="4">50</value>
<value level="5">100</value>
<value level="6">200</value>
<value level="7">300</value>
<value level="8">400</value>
<value level="9">500</value>
<value level="10">700</value>
<value level="11">900</value>
<value level="12">1000</value>
<value level="13">1100</value>
<value level="14">1200</value>
<value level="15">1400</value>
<value level="16">1500</value>
<value level="17">1600</value>
<value level="18">1700</value>
<value level="19">1800</value>
<value level="20">2000</value>
</amount>
<mode>DIFF</mode>
</effect>
<effect name="MAtk">
<amount>
<value level="1">20</value>
<value level="2">30</value>
<value level="3">40</value>
<value level="4">50</value>
<value level="5">100</value>
<value level="6">200</value>
<value level="7">300</value>
<value level="8">400</value>
<value level="9">500</value>
<value level="10">700</value>
<value level="11">900</value>
<value level="12">1000</value>
<value level="13">1100</value>
<value level="14">1200</value>
<value level="15">1400</value>
<value level="16">1500</value>
<value level="17">1600</value>
<value level="18">1700</value>
<value level="19">1800</value>
<value level="20">2000</value>
</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="83003" toLevel="20" name="Atk. Spd./ Casting Spd.">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PhysicalAttackSpeed">
<amount>
<value level="1">4</value>
<value level="2">6</value>
<value level="3">8</value>
<value level="4">10</value>
<value level="5">20</value>
<value level="6">40</value>
<value level="7">60</value>
<value level="8">80</value>
<value level="9">100</value>
<value level="10">140</value>
<value level="11">180</value>
<value level="12">200</value>
<value level="13">220</value>
<value level="14">240</value>
<value level="15">280</value>
<value level="16">300</value>
<value level="17">320</value>
<value level="18">340</value>
<value level="19">360</value>
<value level="20">400</value>
</amount>
<mode>DIFF</mode>
</effect>
<effect name="MagicalAttackSpeed">
<amount>
<value level="1">4</value>
<value level="2">6</value>
<value level="3">8</value>
<value level="4">10</value>
<value level="5">20</value>
<value level="6">40</value>
<value level="7">60</value>
<value level="8">80</value>
<value level="9">100</value>
<value level="10">140</value>
<value level="11">180</value>
<value level="12">200</value>
<value level="13">220</value>
<value level="14">240</value>
<value level="15">280</value>
<value level="16">300</value>
<value level="17">320</value>
<value level="18">340</value>
<value level="19">360</value>
<value level="20">400</value>
</amount>
<mode>DIFF</mode>
</effect>
</effects>
</skill>
<skill id="83004" toLevel="20" name="Skill damage bonus in PvE">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PvePhysicalSkillDamageBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDamageBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83005" toLevel="20" name="Received skill damage in PvE">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PvePhysicalSkillDefenceBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PveMagicalSkillDefenceBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83006" toLevel="20" name="Skill Damage Bonus in PvP">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PvpPhysicalSkillDamageBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDamageBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83007" toLevel="20" name="Received skill damage in PvP">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="PvpPhysicalSkillDefenceBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
<effect name="PvpMagicalSkillDefenceBonus">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83008" toLevel="20" name="Skill Critical Damage">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="SkillCriticalDamage">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83009" toLevel="20" name="Skill Critical Rate">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->
<icon>icon.skill0000</icon>
<operateType>A1</operateType>
<operateType>P</operateType>
<magicCriticalRate>5</magicCriticalRate>
<effects>
<effect name="CriticalRate">
<amount>
<value level="1">0.1</value>
<value level="2">0.2</value>
<value level="3">0.3</value>
<value level="4">0.4</value>
<value level="5">0.6</value>
<value level="6">1.2</value>
<value level="7">1.8</value>
<value level="8">2.4</value>
<value level="9">3</value>
<value level="10">4.2</value>
<value level="11">5.4</value>
<value level="12">6</value>
<value level="13">6.6</value>
<value level="14">7.2</value>
<value level="15">8.4</value>
<value level="16">9</value>
<value level="17">9.6</value>
<value level="18">10.2</value>
<value level="19">10.8</value>
<value level="20">12</value>
</amount>
<mode>PER</mode>
</effect>
</effects>
</skill>
<skill id="83010" toLevel="20" name="Received Skill Critical Damage">
<!-- AUTO GENERATED SKILL TODO: FIX IT -->

View File

@@ -43,10 +43,7 @@
</xs:element>
<xs:element name="classId" minOccurs="0" maxOccurs="unbounded">
<xs:simpleType>
<xs:restriction base="xs:nonNegativeInteger">
<xs:minInclusive value="0" />
<xs:maxInclusive value="211" />
</xs:restriction>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
</xs:sequence>
@@ -54,6 +51,7 @@
<xs:attribute name="dyeName" type="xs:token" />
<xs:attribute name="dyeItemId" type="xs:positiveInteger" />
<xs:attribute name="dyeLevel" type="xs:positiveInteger" />
<xs:attribute name="patternLevel" type="xs:nonNegativeInteger" />
</xs:complexType>
</xs:element>
</xs:sequence>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="enchantFees">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="fee" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="requiredItem" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="id" type="xs:positiveInteger" />
<xs:attribute name="count" type="xs:long" />
</xs:complexType>
</xs:element>
<xs:element name="dailyCount" minOccurs="1" maxOccurs="1" />
<xs:element name="enchantExp" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="count" type="xs:int" />
<xs:attribute name="chance" type="xs:double" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="step" type="xs:positiveInteger" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="experiencePoints">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="hiddenPower" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="level" type="xs:positiveInteger" />
<xs:attribute name="exp" type="xs:positiveInteger" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="hiddenPotentials">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="poten" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id" type="xs:int" />
<xs:attribute name="slotId" type="xs:int" />
<xs:attribute name="maxSkillLevel" type="xs:positiveInteger" />
<xs:attribute name="skillId" type="xs:positiveInteger" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -28,9 +28,9 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.skill.Skill;
/**
@@ -44,7 +44,8 @@ public class HennaData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(HennaData.class.getName());
private final Map<Integer, Henna> _hennaList = new HashMap<>();
private final Map<Integer, Henna> _hennaDyeIdList = new HashMap<>();
private final Map<Integer, Henna> _hennaItemIdList = new HashMap<>();
/**
* Instantiates a new henna data.
@@ -57,9 +58,10 @@ public class HennaData implements IXmlReader
@Override
public void load()
{
_hennaList.clear();
_hennaItemIdList.clear();
_hennaDyeIdList.clear();
parseDatapackFile("data/stats/hennaList.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _hennaList.size() + " henna data.");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _hennaDyeIdList.size() + " henna data.");
}
@Override
@@ -82,12 +84,12 @@ public class HennaData implements IXmlReader
/**
* Parses the henna.
* @param d the d
* @param d the node
*/
private void parseHenna(Node d)
{
final StatSet set = new StatSet();
final List<ClassId> wearClassIds = new ArrayList<>();
final List<Integer> wearClassIds = new ArrayList<>();
final List<Skill> skills = new ArrayList<>();
NamedNodeMap attrs = d.getAttributes();
Node attr;
@@ -141,15 +143,20 @@ public class HennaData implements IXmlReader
}
case "classId":
{
wearClassIds.add(ClassId.getClassId(Integer.parseInt(c.getTextContent())));
for (String s : c.getTextContent().split(","))
{
wearClassIds.add(Integer.parseInt(s));
}
break;
}
}
}
final Henna henna = new Henna(set);
henna.setSkills(skills);
henna.setWearClassIds(wearClassIds);
_hennaList.put(henna.getDyeId(), henna);
_hennaDyeIdList.put(henna.getDyeId(), henna);
_hennaItemIdList.put(henna.getDyeItemId(), henna);
}
/**
@@ -159,20 +166,30 @@ public class HennaData implements IXmlReader
*/
public Henna getHenna(int id)
{
return _hennaList.get(id);
return _hennaDyeIdList.get(id);
}
public Henna getHennaByDyeId(int id)
{
return _hennaDyeIdList.get(id);
}
public Henna getHennaByItemId(int id)
{
return _hennaItemIdList.get(id);
}
/**
* Gets the henna list.
* @param classId the player's class Id.
* @param player the player's class Id.
* @return the list with all the allowed dyes.
*/
public List<Henna> getHennaList(ClassId classId)
public List<Henna> getHennaList(Player player)
{
final List<Henna> list = new ArrayList<>();
for (Henna henna : _hennaList.values())
for (Henna henna : _hennaDyeIdList.values())
{
if (henna.isAllowedClass(classId))
if (henna.isAllowedClass(player))
{
list.add(henna);
}

View File

@@ -0,0 +1,243 @@
/*
* 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;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
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.StatSet;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
import org.l2jmobius.gameserver.model.item.henna.DyePotential;
import org.l2jmobius.gameserver.model.item.henna.DyePotentialFee;
import org.l2jmobius.gameserver.model.skill.Skill;
/**
* @author Serenitty
*/
public class HennaPatternPotentialData implements IXmlReader
{
private static final Logger LOGGER = Logger.getLogger(HennaPatternPotentialData.class.getName());
private final Map<Integer, Integer> _potenExpTable = new HashMap<>();
private final Map<Integer, DyePotentialFee> _potenFees = new HashMap<>();
private final Map<Integer, DyePotential> _potentials = new HashMap<>();
private int MAX_POTEN_LEVEL = 0;
protected HennaPatternPotentialData()
{
load();
}
@Override
public void load()
{
_potenFees.clear();
_potenExpTable.clear();
_potentials.clear();
parseDatapackFile("data/stats/hennaPatternPotential.xml");
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _potenFees.size() + " dye pattern fee data.");
}
@Override
public void parseDocument(Document doc, File f)
{
for (Node m = doc.getFirstChild(); m != null; m = m.getNextSibling())
{
if ("list".equals(m.getNodeName()))
{
for (Node k = m.getFirstChild(); k != null; k = k.getNextSibling())
{
switch (k.getNodeName())
{
case "enchantFees":
{
for (Node n = k.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("fee".equals(n.getNodeName()))
{
NamedNodeMap attrs = n.getAttributes();
Node att;
final StatSet set = new StatSet();
for (int i = 0; i < attrs.getLength(); i++)
{
att = attrs.item(i);
set.set(att.getNodeName(), att.getNodeValue());
}
final int step = parseInteger(attrs, "step");
int itemId = 0;
long itemCount = 0;
int dailyCount = 0;
final Map<Integer, Double> enchantExp = new HashMap<>();
for (Node b = n.getFirstChild(); b != null; b = b.getNextSibling())
{
attrs = b.getAttributes();
switch (b.getNodeName())
{
case "requiredItem":
{
itemId = parseInteger(attrs, "id");
itemCount = parseLong(attrs, "count", 1L);
break;
}
case "dailyCount":
{
dailyCount = Integer.parseInt(b.getTextContent());
break;
}
case "enchantExp":
{
enchantExp.put(parseInteger(attrs, "count"), parseDouble(attrs, "chance"));
break;
}
}
}
_potenFees.put(step, new DyePotentialFee(step, new ItemHolder(itemId, itemCount), dailyCount, enchantExp));
}
}
break;
}
case "experiencePoints":
{
for (Node n = k.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("hiddenPower".equals(n.getNodeName()))
{
NamedNodeMap attrs = n.getAttributes();
Node att;
final StatSet set = new StatSet();
for (int i = 0; i < attrs.getLength(); i++)
{
att = attrs.item(i);
set.set(att.getNodeName(), att.getNodeValue());
}
final int level = parseInteger(attrs, "level");
final int exp = parseInteger(attrs, "exp");
_potenExpTable.put(level, exp);
if (MAX_POTEN_LEVEL < level)
{
MAX_POTEN_LEVEL = level;
}
}
}
break;
}
case "hiddenPotentials":
{
for (Node n = k.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("poten".equals(n.getNodeName()))
{
NamedNodeMap attrs = n.getAttributes();
Node att;
final StatSet set = new StatSet();
for (int i = 0; i < attrs.getLength(); i++)
{
att = attrs.item(i);
set.set(att.getNodeName(), att.getNodeValue());
}
final int id = parseInteger(attrs, "id");
final int slotId = parseInteger(attrs, "slotId");
final int maxSkillLevel = parseInteger(attrs, "maxSkillLevel");
final int skillId = parseInteger(attrs, "skillId");
_potentials.put(id, new DyePotential(id, slotId, skillId, maxSkillLevel));
}
}
break;
}
}
}
}
}
}
public DyePotentialFee getFee(int step)
{
return _potenFees.get(step);
}
public int getMaxPotenEnchantStep()
{
return _potenFees.size();
}
public int getExpForLevel(int level)
{
return _potenExpTable.get(level);
}
public int getMaxPotenLevel()
{
return MAX_POTEN_LEVEL;
}
public DyePotential getPotential(int potenId)
{
return _potentials.get(potenId);
}
public Skill getPotentialSkill(int potenId, int slotId, int level)
{
final DyePotential potential = _potentials.get(potenId);
if (potential == null)
{
return null;
}
if (potential.getSlotId() == slotId)
{
return potential.getSkill(level);
}
return null;
}
public Collection<Integer> getSkillIdsBySlotId(int slotId)
{
final List<Integer> skillIds = new ArrayList<>();
for (DyePotential potential : _potentials.values())
{
if (potential.getSlotId() == slotId)
{
skillIds.add(potential.getSkillId());
}
}
return skillIds;
}
public static HennaPatternPotentialData getInstance()
{
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder
{
protected static final HennaPatternPotentialData INSTANCE = new HennaPatternPotentialData();
}
}

View File

@@ -73,6 +73,7 @@ import org.l2jmobius.gameserver.data.xml.AttendanceRewardData;
import org.l2jmobius.gameserver.data.xml.CategoryData;
import org.l2jmobius.gameserver.data.xml.ClassListData;
import org.l2jmobius.gameserver.data.xml.CollectionData;
import org.l2jmobius.gameserver.data.xml.HennaPatternPotentialData;
import org.l2jmobius.gameserver.data.xml.ElementalSpiritData;
import org.l2jmobius.gameserver.data.xml.ExperienceData;
import org.l2jmobius.gameserver.data.xml.HennaData;
@@ -251,9 +252,10 @@ import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
import org.l2jmobius.gameserver.model.item.Armor;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.ItemTemplate;
import org.l2jmobius.gameserver.model.item.Weapon;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.model.item.type.ActionType;
import org.l2jmobius.gameserver.model.item.type.ArmorType;
@@ -437,7 +439,9 @@ public class Player extends Playable
private static final String RESTORE_CHAR_HENNAS = "SELECT slot,symbol_id FROM character_hennas WHERE charId=? AND class_index=?";
private static final String ADD_CHAR_HENNA = "INSERT INTO character_hennas (charId,symbol_id,slot,class_index) VALUES (?,?,?,?)";
private static final String DELETE_CHAR_HENNA = "DELETE FROM character_hennas WHERE charId=? AND slot=? AND class_index=?";
private static final String DELETE_CHAR_HENNAS = "DELETE FROM character_hennas WHERE charId=? AND class_index=?";
private static final String ADD_CHAR_HENNA_POTENS = "REPLACE INTO character_potens (charId,enchant_level,enchant_exp,poten_id) VALUES (?,?,?,?)";
// private static final String RESTORE_CHAR_HENNAS_POTENS = "SELECT poten_id,enchant_level,enchant_exp FROM character_potens WHERE charId=?";
// private static final String UPDATE_CHAR_HENNAS_POTENS = "UPDATE character_potens SET enchant_level=?,enchant_exp=?,poten_id=?,class_id=?,dual_class=? WHERE charId=?";
// Character Shortcut SQL String Definitions:
private static final String DELETE_CHAR_SHORTCUTS = "DELETE FROM character_shortcuts WHERE charId=? AND class_index=?";
@@ -675,10 +679,12 @@ public class Player extends Playable
private final Set<Player> _snoopedPlayer = ConcurrentHashMap.newKeySet();
/** Hennas */
private final Henna[] _henna = new Henna[3];
private final HennaPoten[] _hennaPoten = new HennaPoten[4];
private final Map<BaseStat, Integer> _hennaBaseStats = new ConcurrentHashMap<>();
private final Map<Integer, ScheduledFuture<?>> _hennaRemoveSchedules = new ConcurrentHashMap<>(3);
/** Hennas Potential */
/** The Pet of the Player */
private Pet _pet = null;
/** Servitors of the Player */
@@ -2470,7 +2476,7 @@ public class Player extends Playable
for (int slot = 1; slot < 4; slot++)
{
final Henna henna = getHenna(slot);
if ((henna != null) && !henna.isAllowedClass(getClassId()))
if ((henna != null) && !henna.isAllowedClass(getActingPlayer()))
{
removeHenna(slot);
}
@@ -7208,6 +7214,8 @@ public class Player extends Playable
storeCharSub();
storeEffect(storeActiveEffects);
storeItemReuseDelay();
storeDyePoten();
if (Config.STORE_RECIPE_SHOPLIST)
{
storeRecipeShopList();
@@ -7911,9 +7919,9 @@ public class Player extends Playable
*/
private void restoreHenna()
{
for (int i = 1; i < 4; i++)
for (int i = 1; i < 5; i++)
{
_henna[i - 1] = null;
_hennaPoten[i - 1] = new HennaPoten();
}
// Cancel and remove existing running tasks.
@@ -7940,7 +7948,7 @@ public class Player extends Playable
while (rset.next())
{
slot = rset.getInt("slot");
if ((slot < 1) || (slot > 3))
if ((slot < 1) || (slot > getAvailableHennaSlots()))
{
continue;
}
@@ -7951,7 +7959,8 @@ public class Player extends Playable
continue;
}
final Henna henna = HennaData.getInstance().getHenna(symbolId);
// retail mobius final Henna henna = HennaData.getInstance().getHenna(symbolId);
final Henna henna = HennaData.getInstance().getHennaByDyeId(symbolId);
// Task for henna duration
if (henna.getDuration() > 0)
@@ -7967,7 +7976,7 @@ public class Player extends Playable
_hennaRemoveSchedules.put(slot, ThreadPool.schedule(new HennaDurationTask(this, slot), currentTime + remainingTime));
}
_henna[slot - 1] = henna;
_hennaPoten[slot - 1].setHenna(henna);
// Reward henna skills
for (Skill skill : henna.getSkills())
@@ -7998,12 +8007,12 @@ public class Player extends Playable
}
else if (getClassId().level() > 1)
{
totalSlots = 3;
totalSlots = getAvailableHennaSlots();
}
for (int i = 0; i < 3; i++)
for (int i = 0; i < _hennaPoten.length; i++)
{
if (_henna[i] != null)
if (_hennaPoten[i].getHenna() != null)
{
totalSlots--;
}
@@ -8024,18 +8033,18 @@ public class Player extends Playable
*/
public boolean removeHenna(int slot)
{
if ((slot < 1) || (slot > 3))
if ((slot < 1) || (slot > _hennaPoten.length))
{
return false;
}
final Henna henna = _henna[slot - 1];
final Henna henna = _hennaPoten[slot - 1].getHenna();
if (henna == null)
{
return false;
}
_henna[slot - 1] = null;
_hennaPoten[slot - 1].setHenna(null);
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(DELETE_CHAR_HENNA))
@@ -8053,9 +8062,6 @@ public class Player extends Playable
// Calculate Henna modifiers of this Player
recalcHennaStats();
// Send Server->Client HennaInfo packet to this Player
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this Player
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.STAT_POINTS, UserInfoType.STAT_ABILITIES, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
@@ -8102,16 +8108,20 @@ public class Player extends Playable
/**
* Add a Henna to the Player, save update in the character_hennas table of the database and send Server->Client HennaInfo/UserInfo packet to this Player.
* @param slotId
* @param henna the henna to add to the player.
* @return {@code true} if the henna is added to the player, {@code false} otherwise.
*/
public boolean addHenna(Henna henna)
public boolean addHenna(int slotId, Henna henna)
{
for (int i = 1; i < 4; i++)
if (slotId > getAvailableHennaSlots())
{
if (_henna[i - 1] == null)
return false;
}
{
if (_hennaPoten[slotId - 1].getHenna() == null)
{
_henna[i - 1] = henna;
_hennaPoten[slotId - 1].setHenna(henna);
// Calculate Henna modifiers of this Player
recalcHennaStats();
@@ -8121,7 +8131,7 @@ public class Player extends Playable
{
statement.setInt(1, getObjectId());
statement.setInt(2, henna.getDyeId());
statement.setInt(3, i);
statement.setInt(3, slotId);
statement.setInt(4, _classIndex);
statement.execute();
}
@@ -8133,19 +8143,20 @@ public class Player extends Playable
// Task for henna duration
if (henna.getDuration() > 0)
{
getVariables().set("HennaDuration" + i, Chronos.currentTimeMillis() + (henna.getDuration() * 60000));
_hennaRemoveSchedules.put(i, ThreadPool.schedule(new HennaDurationTask(this, i), Chronos.currentTimeMillis() + (henna.getDuration() * 60000)));
getVariables().set("HennaDuration" + slotId, Chronos.currentTimeMillis() + (henna.getDuration() * 60000));
_hennaRemoveSchedules.put(slotId, ThreadPool.schedule(new HennaDurationTask(this, slotId), Chronos.currentTimeMillis() + (henna.getDuration() * 60000)));
}
// Reward henna skills
for (Skill skill : henna.getSkills())
{
addSkill(skill, false);
if (skill.getLevel() > getSkillLevel(skill.getId()))
{
addSkill(skill, false);
}
}
// Send Server->Client HennaInfo packet to this Player
sendPacket(new HennaInfo(this));
// Send Server->Client UserInfo packet to this Player
broadcastUserInfo(UserInfoType.BASE_STATS, UserInfoType.STAT_ABILITIES, UserInfoType.STAT_POINTS, UserInfoType.MAX_HPCPMP, UserInfoType.STATS, UserInfoType.SPEED);
@@ -8154,6 +8165,7 @@ public class Player extends Playable
return true;
}
}
return false;
}
@@ -8163,8 +8175,9 @@ public class Player extends Playable
private void recalcHennaStats()
{
_hennaBaseStats.clear();
for (Henna henna : _henna)
for (HennaPoten hennaPoten : _hennaPoten)
{
final Henna henna = hennaPoten.getHenna();
if (henna == null)
{
continue;
@@ -8177,17 +8190,71 @@ public class Player extends Playable
}
}
private void storeDyePoten()
{
if (_hennaPoten[0] == null)
{
return;
}
final HennaPoten hennaPoten = new HennaPoten();
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement statement = con.prepareStatement(ADD_CHAR_HENNA_POTENS))
{
statement.setInt(1, getObjectId());
statement.setInt(2, hennaPoten.getEnchantLevel());
statement.setInt(3, hennaPoten.getEnchantExp());
statement.setInt(4, hennaPoten.getPotenId());
statement.execute();
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Failed saving character henna Potential.", e);
}
}
public void applyDyePotenSkills()
{
for (int i = 1; i <= _hennaPoten.length; i++)
{
final HennaPoten hennaPoten = _hennaPoten[i - 1];
for (int skillId : HennaPatternPotentialData.getInstance().getSkillIdsBySlotId(i))
{
removeSkill(skillId);
}
if ((hennaPoten.getPotenId() > 0) && hennaPoten.isPotentialAvailable() && (hennaPoten.getActiveStep() > 0))
{
final Skill hennaSkill = HennaPatternPotentialData.getInstance().getPotentialSkill(hennaPoten.getPotenId(), i, hennaPoten.getActiveStep());
if (hennaSkill.getLevel() > getSkillLevel(hennaSkill.getId()))
{
addSkill(hennaSkill, false);
}
}
}
}
public HennaPoten getHennaPoten(int slot)
{
if ((slot < 1) || (slot > _hennaPoten.length))
{
return null;
}
return _hennaPoten[slot - 1];
}
/**
* @param slot the character inventory henna slot.
* @return the Henna of this Player corresponding to the selected slot.
*/
public Henna getHenna(int slot)
{
if ((slot < 1) || (slot > 3))
if ((slot < 1) || (slot > getAvailableHennaSlots()))
{
return null;
}
return _henna[slot - 1];
return _hennaPoten[slot - 1].getHenna();
}
/**
@@ -8195,8 +8262,9 @@ public class Player extends Playable
*/
public boolean hasHennas()
{
for (Henna henna : _henna)
for (HennaPoten hennaPoten : _hennaPoten)
{
final Henna henna = hennaPoten.getHenna();
if (henna != null)
{
return true;
@@ -8208,9 +8276,9 @@ public class Player extends Playable
/**
* @return the henna holder for this player.
*/
public Henna[] getHennaList()
public HennaPoten[] getHennaPotenList()
{
return _henna;
return _hennaPoten;
}
/**
@@ -8222,6 +8290,51 @@ public class Player extends Playable
return _hennaBaseStats.getOrDefault(stat, 0);
}
public int getAvailableHennaSlots()
{
return (int) getStat().getValue(Stat.HENNA_SLOTS_AVAILABLE, 3);
}
public void setDyePotentialDailyStep(int dailyStep)
{
getVariables().set(PlayerVariables.DYE_POTENTIAL_DAILY_STEP, dailyStep);
}
public void setDyePotentialDailyCount(int dailyCount)
{
getVariables().set(PlayerVariables.DYE_POTENTIAL_DAILY_COUNT, dailyCount);
}
public int getDyePotentialDailyStep()
{
return getVariables().getInt(PlayerVariables.DYE_POTENTIAL_DAILY_STEP, 1);
}
public int getDyePotentialDailyCount()
{
return getVariables().getInt(PlayerVariables.DYE_POTENTIAL_DAILY_COUNT, 5);
}
public void setDyePotentialDailyExp(int dailyExp)
{
getVariables().set(PlayerVariables.DYE_POTENTIAL_DAILY_EXP, dailyExp);
}
public int getDyePotentialDailyExp()
{
return getVariables().getInt(PlayerVariables.DYE_POTENTIAL_DAILY_EXP, 0);
}
public void setDyePotentialenchantStep(int enchantlvl)
{
getVariables().set(PlayerVariables.DYE_POTENTIAL_DAILY_LVL, enchantlvl);
}
public int getDyePotentialenchantStep()
{
return getVariables().getInt(PlayerVariables.DYE_POTENTIAL_DAILY_LVL, 0);
}
/**
* @return map of all henna base stats bonus
*/
@@ -9788,7 +9901,7 @@ public class Player extends Playable
getSubClasses().remove(classIndex);
try (Connection con = DatabaseFactory.getConnection();
PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNAS);
PreparedStatement deleteHennas = con.prepareStatement(DELETE_CHAR_HENNA);
PreparedStatement deleteShortcuts = con.prepareStatement(DELETE_CHAR_SHORTCUTS);
PreparedStatement deleteSkillReuse = con.prepareStatement(DELETE_SKILL_SAVE);
PreparedStatement deleteSkills = con.prepareStatement(DELETE_CHAR_SKILLS);
@@ -10062,7 +10175,7 @@ public class Player extends Playable
sendPacket(new EtcStatusUpdate(this));
for (int i = 0; i < 3; i++)
{
_henna[i] = null;
_hennaPoten[i] = null;
}
restoreHenna();

View File

@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
/**
* @author UnAfraid

View File

@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.events.impl.creature.player;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.IBaseEvent;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
/**
* @author UnAfraid

View File

@@ -0,0 +1,70 @@
/*
* 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.item.henna;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.model.skill.Skill;
/**
* @author Serenitty
*/
public class DyePotential
{
private final int _id;
private final int _slotId;
private final int _skillId;
private final Skill[] _skills;
private final int _maxSkillLevel;
public DyePotential(int id, int slotId, int skillId, int maxSkillLevel)
{
_id = id;
_slotId = slotId;
_skillId = skillId;
_skills = new Skill[maxSkillLevel];
for (int i = 1; i <= maxSkillLevel; i++)
{
_skills[i - 1] = SkillData.getInstance().getSkill(skillId, i);
}
_maxSkillLevel = maxSkillLevel;
}
public int getId()
{
return _id;
}
public int getSlotId()
{
return _slotId;
}
public int getSkillId()
{
return _skillId;
}
public Skill getSkill(int level)
{
return _skills[level - 1];
}
public int getMaxSkillLevel()
{
return _maxSkillLevel;
}
}

View File

@@ -0,0 +1,60 @@
/*
* 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.item.henna;
import java.util.Map;
import org.l2jmobius.gameserver.model.holders.ItemHolder;
/**
* @author Serenitty
*/
public class DyePotentialFee
{
private final int _step;
private final ItemHolder _item;
private final int _dailyCount;
private final Map<Integer, Double> _enchantExp;
public DyePotentialFee(int step, ItemHolder item, int dailyCount, Map<Integer, Double> enchantExp)
{
_step = step;
_item = item;
_dailyCount = dailyCount;
_enchantExp = enchantExp;
}
public int getStep()
{
return _step;
}
public ItemHolder getItem()
{
return _item;
}
public int getDailyCount()
{
return _dailyCount;
}
public Map<Integer, Double> getEnchantExp()
{
return _enchantExp;
}
}

View File

@@ -14,15 +14,15 @@
* 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.item;
package org.l2jmobius.gameserver.model.item.henna;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.l2jmobius.gameserver.enums.ClassId;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.skill.Skill;
import org.l2jmobius.gameserver.model.stats.BaseStat;
@@ -34,6 +34,7 @@ public class Henna
{
private final int _dyeId;
private final int _dyeItemId;
private final int _patternLevel;
private final Map<BaseStat, Integer> _baseStats = new HashMap<>();
private final int _wearFee;
private final int _wearCount;
@@ -41,12 +42,13 @@ public class Henna
private final int _cancelCount;
private final int _duration;
private final List<Skill> _skills;
private final List<ClassId> _wearClass;
private final List<Integer> _wearClass;
public Henna(StatSet set)
{
_dyeId = set.getInt("dyeId");
_dyeItemId = set.getInt("dyeItemId");
_patternLevel = set.getInt("patternLevel", -1);
_baseStats.put(BaseStat.STR, set.getInt("str", 0));
_baseStats.put(BaseStat.CON, set.getInt("con", 0));
_baseStats.put(BaseStat.DEX, set.getInt("dex", 0));
@@ -147,25 +149,30 @@ public class Henna
/**
* @return the list with the allowed classes to wear this dye.
*/
public List<ClassId> getAllowedWearClass()
public List<Integer> getAllowedWearClass()
{
return _wearClass;
}
/**
* @param classId the class trying to wear this dye.
* @param c the class trying to wear this dye.
* @return {@code true} if the player is allowed to wear this dye, {@code false} otherwise.
*/
public boolean isAllowedClass(ClassId classId)
public boolean isAllowedClass(Player c)
{
return _wearClass.contains(classId);
return _wearClass.contains(c.getClassId().level());
}
/**
* @param wearClassIds the list of classes that can wear this dye.
*/
public void setWearClassIds(List<ClassId> wearClassIds)
public void setWearClassIds(List<Integer> wearClassIds)
{
_wearClass.addAll(wearClassIds);
}
}
public int getPatternLevel()
{
return _patternLevel;
}
}

View File

@@ -0,0 +1,86 @@
/*
* 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.item.henna;
/**
* @author Serenitty
*/
public class HennaPoten
{
private Henna _henna;
private int _potenId;
private int _enchantLevel = 1;
private int _enchantExp;
public HennaPoten()
{
}
public void setHenna(Henna henna)
{
_henna = henna;
}
public Henna getHenna()
{
return _henna;
}
public void setPotenId(int val)
{
_potenId = val;
}
public int getPotenId()
{
return _potenId;
}
public void setEnchantLevel(int val)
{
_enchantLevel = val;
}
public int getEnchantLevel()
{
return _enchantLevel;
}
public void setEnchantExp(int val)
{
_enchantExp = val;
}
public int getEnchantExp()
{
return _enchantExp;
}
public boolean isPotentialAvailable()
{
return (_henna != null) && (_henna.getPatternLevel() > 0);
}
public int getActiveStep()
{
if (!isPotentialAvailable())
{
return 0;
}
return Math.min(_enchantLevel, _henna.getPatternLevel());
}
}

View File

@@ -273,6 +273,9 @@ public enum Stat
// Magic Lamp
MAGIC_LAMP_EXP_RATE("magicLampExpRate"),
// Henna
HENNA_SLOTS_AVAILABLE("hennaSlots"),
// Souls
MAX_SOULS("maxSouls"),

View File

@@ -78,6 +78,14 @@ public class PlayerVariables extends AbstractVariables
public static final String STAT_WIT = "STAT_WIT";
public static final String STAT_MEN = "STAT_MEN";
public static final String CLAN_JOIN_TIME = "CLAN_JOIN_TIME";
public static final String HENNA1_DURATION = "HENNA1_DURATION";
public static final String HENNA2_DURATION = "HENNA2_DURATION";
public static final String HENNA3_DURATION = "HENNA3_DURATION";
public static final String HENNA4_DURATION = "HENNA4_DURATION";
public static final String DYE_POTENTIAL_DAILY_STEP = "DYE_POTENTIAL_DAILY_STEP";
public static final String DYE_POTENTIAL_DAILY_COUNT = "DYE_POTENTIAL_DAILY_COUNT";
public static final String DYE_POTENTIAL_DAILY_EXP = "DYE_POTENTIAL_DAILY_EXP";
public static final String DYE_POTENTIAL_DAILY_LVL = "DYE_POTENTIAL_DAILY_LVL";
private final int _objectId;

View File

@@ -99,6 +99,12 @@ import org.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMenteeAdd
import org.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMentorCancel;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMentorList;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaCompose;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaEquip;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaList;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaPotenEnchant;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaPotenSelect;
import org.l2jmobius.gameserver.network.clientpackets.newhenna.RequestNewHennaUnequip;
import org.l2jmobius.gameserver.network.clientpackets.pet.ExEvolvePet;
import org.l2jmobius.gameserver.network.clientpackets.pet.ExPetEquipItem;
import org.l2jmobius.gameserver.network.clientpackets.pet.ExPetUnequipItem;
@@ -707,12 +713,12 @@ public enum ExIncomingPackets implements IIncomingPackets<GameClient>
EX_WORLDCASTLEWAR_HOST_CASTLE_SIEGE_RANKING_INFO(0x215, null, ConnectionState.IN_GAME),
EX_WORLDCASTLEWAR_CASTLE_SIEGE_RANKING_INFO(0x216, null, ConnectionState.IN_GAME),
EX_WORLDCASTLEWAR_SIEGE_MAINBATTLE_HUD_INFO(0x217, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_LIST(0x218, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_EQUIP(0x219, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_UNEQUIP(0x21A, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_POTEN_SELECT(0x21B, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_POTEN_ENCHANT(0x21C, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_COMPOSE(0x21D, null, ConnectionState.IN_GAME),
EX_NEW_HENNA_LIST(0x218, RequestNewHennaList::new, ConnectionState.IN_GAME),
EX_NEW_HENNA_EQUIP(0x219, RequestNewHennaEquip::new, ConnectionState.IN_GAME),
EX_NEW_HENNA_UNEQUIP(0x21A, RequestNewHennaUnequip::new, ConnectionState.IN_GAME),
EX_NEW_HENNA_POTEN_SELECT(0x21B, RequestNewHennaPotenSelect::new, ConnectionState.IN_GAME),
EX_NEW_HENNA_POTEN_ENCHANT(0x21C, RequestNewHennaPotenEnchant::new, ConnectionState.IN_GAME),
EX_NEW_HENNA_COMPOSE(0x21D, RequestNewHennaCompose::new, ConnectionState.IN_GAME),
EX_REQUEST_INVITE_PARTY(0x21E, null, ConnectionState.IN_GAME),
EX_ITEM_USABLE_LIST(0x21F, null, ConnectionState.IN_GAME),
EX_PACKETREADCOUNTPERSECOND(0x220, null, ConnectionState.IN_GAME),

View File

@@ -123,10 +123,10 @@ public enum IncomingPackets implements IIncomingPackets<GameClient>
REQUEST_SEND_FRIEND_MSG(0x6B, RequestSendFriendMsg::new, ConnectionState.IN_GAME),
REQUEST_SHOW_MINI_MAP(0x6C, RequestShowMiniMap::new, ConnectionState.IN_GAME),
REQUEST_RECORD_INFO(0x6E, null, ConnectionState.IN_GAME),
REQUEST_HENNA_EQUIP(0x6F, RequestHennaEquip::new, ConnectionState.IN_GAME),
REQUEST_HENNA_EQUIP(0x6F, null, ConnectionState.IN_GAME),
REQUEST_HENNA_REMOVE_LIST(0x70, RequestHennaRemoveList::new, ConnectionState.IN_GAME),
REQUEST_HENNA_ITEM_REMOVE_INFO(0x71, RequestHennaItemRemoveInfo::new, ConnectionState.IN_GAME),
REQUEST_HENNA_REMOVE(0x72, RequestHennaRemove::new, ConnectionState.IN_GAME),
REQUEST_HENNA_REMOVE(0x72, null, ConnectionState.IN_GAME),
REQUEST_ACQUIRE_SKILL_INFO(0x73, RequestAcquireSkillInfo::new, ConnectionState.IN_GAME),
SEND_BYPASS_BUILD_CMD(0x74, SendBypassBuildCmd::new, ConnectionState.IN_GAME),
REQUEST_MOVE_TO_LOCATION_IN_VEHICLE(0x75, RequestMoveToLocationInVehicle::new, ConnectionState.IN_GAME),

View File

@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.HennaData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.PacketLogger;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@@ -48,7 +48,7 @@ public class RequestHennaItemInfo implements IClientIncomingPacket
return;
}
final Henna henna = HennaData.getInstance().getHenna(_symbolId);
final Henna henna = HennaData.getInstance().getHennaByDyeId(_symbolId);
if (henna == null)
{
if (_symbolId != 0)

View File

@@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.network.clientpackets;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.HennaData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.PacketLogger;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;

View File

@@ -0,0 +1,54 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaPotenCompose;
/**
* @author Index, Serenitty
*/
public class RequestNewHennaCompose implements IClientIncomingPacket
{
@SuppressWarnings("unused")
private int _slotOneIndex;
private int _slotOneItemId;
private int _slotTwoItemId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_slotOneIndex = packet.readC();
_slotOneItemId = packet.readC();
_slotTwoItemId = packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final Player player = client.getPlayer();
if (player == null)
{
return;
}
player.sendPacket(new NewHennaPotenCompose(_slotTwoItemId, _slotOneItemId, true));
}
}

View File

@@ -14,32 +14,36 @@
* 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;
package org.l2jmobius.gameserver.network.clientpackets.newhenna;
import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.HennaData;
import org.l2jmobius.gameserver.enums.PlayerCondOverride;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.item.instance.Item;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.PacketLogger;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.HennaEquipList;
import org.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaEquip;
import org.l2jmobius.gameserver.util.Util;
/**
* @author Zoey76
* @author Index, Serenitty
*/
public class RequestHennaEquip implements IClientIncomingPacket
public class RequestNewHennaEquip implements IClientIncomingPacket
{
private int _slotId;
private int _symbolId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_slotId = packet.readC();
_symbolId = packet.readD();
return true;
}
@@ -60,38 +64,49 @@ public class RequestHennaEquip implements IClientIncomingPacket
if (player.getHennaEmptySlots() == 0)
{
player.sendPacket(SystemMessageId.YOU_HAVE_NO_FREE_PATTERN_SLOTS);
player.sendPacket(ActionFailed.STATIC_PACKET);
PacketLogger.warning(player + ": Invalid Henna error 0 Id " + _symbolId + _slotId);
player.sendPacket(SystemMessageId.YOU_CANNOT_MAKE_A_PATTERN);
client.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
final Henna henna = HennaData.getInstance().getHenna(_symbolId);
final Item item = player.getInventory().getItemByObjectId(_symbolId);
if (item == null)
{
player.sendPacket(ActionFailed.STATIC_PACKET);
player.sendPacket(new NewHennaEquip(_slotId, 0, false));
return;
}
final Henna henna = HennaData.getInstance().getHennaByItemId(item.getId());
if (henna == null)
{
PacketLogger.warning("Invalid Henna Id: " + _symbolId + " from " + player);
player.sendPacket(ActionFailed.STATIC_PACKET);
PacketLogger.warning(player + ": Invalid Henna SymbolId " + _symbolId + _slotId + item.getTemplate());
client.sendPacket(ActionFailed.STATIC_PACKET);
player.sendPacket(SystemMessageId.YOU_CANNOT_MAKE_A_PATTERN);
return;
}
final long _count = player.getInventory().getInventoryItemCount(henna.getDyeItemId(), -1);
if (henna.isAllowedClass(player.getClassId()) && (_count >= henna.getWearCount()) && (player.getAdena() >= henna.getWearFee()) && player.addHenna(henna))
final long count = player.getInventory().getInventoryItemCount(henna.getDyeItemId(), -1);
if (henna.isAllowedClass(player) && (count >= henna.getWearCount()) && (player.getAdena() >= henna.getWearFee()) && player.addHenna(_slotId, henna))
{
player.destroyItemByItemId("Henna", henna.getDyeItemId(), henna.getWearCount(), player, true);
player.getInventory().reduceAdena("Henna", henna.getWearFee(), player, player.getLastFolkNPC());
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(player.getInventory().getAdenaInstance());
player.sendInventoryUpdate(iu);
player.sendPacket(new HennaEquipList(player));
player.sendPacket(new NewHennaEquip(_slotId, henna.getDyeId(), true));
player.sendPacket(SystemMessageId.PATTERN_ADDED);
}
else
{
player.sendPacket(SystemMessageId.YOU_CANNOT_MAKE_A_PATTERN);
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !henna.isAllowedClass(player.getClassId()))
if (!player.canOverrideCond(PlayerCondOverride.ITEM_CONDITIONS) && !henna.isAllowedClass(player))
{
Util.handleIllegalPlayerAction(player, "Exploit attempt: Character " + player.getName() + " of account " + player.getAccountName() + " tryed to add a forbidden henna.", Config.DEFAULT_PUNISH);
}
player.sendPacket(ActionFailed.STATIC_PACKET);
PacketLogger.warning(player + ": Invalid Henna error 2 " + _symbolId + _slotId + item.getTemplate());
client.sendPacket(ActionFailed.STATIC_PACKET);
}
}
}

View File

@@ -0,0 +1,47 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaList;
/**
* @author Index, Serenitty
*/
public class RequestNewHennaList implements IClientIncomingPacket
{
@Override
public boolean read(GameClient client, PacketReader packet)
{
return true;
}
@Override
public void run(GameClient client)
{
final Player player = client.getPlayer();
if (player == null)
{
return;
}
player.sendPacket(new NewHennaList(player));
}
}

View File

@@ -0,0 +1,113 @@
/*
* 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.newhenna;
import java.util.Map.Entry;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.data.xml.HennaPatternPotentialData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.henna.DyePotentialFee;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaPotenEnchant;
/**
* @author Index, Serenitty
*/
public class RequestNewHennaPotenEnchant implements IClientIncomingPacket
{
private int _slotId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_slotId = packet.readC();
return true;
}
@Override
public void run(GameClient client)
{
final Player player = client.getPlayer();
if (player == null)
{
return;
}
if ((_slotId < 1) || (_slotId > 4))
{
return;
}
int dailyStep = player.getDyePotentialDailyStep();
final DyePotentialFee currentFee = HennaPatternPotentialData.getInstance().getFee(dailyStep);
int dailyCount = player.getDyePotentialDailyCount();
if ((currentFee == null) || (dailyCount <= 0))
{
return;
}
if (!player.destroyItemByItemId(getClass().getSimpleName(), currentFee.getItem().getId(), currentFee.getItem().getCount(), player, true))
{
return;
}
dailyCount -= 1;
if ((dailyCount <= 0) && (dailyStep != HennaPatternPotentialData.getInstance().getMaxPotenEnchantStep()))
{
dailyStep += 1;
final DyePotentialFee newFee = HennaPatternPotentialData.getInstance().getFee(dailyStep);
if (newFee != null)
{
dailyCount = newFee.getDailyCount();
}
player.setDyePotentialDailyCount(dailyCount);
player.setDyePotentialDailyStep(dailyStep);
}
else
{
player.setDyePotentialDailyCount(dailyCount);
}
double totalChance = 0;
double random = Rnd.nextDouble() * 100;
for (Entry<Integer, Double> entry : currentFee.getEnchantExp().entrySet())
{
totalChance += entry.getValue();
if (random <= totalChance)
{
final HennaPoten poten = player.getHennaPoten(_slotId);
final int increase = entry.getKey();
int newEnchantExp = poten.getEnchantExp() + increase;
final int tatooExpNeeded = HennaPatternPotentialData.getInstance().getExpForLevel(poten.getEnchantLevel());
if (newEnchantExp >= tatooExpNeeded)
{
newEnchantExp -= tatooExpNeeded;
if (poten.getEnchantLevel() < HennaPatternPotentialData.getInstance().getMaxPotenLevel())
{
poten.setEnchantLevel(poten.getEnchantLevel() + 1);
player.applyDyePotenSkills();
}
}
poten.setEnchantExp(newEnchantExp);
player.sendPacket(new NewHennaPotenEnchant(_slotId, poten.getEnchantLevel(), poten.getEnchantExp(), dailyStep, dailyCount, poten.getActiveStep(), true));
return;
}
}
}
}

View File

@@ -0,0 +1,70 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.data.xml.HennaPatternPotentialData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.henna.DyePotential;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaPotenSelect;
/**
* @author Index, Serenitty
*/
public class RequestNewHennaPotenSelect implements IClientIncomingPacket
{
private int _slotId;
private int _potenId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_slotId = packet.readC();
_potenId = packet.readD();
return true;
}
@Override
public void run(GameClient client)
{
final Player player = client.getPlayer();
if (player == null)
{
return;
}
if ((_slotId < 1) || (_slotId > player.getHennaPotenList().length))
{
return;
}
final DyePotential potential = HennaPatternPotentialData.getInstance().getPotential(_potenId);
final HennaPoten hennaPoten = player.getHennaPoten(_slotId);
if ((potential == null) || (potential.getSlotId() != _slotId))
{
player.sendPacket(new NewHennaPotenSelect(_slotId, _potenId, hennaPoten.getActiveStep(), false));
return;
}
hennaPoten.setPotenId(_potenId);
player.sendPacket(new NewHennaPotenSelect(_slotId, _potenId, hennaPoten.getActiveStep(), true));
player.applyDyePotenSkills();
}
}

View File

@@ -14,27 +14,29 @@
* 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;
package org.l2jmobius.gameserver.network.clientpackets.newhenna;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.PacketLogger;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import org.l2jmobius.gameserver.network.serverpackets.newhenna.NewHennaUnequip;
/**
* @author Zoey76
* @author Index, Serenitty
*/
public class RequestHennaRemove implements IClientIncomingPacket
public class RequestNewHennaUnequip implements IClientIncomingPacket
{
private int _symbolId;
private int _slotId;
@Override
public boolean read(GameClient client, PacketReader packet)
{
_symbolId = packet.readD();
_slotId = packet.readC();
return true;
}
@@ -50,34 +52,31 @@ public class RequestHennaRemove implements IClientIncomingPacket
if (!client.getFloodProtectors().canPerformTransaction())
{
player.sendPacket(ActionFailed.STATIC_PACKET);
player.sendPacket(new NewHennaUnequip(_slotId, 0));
return;
}
Henna henna;
boolean found = false;
for (int i = 1; i <= 3; i++)
if ((_slotId == 1) || (_slotId == 2) || (_slotId == 3) || (_slotId == 4))
{
henna = player.getHenna(i);
if ((henna != null) && (henna.getDyeId() == _symbolId))
henna = player.getHenna(_slotId);
if (player.getAdena() >= henna.getCancelFee())
{
if (player.getAdena() >= henna.getCancelFee())
{
player.removeHenna(i);
}
else
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
player.sendPacket(ActionFailed.STATIC_PACKET);
}
found = true;
break;
player.removeHenna(_slotId);
player.sendPacket(new NewHennaUnequip(_slotId, 1));
}
else
{
player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
player.sendPacket(ActionFailed.STATIC_PACKET);
player.sendPacket(new NewHennaUnequip(_slotId, 0));
}
}
// TODO: Test.
if (!found)
else
{
PacketLogger.warning(getClass().getSimpleName() + ": " + player + " requested Henna Draw remove without any henna.");
player.sendPacket(ActionFailed.STATIC_PACKET);
player.sendPacket(new NewHennaUnequip(_slotId, 0));
}
}
}

View File

@@ -21,7 +21,7 @@ import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.model.stats.BaseStat;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -32,12 +32,12 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
public class GMHennaInfo implements IClientOutgoingPacket
{
private final Player _player;
private final List<Henna> _hennas = new ArrayList<>();
private final List<HennaPoten> _hennas = new ArrayList<>();
public GMHennaInfo(Player player)
{
_player = player;
for (Henna henna : _player.getHennaList())
for (HennaPoten henna : _player.getHennaPotenList())
{
if (henna != null)
{
@@ -60,9 +60,9 @@ public class GMHennaInfo implements IClientOutgoingPacket
packet.writeH(0); // equip CHA
packet.writeD(3); // Slots
packet.writeD(_hennas.size()); // Size
for (Henna henna : _hennas)
for (HennaPoten henna : _hennas)
{
packet.writeD(henna.getDyeId());
packet.writeD(henna.getPotenId());
packet.writeD(1);
}
packet.writeD(0);

View File

@@ -21,7 +21,7 @@ import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.data.xml.HennaData;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
@@ -35,7 +35,7 @@ public class HennaEquipList implements IClientOutgoingPacket
public HennaEquipList(Player player)
{
_player = player;
_hennaEquipList = HennaData.getInstance().getHennaList(player.getClassId());
_hennaEquipList = HennaData.getInstance().getHennaList(player);
}
public HennaEquipList(Player player, List<Henna> list)
@@ -61,7 +61,7 @@ public class HennaEquipList implements IClientOutgoingPacket
packet.writeD(henna.getDyeItemId()); // item Id of the dye
packet.writeQ(henna.getWearCount()); // amount of dyes required
packet.writeQ(henna.getWearFee()); // amount of Adena required
packet.writeD(henna.isAllowedClass(_player.getClassId()) ? 1 : 0); // meet the requirement or not
packet.writeD(henna.isAllowedClass(_player) ? 1 : 0); // meet the requirement or not
// packet.writeD(0); // Does not exist in Classic.
}
}

View File

@@ -21,7 +21,8 @@ import java.util.List;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.model.stats.BaseStat;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -37,8 +38,9 @@ public class HennaInfo implements IClientOutgoingPacket
public HennaInfo(Player player)
{
_player = player;
for (Henna henna : _player.getHennaList())
for (HennaPoten hennaPoten : _player.getHennaPotenList())
{
final Henna henna = hennaPoten.getHenna();
if (henna != null)
{
_hennas.add(henna);
@@ -63,7 +65,7 @@ public class HennaInfo implements IClientOutgoingPacket
for (Henna henna : _hennas)
{
packet.writeD(henna.getDyeId());
packet.writeD(henna.isAllowedClass(_player.getClassId()) ? 1 : 0);
packet.writeD(henna.isAllowedClass(_player) ? 1 : 0);
}
packet.writeD(0); // Premium Slot Dye ID
packet.writeD(0); // Premium Slot Dye Time Left

View File

@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.stats.BaseStat;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -44,7 +44,7 @@ public class HennaItemDrawInfo implements IClientOutgoingPacket
packet.writeD(_henna.getDyeItemId()); // item id of dye
packet.writeQ(_henna.getWearCount()); // total amount of dye require
packet.writeQ(_henna.getWearFee()); // total amount of Adena require to draw symbol
packet.writeD(_henna.isAllowedClass(_player.getClassId()) ? 1 : 0); // able to draw or not 0 is false and 1 is true
packet.writeD(_henna.isAllowedClass(_player) ? 1 : 0); // able to draw or not 0 is false and 1 is true
packet.writeQ(_player.getAdena());
packet.writeD(_player.getINT()); // current INT
packet.writeH(_player.getINT() + _player.getHennaValue(BaseStat.INT)); // equip INT

View File

@@ -18,7 +18,7 @@ package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.stats.BaseStat;
import org.l2jmobius.gameserver.network.OutgoingPackets;
@@ -44,7 +44,7 @@ public class HennaItemRemoveInfo implements IClientOutgoingPacket
packet.writeD(_henna.getDyeItemId()); // item id of dye
packet.writeQ(_henna.getCancelCount()); // total amount of dye require
packet.writeQ(_henna.getCancelFee()); // total amount of Adena require to remove symbol
packet.writeD(_henna.isAllowedClass(_player.getClassId()) ? 1 : 0); // able to remove or not
packet.writeD(_henna.isAllowedClass(_player) ? 1 : 0); // able to remove or not
packet.writeQ(_player.getAdena());
packet.writeD(_player.getINT()); // current INT
packet.writeH(_player.getINT() - _player.getHennaValue(BaseStat.INT)); // equip INT

View File

@@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.Henna;
import org.l2jmobius.gameserver.network.OutgoingPackets;
/**
@@ -26,6 +25,7 @@ import org.l2jmobius.gameserver.network.OutgoingPackets;
*/
public class HennaRemoveList implements IClientOutgoingPacket
{
@SuppressWarnings("unused")
private final Player _player;
public HennaRemoveList(Player player)
@@ -37,20 +37,20 @@ public class HennaRemoveList implements IClientOutgoingPacket
public boolean write(PacketWriter packet)
{
OutgoingPackets.HENNA_UNEQUIP_LIST.writeId(packet);
packet.writeQ(_player.getAdena());
packet.writeD(3); // seems to be max size
packet.writeD(3 - _player.getHennaEmptySlots());
for (Henna henna : _player.getHennaList())
{
if (henna != null)
{
packet.writeD(henna.getDyeId());
packet.writeD(henna.getDyeItemId());
packet.writeQ(henna.getCancelCount());
packet.writeQ(henna.getCancelFee());
packet.writeD(0);
}
}
// packet.writeQ(_player.getAdena());
// packet.writeD(3); // seems to be max size
// packet.writeD(3 - _player.getHennaEmptySlots());
// for (Henna henna : _player.getHennaList())
// {
// if (henna != null)
// {
// packet.writeD(henna.getDyeId());
// packet.writeD(henna.getDyeItemId());
// packet.writeQ(henna.getCancelCount());
// packet.writeQ(henna.getCancelFee());
// packet.writeD(0);
// }
// }
return true;
}
}

View File

@@ -0,0 +1,49 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaEquip implements IClientOutgoingPacket
{
private final int _slotId;
private final int _hennaId;
private final boolean _success;
public NewHennaEquip(int slotId, int hennaId, boolean success)
{
_slotId = slotId;
_hennaId = hennaId;
_success = success;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_EQUIP.writeId(packet);
packet.writeC(_slotId);
packet.writeD(_hennaId);
packet.writeD(_success ? 1 : 0);
return true;
}
}

View File

@@ -0,0 +1,69 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.item.henna.Henna;
import org.l2jmobius.gameserver.model.item.henna.HennaPoten;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaList implements IClientOutgoingPacket
{
private final HennaPoten[] _hennaId;
private final int _activeslots;
private final int _dailyStep;
private final int _dailyCount;
@SuppressWarnings("unused")
private final int _enchantExp;
public NewHennaList(Player player)
{
_dailyStep = player.getDyePotentialDailyStep();
_dailyCount = player.getDyePotentialDailyCount();
_hennaId = player.getHennaPotenList();
_activeslots = player.getAvailableHennaSlots();
_enchantExp = player.getDyePotentialDailyExp();
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_LIST.writeId(packet);
packet.writeH(_dailyStep);
packet.writeH(_dailyCount);
packet.writeD(_hennaId.length);
for (int i = 1; i <= _hennaId.length; i++)
{
final HennaPoten hennaPoten = _hennaId[i - 1];
final Henna henna = _hennaId[i - 1].getHenna();
int isactiveStep = hennaPoten.getActiveStep();
packet.writeD(henna != null ? henna.getDyeId() : 0x00);
packet.writeD(isactiveStep == 0 ? 0 : hennaPoten.getPotenId());
packet.writeC(_activeslots);
packet.writeH(hennaPoten.getEnchantLevel());
packet.writeD(hennaPoten.getEnchantExp());
packet.writeH(isactiveStep);
}
return true;
}
}

View File

@@ -0,0 +1,48 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaPotenCompose implements IClientOutgoingPacket
{
private final int _resultHennaId;
private final int _resultItemId;
private final boolean _success;
public NewHennaPotenCompose(int resultHennaId, int resultItemId, boolean success)
{
_resultHennaId = resultHennaId;
_resultItemId = resultItemId;
_success = success;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_COMPOSE.writeId(packet);
packet.writeD(_resultHennaId);
packet.writeD(_resultItemId);
packet.writeC(_success ? 1 : 0);
return true;
}
}

View File

@@ -0,0 +1,60 @@
/*
* 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.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaPotenEnchant implements IClientOutgoingPacket
{
private final int _slotId;
private final int _enchantStep;
private final int _enchantExp;
private final int _dailyStep;
private final int _dailyCount;
private final int _activeStep;
private final boolean _success;
public NewHennaPotenEnchant(int slotId, int enchantStep, int enchantExp, int dailyStep, int dailyCount, int activeStep, boolean success)
{
_slotId = slotId;
_enchantStep = enchantStep;
_enchantExp = enchantExp;
_dailyStep = dailyStep;
_dailyCount = dailyCount;
_activeStep = activeStep;
_success = success;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_POTEN_ENCHANT.writeId(packet);
packet.writeC(_slotId);
packet.writeH(_enchantStep);
packet.writeD(_enchantExp);
packet.writeH(_dailyStep);
packet.writeH(_dailyCount);
packet.writeH(_activeStep);
packet.writeC(_success ? 1 : 0);
return true;
}
}

View File

@@ -0,0 +1,51 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.serverpackets.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaPotenSelect implements IClientOutgoingPacket
{
private final int _slotId;
private final int _potenId;
private final int _activeStep;
private final boolean _success;
public NewHennaPotenSelect(int slotId, int potenId, int activeStep, boolean success)
{
_slotId = slotId;
_potenId = potenId;
_activeStep = activeStep;
_success = success;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_POTEN_SELECT.writeId(packet);
packet.writeC(_slotId);
packet.writeD(_potenId);
packet.writeH(_activeStep);
packet.writeC(_success ? 1 : 0);
return true;
}
}

View File

@@ -0,0 +1,45 @@
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.l2jmobius.gameserver.network.serverpackets.newhenna;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
/**
* @author Index, Serenitty
*/
public class NewHennaUnequip implements IClientOutgoingPacket
{
private final int _slotId;
private final int _success;
public NewHennaUnequip(int slotId, int success)
{
_slotId = slotId;
_success = success;
}
@Override
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_NEW_HENNA_UNEQUIP.writeId(packet);
packet.writeC(_slotId);
packet.writeC(_success);
return true;
}
}

View File

@@ -136,7 +136,7 @@ Frost Lord: https://eu.4game.com/patchnotes/lineage2essence/329/
-Frost Lord castle
Battle Chronicle: https://eu.4game.com/patchnotes/lineage2essence/353/
-Client support
-New henna pattern potential system
Customs:
-Newbie Helper NPC location info