Adapted appearance stone rework to all branches.

This commit is contained in:
MobiusDev
2017-11-20 02:22:09 +00:00
parent 029878f7b8
commit d4b385cffb
112 changed files with 83636 additions and 41736 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/items.xsd">
<item id="25700" name="Maid Costume Appearance Stone" additionalName="Top-grade / Debuff Reflect" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Debuff Reflect + 10%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -10,12 +13,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26880" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25701" name="Maid Costume Appearance Stone" additionalName="Top-grade / Damage Reflect Resistance" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Debuff Reflect Resistance + 15%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -23,12 +33,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26881" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25702" name="Maid Costume Appearance Stone" additionalName="Top-grade / Ranged Resistance" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Bow/Crossbow Resistance + 10%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -36,12 +53,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26882" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25703" name="Maid Costume Appearance Stone" additionalName="Top-grade / P. Def. Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, P. Def. + 10%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -49,12 +73,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26883" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25704" name="Maid Costume Appearance Stone" additionalName="Top-grade / M. Def. Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, M. Def. + 10%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -62,12 +93,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26884" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25705" name="Maid Costume Appearance Stone" additionalName="Top-grade / Attribute Resistance" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Attribute Resistance + 15. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -75,12 +113,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26885" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25706" name="Maid Costume Appearance Stone" additionalName="Top-grade / Received Heal Amount Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Received Heal Amount + 15%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -88,12 +133,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26886" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25707" name="Maid Costume Appearance Stone" additionalName="Top-grade / Max. HP Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Max. HP + 15%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -101,12 +153,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26887" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25708" name="Maid Costume Appearance Stone" additionalName="Top-grade / Max. MP Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Max. MP + 10%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -114,12 +173,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26888" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25709" name="Maid Costume Appearance Stone" additionalName="Top-grade / Max CP Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Max. CP + 15%. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -127,12 +193,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26889" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25710" name="Maid Costume Appearance Stone" additionalName="Top-grade / Speed Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Speed + 15. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -140,12 +213,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26890" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25711" name="Maid Costume Appearance Stone" additionalName="Top-grade / HP Recovery Bonus Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, HP Recovery Bonus + 16. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -153,12 +233,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26891" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25712" name="Maid Costume Appearance Stone" additionalName="Top-grade / MP Recovery Bonus Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, MP Recovery Bonus + 8. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -166,12 +253,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26892" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25713" name="Maid Costume Appearance Stone" additionalName="Top-grade / Evasion Increase" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, P./M. Evasion + 8. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -179,12 +273,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26893" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25714" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 15" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 15. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -192,12 +293,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26894" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25715" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 16" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 16. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -205,12 +313,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26895" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25716" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 17" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 17. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -218,12 +333,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26896" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25717" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 18" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 18. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -231,12 +353,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26897" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25718" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 19" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 19. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -244,12 +373,19 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26898" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25719" name="Maid Costume Appearance Stone" additionalName="Top-grade / Option 20" type="EtcItem">
<!-- Changes the appearance of the entire armor into that of a Maid Costume. Tops and one-pieces only. Modified armor can be restored to their original appearance with a Restoration Stone. When modified, Top-grade / Option + 20. -->
<set name="icon" val="BranchSys3.icon1.g_scrl_change_chest" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="is_freightable" val="false" />
<set name="is_stackable" val="true" />
<set name="is_clan_depositable" val="false" />
<set name="is_mailable" val="false" />
<set name="is_tradable" val="false" />
@@ -257,8 +393,12 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_private_storeable" val="false" />
<set name="commissionItemType" val="OTHER_ITEM" />
<set name="default_action" val="SKILL_REDUCE" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<skills>
<skill id="26899" level="1" /> <!-- Maid Costume Appearance Stone -->
</skills>
</item>
<item id="25720" name="Visual Enchant Stone" additionalName="Low-grade / Debuff Reflect" type="EtcItem">
<!-- Talk to the Fantasy Isle Paddy to trade Male/Female Swimsuit, Formal Wear, Santa Outfit, Beach/Alluring/Seductive Swimsuit, and Maid Costume into Debuff Reflect + 3% Appearance Stone. -->

View File

@@ -1452,6 +1452,9 @@
<set name="is_commissionable" val="false" />
<set name="etcitem_type" val="SHAPE_SHIFTING_AM_FIXED" />
<set name="is_stackable" val="true" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="default_action" val="SKILL_REDUCE" />
</item>
<item id="26274" name="Halloween Weapon Appearance Stone" type="EtcItem">
<!-- Changes the appearance of a weapon to that of a Halloween weapon. Can be used on shields and sigils. Note: Appearance may reset when the Change Weapon skill is used. -->
@@ -1460,6 +1463,9 @@
<set name="is_sellable" val="false" />
<set name="is_commissionable" val="false" />
<set name="is_stackable" val="true" />
<set name="immediate_effect" val="true" />
<set name="handler" val="Appearance" />
<set name="default_action" val="SKILL_REDUCE" />
</item>
<item id="26275" name="Halloween Shaper" type="Weapon">
<!-- Halloween weapon. -->

View File

@@ -95,6 +95,105 @@
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="visual" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="id" use="optional" />
<xs:attribute name="weaponType" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="NONE" />
<xs:enumeration value="SWORD" />
<xs:enumeration value="BLUNT" />
<xs:enumeration value="DAGGER" />
<xs:enumeration value="BOW" />
<xs:enumeration value="POLE" />
<xs:enumeration value="DUAL" />
<xs:enumeration value="ETC" />
<xs:enumeration value="FIST" />
<xs:enumeration value="DUALFIST" />
<xs:enumeration value="FISHINGROD" />
<xs:enumeration value="RAPIER" />
<xs:enumeration value="ANCIENTSWORD" />
<xs:enumeration value="CROSSBOW" />
<xs:enumeration value="FLAG" />
<xs:enumeration value="OWNTHING" />
<xs:enumeration value="DUALDAGGER" />
<xs:enumeration value="DUALBLUNT" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="handType" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="NONE" />
<xs:enumeration value="ONE_HANDED" />
<xs:enumeration value="TWO_HANDED" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="bodyPart" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="none" />
<xs:enumeration value="shirt" />
<xs:enumeration value="lbracelet" />
<xs:enumeration value="rbracelet" />
<xs:enumeration value="talisman" />
<xs:enumeration value="chest" />
<xs:enumeration value="fullarmor" />
<xs:enumeration value="head" />
<xs:enumeration value="hair" />
<xs:enumeration value="hairall" />
<xs:enumeration value="underwear" />
<xs:enumeration value="back" />
<xs:enumeration value="neck" />
<xs:enumeration value="legs" />
<xs:enumeration value="feet" />
<xs:enumeration value="gloves" />
<xs:enumeration value="chest,legs" />
<xs:enumeration value="belt" />
<xs:enumeration value="rhand" />
<xs:enumeration value="lhand" />
<xs:enumeration value="lrhand" />
<xs:enumeration value="rear;lear" />
<xs:enumeration value="rfinger;lfinger" />
<xs:enumeration value="brooch" />
<xs:enumeration value="brooch_jewel" />
<xs:enumeration value="onepiece" />
<xs:enumeration value="hair2" />
<xs:enumeration value="dhair" />
<xs:enumeration value="alldress" />
<xs:enumeration value="deco1" />
<xs:enumeration value="waist" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="magicType" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="NONE" />
<xs:enumeration value="MAGICAL" />
<xs:enumeration value="PHYISICAL" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="armorType" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="HEAVY" />
<xs:enumeration value="LIGHT" />
<xs:enumeration value="MAGIC" />
<xs:enumeration value="SIGIL" />
<xs:enumeration value="SHIELD" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:integer" name="id" use="required" />
<xs:attribute name="targetType" use="optional">
@@ -181,6 +280,9 @@
<xs:attribute name="armorType" use="optional">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="HEAVY" />
<xs:enumeration value="LIGHT" />
<xs:enumeration value="MAGIC" />
<xs:enumeration value="SIGIL" />
<xs:enumeration value="SHIELD" />
</xs:restriction>

View File

@@ -22,13 +22,13 @@ 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 com.l2jmobius.commons.util.IGameXmlReader;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
import com.l2jmobius.gameserver.model.items.type.CrystalType;
@@ -75,9 +75,6 @@ public class AppearanceItemData implements IGameXmlReader
@Override
public void parseDocument(Document doc, File f)
{
StatsSet set;
Node att;
NamedNodeMap attrs;
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("list".equalsIgnoreCase(n.getNodeName()))
@@ -86,15 +83,7 @@ public class AppearanceItemData implements IGameXmlReader
{
if ("appearance_stone".equalsIgnoreCase(d.getNodeName()))
{
attrs = d.getAttributes();
set = new StatsSet();
for (int i = 0; i < attrs.getLength(); i++)
{
att = attrs.item(i);
set.set(att.getNodeName(), att.getNodeValue());
}
final AppearanceStone stone = new AppearanceStone(set);
final AppearanceStone stone = new AppearanceStone(new StatsSet(parseAttributes(d)));
for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
{
switch (c.getNodeName())
@@ -129,6 +118,10 @@ public class AppearanceItemData implements IGameXmlReader
stone.addRaceNot(raceNot);
break;
}
case "visual":
{
stone.addVisualId(new AppearanceHolder(new StatsSet(parseAttributes(c))));
}
}
}
if (ItemTable.getInstance().getTemplate(stone.getId()) != null)
@@ -145,6 +138,11 @@ public class AppearanceItemData implements IGameXmlReader
}
}
public int getLoadedElementsCount()
{
return _stones.size();
}
public AppearanceStone getStone(int stone)
{
return _stones.get(stone);

View File

@@ -0,0 +1,85 @@
/*
* 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 com.l2jmobius.gameserver.model.holders;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceHandType;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceMagicType;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
import com.l2jmobius.gameserver.model.items.type.ArmorType;
import com.l2jmobius.gameserver.model.items.type.WeaponType;
/**
* @author Sdw
*/
public class AppearanceHolder
{
private final int _visualId;
private final WeaponType _weaponType;
private final ArmorType _armorType;
private final AppearanceHandType _handType;
private final AppearanceMagicType _magicType;
private final AppearanceTargetType _targetType;
private final Integer _bodyPart;
public AppearanceHolder(StatsSet set)
{
_visualId = set.getInt("id", 0);
_weaponType = set.getEnum("weaponType", WeaponType.class, WeaponType.NONE);
_armorType = set.getEnum("armorType", ArmorType.class, ArmorType.NONE);
_handType = set.getEnum("handType", AppearanceHandType.class, AppearanceHandType.NONE);
_magicType = set.getEnum("magicType", AppearanceMagicType.class, AppearanceMagicType.NONE);
_targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
_bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
}
public WeaponType getWeaponType()
{
return _weaponType;
}
public ArmorType getArmorType()
{
return _armorType;
}
public AppearanceHandType getHandType()
{
return _handType;
}
public AppearanceMagicType getMagicType()
{
return _magicType;
}
public AppearanceTargetType getTargetType()
{
return _targetType;
}
public int getBodyPart()
{
return _bodyPart;
}
public int getVisualId()
{
return _visualId;
}
}

View File

@@ -24,10 +24,14 @@ import java.util.List;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.enums.Race;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.items.type.ArmorType;
import com.l2jmobius.gameserver.model.items.type.CrystalType;
import com.l2jmobius.gameserver.model.items.type.WeaponType;
import com.l2jmobius.gameserver.network.SystemMessageId;
/**
* @author UnAfraid
@@ -48,6 +52,7 @@ public class AppearanceStone
private List<Integer> _bodyParts;
private List<Race> _races;
private List<Race> _racesNot;
private List<AppearanceHolder> _allVisualIds;
public AppearanceStone(StatsSet set)
{
@@ -61,15 +66,35 @@ public class AppearanceStone
_handType = set.getEnum("handType", AppearanceHandType.class, AppearanceHandType.NONE);
_magicType = set.getEnum("magicType", AppearanceMagicType.class, AppearanceMagicType.NONE);
// No grade items cannot change appearance, because client doesn't have No-Grade restoration stones.
final CrystalType crystalType = set.getEnum("crystalType", CrystalType.class, CrystalType.NONE);
if (crystalType == CrystalType.NONE)
final AppearanceTargetType targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
if (targetType != AppearanceTargetType.NONE)
{
for (CrystalType cryType : CrystalType.values())
addTargetType(targetType);
}
// No grade items cannot change appearance, because client doesn't have No-Grade restoration stones.
final CrystalType crystalType = set.getEnum("grade", CrystalType.class, null);
// If no crystal type is defined, we must add all defaults.
if (crystalType == null)
{
switch (targetType)
{
if ((cryType != CrystalType.NONE) && (cryType != CrystalType.EVENT))
case ACCESSORY:
case ALL:
{
addCrystalType(cryType);
addCrystalType(CrystalType.NONE);
}
case WEAPON:
case ARMOR:
{
for (CrystalType cryType : CrystalType.values())
{
if ((cryType != CrystalType.NONE) && (cryType != CrystalType.EVENT))
{
addCrystalType(cryType);
}
}
}
}
}
@@ -78,12 +103,6 @@ public class AppearanceStone
addCrystalType(crystalType);
}
final AppearanceTargetType targetType = set.getEnum("targetType", AppearanceTargetType.class, AppearanceTargetType.NONE);
if (targetType != AppearanceTargetType.NONE)
{
addTargetType(targetType);
}
final int bodyPart = ItemTable.SLOTS.get(set.getString("bodyPart", "none"));
if (bodyPart != L2Item.SLOT_NONE)
{
@@ -185,6 +204,20 @@ public class AppearanceStone
_bodyParts.add(part);
}
public void addVisualId(AppearanceHolder appearanceHolder)
{
if (_allVisualIds == null)
{
_allVisualIds = new ArrayList<>();
}
_allVisualIds.add(appearanceHolder);
}
public List<AppearanceHolder> getVisualIds()
{
return _allVisualIds != null ? _allVisualIds : Collections.emptyList();
}
public List<Integer> getBodyParts()
{
return _bodyParts != null ? _bodyParts : Collections.emptyList();
@@ -217,4 +250,297 @@ public class AppearanceStone
{
return _racesNot != null ? _racesNot : Collections.emptyList();
}
/**
* @param player the actor requesting to use this appearance.
* @param targetItem the item to be modified with this appearance.
* @return {@code true} if the item is valid for appearance change, {@code false} otherwise.
*/
public boolean checkConditions(L2PcInstance player, L2ItemInstance targetItem)
{
if (targetItem == null)
{
return false;
}
if (getTargetTypes().isEmpty())
{
return false;
}
if (targetItem.isEquipped() && (getRacesNot().contains(player.getRace()) || (!getRaces().isEmpty() && !getRaces().contains(player.getRace()))))
{
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AN_EQUIPPED_ITEM_INTO_THE_APPEARANCE_OF_AN_UNEQUIPPABLE_ITEM_PLEASE_CHECK_RACE_GENDER_RESTRICTIONS_YOU_CAN_MODIFY_THE_APPEARANCE_IF_YOU_UNEQUIP_THE_ITEM);
return false;
}
switch (getType())
{
case RESTORE:
{
if (targetItem.getVisualId() == 0)
{
player.sendPacket(SystemMessageId.YOU_CANNOT_RESTORE_ITEMS_THAT_HAVE_NOT_BEEN_MODIFIED);
return false;
}
if ((targetItem.isWeapon() && !getTargetTypes().contains(AppearanceTargetType.WEAPON)) || (targetItem.isArmor() && !getTargetTypes().contains(AppearanceTargetType.ARMOR)) || (targetItem.isEtcItem() && !getTargetTypes().contains(AppearanceTargetType.ACCESSORY)))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
if (((targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIR) || (targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIR2) || (targetItem.getItem().getBodyPart() == L2Item.SLOT_HAIRALL)) && !getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
break;
}
default:
{
// Seems like in retail item with already changed appearance, can be changed again without being restored.
final AppearanceTargetType targetType = getTargetTypes().get(0);
switch (targetType)
{
case NONE:
{
return false;
}
case WEAPON:
{
if (!targetItem.isWeapon())
{
player.sendPacket(SystemMessageId.WEAPONS_ONLY);
return false;
}
if (targetItem.getItem().getCrystalType() == CrystalType.NONE)
{
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NO_GRADE_ITEMS);
return false;
}
break;
}
case ARMOR:
{
if (!targetItem.isArmor())
{
player.sendPacket(SystemMessageId.ARMOR_ONLY);
return false;
}
if (targetItem.getItem().getCrystalType() == CrystalType.NONE)
{
player.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NO_GRADE_ITEMS);
return false;
}
break;
}
case ACCESSORY:
{
if ((targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIR) && (targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIR2) && (targetItem.getItem().getBodyPart() != L2Item.SLOT_HAIRALL))
{
player.sendPacket(SystemMessageId.HAIR_ACCESSORIES_ONLY);
return false;
}
break;
}
case ALL:
{
if (!getCrystalTypes().isEmpty() && !getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
if (findVisualChange(targetItem) == null)
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
return true;
}
}
break;
}
}
if (!getCrystalTypes().isEmpty() && !getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
if (targetItem.isArmor() && !getBodyParts().isEmpty() && !getBodyParts().contains(targetItem.getItem().getBodyPart()))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
if (getWeaponType() != WeaponType.NONE)
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != getWeaponType()))
{
player.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_USED_AS_AN_APPEARANCE_WEAPON);
return false;
}
switch (getHandType())
{
case ONE_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
break;
}
case TWO_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
break;
}
}
switch (getMagicType())
{
case MAGICAL:
{
if (!targetItem.getItem().isMagicWeapon())
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
break;
}
case PHYISICAL:
{
if (targetItem.getItem().isMagicWeapon())
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
}
}
}
if (getArmorType() != ArmorType.NONE)
{
switch (getArmorType())
{
case SHIELD:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
break;
}
case SIGIL:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return false;
}
}
}
}
return true;
}
public AppearanceHolder findVisualChange(L2ItemInstance targetItem)
{
for (AppearanceHolder holder : _allVisualIds)
{
if (targetItem.isArmor() && (holder.getBodyPart() != 0) && (targetItem.getItem().getBodyPart() != holder.getBodyPart()))
{
continue;
}
if (holder.getWeaponType() != WeaponType.NONE)
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != holder.getWeaponType()))
{
continue;
}
switch (holder.getHandType())
{
case ONE_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
{
continue;
}
break;
}
case TWO_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
{
continue;
}
break;
}
}
switch (holder.getMagicType())
{
case MAGICAL:
{
if (!targetItem.getItem().isMagicWeapon())
{
continue;
}
break;
}
case PHYISICAL:
{
if (targetItem.getItem().isMagicWeapon())
{
continue;
}
}
}
}
if (holder.getArmorType() != ArmorType.NONE)
{
switch (holder.getArmorType())
{
case SHIELD:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
{
continue;
}
break;
}
case SIGIL:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
{
continue;
}
}
}
}
return holder;
}
return null;
}
}

View File

@@ -26,13 +26,11 @@ import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.items.type.ArmorType;
import com.l2jmobius.gameserver.model.items.type.WeaponType;
import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingExtractionItemResult;
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
/**
* @author UnAfraid
@@ -63,175 +61,100 @@ public class RequestExTryToPutShapeShiftingEnchantSupportItem implements IClient
if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
return;
}
final PcInventory inventory = player.getInventory();
final L2ItemInstance targetItem = inventory.getItemByObjectId(_targetItemObjId);
final L2ItemInstance extracItem = inventory.getItemByObjectId(_extracItemObjId);
final L2ItemInstance extractItem = inventory.getItemByObjectId(_extracItemObjId);
L2ItemInstance stone = request.getAppearanceStone();
if ((targetItem == null) || (extracItem == null) || (stone == null))
if ((targetItem == null) || (extractItem == null) || (stone == null))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!extracItem.getItem().isAppearanceable())
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()) || (extractItem.getOwnerId() != player.getObjectId()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
if (!extractItem.getItem().isAppearanceable())
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
return;
}
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
stone = inventory.getItemByObjectId(stone.getObjectId());
if (stone == null)
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
if (appearanceStone == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if ((appearanceStone.getType() == AppearanceType.RESTORE) || (appearanceStone.getType() == AppearanceType.FIXED))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (extracItem.getVisualId() > 0)
if (extractItem.getVisualId() > 0)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
client.sendPacket(SystemMessageId.YOU_CANNOT_EXTRACT_FROM_A_MODIFIED_ITEM);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (appearanceStone.getWeaponType() != WeaponType.NONE)
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
if (appearanceStone.getWeaponType() != WeaponType.NONE)
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
switch (appearanceStone.getHandType())
{
case ONE_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case TWO_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
}
switch (appearanceStone.getMagicType())
{
case MAGICAL:
{
if (!targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case PHYISICAL:
{
if (targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
}
}
if (appearanceStone.getArmorType() != ArmorType.NONE)
{
switch (appearanceStone.getArmorType())
{
case SHIELD:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case SIGIL:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
}
}
if (extracItem.getOwnerId() != player.getObjectId())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
request.setAppearanceExtractItem(extracItem);
if ((extractItem.getItemType() != targetItem.getItemType()) || (extractItem.getId() == targetItem.getId()) || (extractItem.getObjectId() == targetItem.getObjectId()))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
return;
}
if ((extractItem.getItem().getBodyPart() != targetItem.getItem().getBodyPart()) && ((extractItem.getItem().getBodyPart() != L2Item.SLOT_FULL_ARMOR) || (targetItem.getItem().getBodyPart() != L2Item.SLOT_CHEST)))
{
player.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
return;
}
if (extractItem.getItem().getCrystalType().isGreater(targetItem.getItem().getCrystalType()))
{
client.sendPacket(SystemMessageId.YOU_CANNOT_EXTRACT_FROM_ITEMS_THAT_ARE_HIGHER_GRADE_THAN_ITEMS_TO_BE_MODIFIED);
player.sendPacket(ExPutShapeShiftingExtractionItemResult.FAILED);
return;
}
if (!appearanceStone.checkConditions(player, targetItem))
{
player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
return;
}
request.setAppearanceExtractItem(extractItem);
client.sendPacket(ExPutShapeShiftingExtractionItemResult.SUCCESS);
}
}

View File

@@ -22,13 +22,8 @@ import com.l2jmobius.gameserver.enums.ItemLocation;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.actor.request.ShapeShiftingItemRequest;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.items.type.ArmorType;
import com.l2jmobius.gameserver.model.items.type.WeaponType;
import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
@@ -77,13 +72,20 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
return;
}
if (!targetItem.getItem().isAppearanceable())
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!targetItem.getItem().isAppearanceable())
{
client.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_MODIFIED_OR_RESTORED);
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
return;
}
if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
@@ -91,8 +93,7 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
return;
}
stone = inventory.getItemByObjectId(stone.getObjectId());
if (stone == null)
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
@@ -107,158 +108,9 @@ public class RequestExTryToPutShapeShiftingTargetItem implements IClientIncoming
return;
}
if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
if (!appearanceStone.checkConditions(player, targetItem))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
// TODO: Handle hair accessory!
// if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
{
// client.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_OR_RESTORE_NOGRADE_ITEMS);
// return;
}
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY)) // accessory tempfix
{
if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
{
client.sendPacket(SystemMessageId.ITEM_GRADES_DO_NOT_MATCH);
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
if (appearanceStone.getTargetTypes().isEmpty())
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
{
if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
{
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
{
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
{
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
if (appearanceStone.getWeaponType() != WeaponType.NONE)
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
switch (appearanceStone.getHandType())
{
case ONE_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
break;
}
case TWO_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
break;
}
}
switch (appearanceStone.getMagicType())
{
case MAGICAL:
{
if (!targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
break;
}
case PHYISICAL:
{
if (targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
}
}
}
if (appearanceStone.getArmorType() != ArmorType.NONE)
{
switch (appearanceStone.getArmorType())
{
case SHIELD:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
break;
}
case SIGIL:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
client.sendPacket(SystemMessageId.THIS_ITEM_DOES_NOT_MEET_REQUIREMENTS);
return;
}
}
}
}
if (targetItem.getOwnerId() != player.getObjectId())
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
player.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
return;
}

View File

@@ -22,14 +22,12 @@ import com.l2jmobius.gameserver.enums.InventorySlot;
import com.l2jmobius.gameserver.enums.ItemLocation;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.actor.request.ShapeShiftingItemRequest;
import com.l2jmobius.gameserver.model.holders.AppearanceHolder;
import com.l2jmobius.gameserver.model.itemcontainer.PcInventory;
import com.l2jmobius.gameserver.model.items.L2Item;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceTargetType;
import com.l2jmobius.gameserver.model.items.appearance.AppearanceType;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.model.items.type.ArmorType;
import com.l2jmobius.gameserver.model.items.type.WeaponType;
import com.l2jmobius.gameserver.model.variables.ItemVariables;
import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -37,8 +35,6 @@ import com.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
import com.l2jmobius.gameserver.network.serverpackets.ExAdenaInvenCount;
import com.l2jmobius.gameserver.network.serverpackets.ExUserInfoEquipSlot;
import com.l2jmobius.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExPutShapeShiftingTargetItemResult;
import com.l2jmobius.gameserver.network.serverpackets.appearance.ExShapeShiftingResult;
/**
@@ -68,7 +64,7 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
if (player.isInStoreMode() || player.isInCraftMode() || player.isProcessingRequest() || player.isProcessingTransaction() || (request == null))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
client.sendPacket(SystemMessageId.YOU_CANNOT_USE_THIS_SYSTEM_DURING_TRADING_PRIVATE_STORE_AND_WORKSHOP_SETUP);
return;
}
@@ -79,36 +75,36 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
if ((targetItem == null) || (stone == null))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (stone.getOwnerId() != player.getObjectId())
if ((stone.getOwnerId() != player.getObjectId()) || (targetItem.getOwnerId() != player.getObjectId()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!targetItem.getItem().isAppearanceable())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(SystemMessageId.THIS_ITEM_CANNOT_BE_MODIFIED_OR_RESTORED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if ((targetItem.getItemLocation() != ItemLocation.INVENTORY) && (targetItem.getItemLocation() != ItemLocation.PAPERDOLL))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
stone = inventory.getItemByObjectId(stone.getObjectId());
if (stone == null)
if ((stone = inventory.getItemByObjectId(stone.getObjectId())) == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
@@ -116,223 +112,100 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
final AppearanceStone appearanceStone = AppearanceItemData.getInstance().getStone(stone.getId());
if (appearanceStone == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (((appearanceStone.getType() != AppearanceType.RESTORE) && (targetItem.getVisualId() > 0)) || ((appearanceStone.getType() == AppearanceType.RESTORE) && (targetItem.getVisualId() == 0)))
if (!appearanceStone.checkConditions(player, targetItem))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
// TODO: Handle hair accessory!
// if (!targetItem.isEtcItem() && (targetItem.getItem().getCrystalType() == CrystalType.NONE))
{
// client.sendPacket(ExShapeShiftingResult.FAILED);
// player.removeRequest(ShapeShiftingItemRequest.class.getName());
// return;
}
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY)) // accessory tempfix
{
if (!appearanceStone.getCrystalTypes().isEmpty() && !appearanceStone.getCrystalTypes().contains(targetItem.getItem().getCrystalType()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
if (appearanceStone.getTargetTypes().isEmpty())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!appearanceStone.getTargetTypes().contains(AppearanceTargetType.ALL))
{
if (targetItem.isWeapon() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.WEAPON))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
else if (targetItem.isArmor() && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ARMOR) && !appearanceStone.getTargetTypes().contains(AppearanceTargetType.ACCESSORY))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
else if (targetItem.isArmor() && !appearanceStone.getBodyParts().isEmpty() && !appearanceStone.getBodyParts().contains(targetItem.getItem().getBodyPart()))
{
client.sendPacket(ExPutShapeShiftingTargetItemResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
if (appearanceStone.getWeaponType() != WeaponType.NONE)
{
if (!targetItem.isWeapon() || (targetItem.getItemType() != appearanceStone.getWeaponType()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
switch (appearanceStone.getHandType())
{
case ONE_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_R_HAND) != L2Item.SLOT_R_HAND)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case TWO_HANDED:
{
if ((targetItem.getItem().getBodyPart() & L2Item.SLOT_LR_HAND) != L2Item.SLOT_LR_HAND)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
}
switch (appearanceStone.getMagicType())
{
case MAGICAL:
{
if (!targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case PHYISICAL:
{
if (targetItem.getItem().isMagicWeapon())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
}
}
if (appearanceStone.getArmorType() != ArmorType.NONE)
{
switch (appearanceStone.getArmorType())
{
case SHIELD:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SHIELD))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
break;
}
case SIGIL:
{
if (!targetItem.isArmor() || (targetItem.getItemType() != ArmorType.SIGIL))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
}
}
}
final L2ItemInstance extracItem = request.getAppearanceExtractItem();
final L2ItemInstance extractItem = request.getAppearanceExtractItem();
int extracItemId = 0;
if ((appearanceStone.getType() != AppearanceType.RESTORE) && (appearanceStone.getType() != AppearanceType.FIXED))
{
if (extracItem == null)
if (extractItem == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!targetItem.getItem().isAppearanceable())
if (extractItem.getOwnerId() != player.getObjectId())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if ((extracItem.getItemLocation() != ItemLocation.INVENTORY) && (extracItem.getItemLocation() != ItemLocation.PAPERDOLL))
if (!extractItem.getItem().isAppearanceable())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (!extracItem.isEtcItem() && (targetItem.getItem().getCrystalType().ordinal() <= extracItem.getItem().getCrystalType().ordinal()))
if ((extractItem.getItemLocation() != ItemLocation.INVENTORY) && (extractItem.getItemLocation() != ItemLocation.PAPERDOLL))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (extracItem.getVisualId() > 0)
if (extractItem.getItem().getCrystalType().isGreater(targetItem.getItem().getCrystalType()))
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (extracItem.getOwnerId() != player.getObjectId())
if (extractItem.getVisualId() > 0)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
extracItemId = extracItem.getId();
if ((extractItem.getItemType() != targetItem.getItemType()) || (extractItem.getId() == targetItem.getId()) || (extractItem.getObjectId() == targetItem.getObjectId()))
{
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if ((extractItem.getItem().getBodyPart() != targetItem.getItem().getBodyPart()) && ((extractItem.getItem().getBodyPart() != L2Item.SLOT_FULL_ARMOR) || (targetItem.getItem().getBodyPart() != L2Item.SLOT_CHEST)))
{
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
extracItemId = extractItem.getId();
}
if (targetItem.getOwnerId() != player.getObjectId())
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
final long cost = appearanceStone.getCost();
long cost = appearanceStone.getCost();
if (cost > player.getAdena())
{
client.sendPacket(SystemMessageId.YOU_CANNOT_MODIFY_AS_YOU_DO_NOT_HAVE_ENOUGH_ADENA);
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (stone.getCount() < 1L)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
client.sendPacket(ExShapeShiftingResult.CLOSE);
player.removeRequest(ShapeShiftingItemRequest.class);
return;
}
if (appearanceStone.getType() == AppearanceType.NORMAL)
{
if (inventory.destroyItem(getClass().getSimpleName(), extracItem, 1, player, this) == null)
if (inventory.destroyItem(getClass().getSimpleName(), extractItem, 1, player, this) == null)
{
client.sendPacket(ExShapeShiftingResult.FAILED);
player.removeRequest(ShapeShiftingItemRequest.class);
@@ -341,7 +214,7 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
}
inventory.destroyItem(getClass().getSimpleName(), stone, 1, player, this);
player.reduceAdena(getClass().getSimpleName(), cost, extracItem, true);
player.reduceAdena(getClass().getSimpleName(), cost, extractItem, false);
switch (appearanceStone.getType())
{
@@ -353,18 +226,32 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
}
case NORMAL:
{
targetItem.setVisualId(extracItem.getId());
targetItem.setVisualId(extractItem.getId());
break;
}
case BLESSED:
{
targetItem.setVisualId(extracItem.getId());
targetItem.setVisualId(extractItem.getId());
break;
}
case FIXED:
{
targetItem.setVisualId(appearanceStone.getVisualId());
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
if (appearanceStone.getVisualIds().isEmpty())
{
extracItemId = appearanceStone.getVisualId();
targetItem.setVisualId(appearanceStone.getVisualId());
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
}
else
{
final AppearanceHolder holder = appearanceStone.findVisualChange(targetItem);
if (holder != null)
{
extracItemId = holder.getVisualId();
targetItem.setVisualId(holder.getVisualId());
targetItem.getVariables().set(ItemVariables.VISUAL_APPEARANCE_STONE_ID, appearanceStone.getId());
}
}
break;
}
}
@@ -376,17 +263,13 @@ public class RequestShapeShiftingItem implements IClientIncomingPacket
}
targetItem.getVariables().storeMe();
if (appearanceStone.getCost() > 0)
{
client.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_SPENT_S1_ON_A_SUCCESSFUL_APPEARANCE_MODIFICATION).addLong(cost));
}
else
{
client.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_S_APPEARANCE_MODIFICATION_HAS_FINISHED).addItemName(targetItem.getDisplayId()));
}
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(targetItem);
if (extractItem != null)
{
iu.addModifiedItem(extractItem);
}
if (inventory.getItemByObjectId(stone.getObjectId()) == null)
{
iu.addRemovedItem(stone);

View File

@@ -27,8 +27,10 @@ public class ExShapeShiftingResult implements IClientOutgoingPacket
{
public static int RESULT_FAILED = 0x00;
public static int RESULT_SUCCESS = 0x01;
public static int RESULT_CLOSE = 0x02;
public static ExShapeShiftingResult FAILED = new ExShapeShiftingResult(RESULT_FAILED, 0, 0);
public static ExShapeShiftingResult CLOSE = new ExShapeShiftingResult(RESULT_CLOSE, 0, 0);
private final int _result;
private final int _targetItemId;