Compare commits

...

56 Commits

Author SHA1 Message Date
Cydh
4eaa33c221 Removed an attempt to copy file for import/item_package.txt 2021-11-10 05:38:06 +07:00
Cydh
d8b35cb2f5 Removed unnecessary changes part2 2021-11-10 05:37:12 +07:00
Cydh
0a32c1731a Removed unnecessary changes 2021-11-10 04:00:12 +07:00
Cydh
97af1d5c2c Removed unused item_package.txt 2021-11-10 03:54:03 +07:00
Cydh
d2ac0d96fc Added newline at EOF 2021-11-10 03:50:53 +07:00
Cydh
32b0b5ed18 Readded item_syntesis.hpp and item_syntesis.cpp to map-server filter 2021-11-02 08:14:07 +07:00
Cydh
4a2a2ab483 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2021-11-02 07:39:26 +07:00
Cydh
432dfd05f9 Some fixes to follow recent updates 2021-10-13 21:13:29 +07:00
Cydh
3369b00a79 Merge branch 'master' into feature/lapine_synthesis_and_upgrade
# Conflicts:
#	conf/msg_conf/map_msg.conf
#	db/re/item_db_usable.yml
#	db/re/item_package.txt
#	src/map/itemdb.hpp
#	src/map/script_constants.hpp
2021-10-13 14:10:05 +07:00
Atemo
667e9dd7cf Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2021-04-26 21:32:44 +02:00
Atemo
9ebdb0dec3 Corrected the rates of the boxes IG_Costume_Exchange_Box and IG_Shadow_Exchange_Box 2021-04-22 23:20:24 +02:00
Atemo
70feb94f30 Corrected the aegis item name in item_synthesis.yml and item_upgrade.yml
Updated data in item_synthesis.yml and item_upgrade.yml for existing box
2021-04-21 00:58:41 +02:00
Atemo
e188374f43 Replace the KRO name by the aegis items name 2021-04-19 19:45:29 +02:00
Atemo
bf9bcbe9f7 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2021-04-19 19:23:53 +02:00
aleos
c8a3b7dc16 Resolves some LGTM alerts 2020-12-03 08:29:08 -05:00
aleos
6d69a4dc46 Corrects an item name 2020-12-03 08:28:51 -05:00
aleos
72b57720f6 Resolves some compile issues 2020-12-02 13:59:46 -05:00
aleos
b4ef4db25f Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-12-02 13:57:08 -05:00
atemo
5e598936c1 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-10-31 21:29:10 +01:00
atemo
9dab8f91da Item txt to yaml 2020-10-31 02:59:00 +01:00
atemo
d79513402d Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-10-31 02:55:37 +01:00
atemo
89dc2df2ab Items updates
* Removed the items scripts of some etc stones (the item description mislead etc item for enchant stone item)
* Uncommented high item IDs
* Various correction of items
2020-10-07 18:13:09 +02:00
atemo
0dae6b4251 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-10-05 19:22:50 +02:00
aleos
de5bf08898 Remove pre-renewal calls from main 2020-09-15 08:54:52 -04:00
aleos
51bb52af2e Removes synthesis and upgrade from pre-renewal
* This feature isn't part of pre-renewal.
* Server owners can use the import feature if need be.
2020-09-15 08:54:12 -04:00
aleos
93cfc55118 Converts item ID to item name
* Converts the databases to utilize item names instead of their ID.
* Updates header of YAML files.
* Enables some 32bit items.
* Updates item names to match kRO.
* Removes some items that got duplicated during the merge to master.
* Fixes some minor left overs for t_itemid usage.
2020-09-14 14:15:12 -04:00
aleos
b44f0e66f4 Fixes packet header 2020-09-10 15:43:07 -04:00
aleos
2bf7e818b7 Another item group typo 2020-09-10 14:04:45 -04:00
aleos
22da4efed2 Item group typo 2020-09-10 13:57:07 -04:00
aleos
616ca96c92 Fixes a couple typos 2020-09-10 13:53:00 -04:00
aleos
480e6e75bd Corrects F_Lapine_Gray_Charcoal_Melee
* Fixes Random Option bonuses.
Thanks to @teededung!
2020-09-10 13:46:42 -04:00
aleos
a02e829d03 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-09-10 13:41:20 -04:00
aleos
30cb8fa9a2 Fixes some parsing issues 2020-06-19 12:33:42 -04:00
aleos
d13eed6cd8 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-06-19 11:18:13 -04:00
Cydh
be9fc60377 Added remove option for importing & item updates 2020-04-16 01:55:22 +07:00
aleos
4ef7888af9 Merge branch 'master' into feature/lapine_synthesis_and_upgrade 2020-03-27 09:38:37 -04:00
Cydh
50bda6a46c typo 2019-11-24 10:33:34 +07:00
Cydh
f41f65f437 Cleanup
* Changed `NeedRefine` in item_syntehsis.yml to `NeedRefineMin` and `NeedRefineMax` directly
* Removed lines with default value
2019-11-20 21:10:56 +07:00
Cydh
91fb8e8378 Fixed upgradeui and synthesisui atcommand 2019-11-12 11:05:22 +07:00
Cydh
c1c02048f9 * Typo fixed, thanks to @xEasycore
* Udpated item upgrade, added `NeedRefineMax`
2019-11-12 10:38:57 +07:00
Cydh
0368896510 Misc updates
* Updated atcommand doc
* Prevernt to use (at)refresh when Lapine UI is opened
2019-11-04 08:00:38 +07:00
Cydh
38a05e9b28 Fixed Gold Statue enchant script
* Thanks to @attackjom
2019-10-26 05:26:20 +07:00
Cydh
7c7e8885c1 Some cleanup
* Removed LapineUpgradeItem and LapineUpgradeIndex param
* Source and script doc updates
2019-10-08 09:30:20 +07:00
Cydh
dc0d74266b Item DB Updates 2019-09-28 08:12:42 +07:00
Cydh
70642d405f Item updates 2019-09-25 08:29:01 +07:00
Cydh
c56b4985da Item fixes
* Thanks to @attackjom
2019-09-22 08:19:33 +07:00
Cydh
c16cbc55ec Follow up 80218e99e26df77d95e674098ce03eccf4ff09a6 2019-09-20 17:58:28 +07:00
Cydh
80218e99e2 Act restriction on Lapine UI 2019-09-20 05:27:22 +07:00
Cydh
22c466ba65 Follow up
* Fixed random options for `F_Lapine_Gray_Charcoal_Range`, `F_Lapine_Gray_Charcoal_Magic`, and `F_Lapine_Gray_Charcoal_Melee`
* Another weight fixes
* And added some hat effects
2019-09-19 09:36:33 +07:00
Cydh Ramdh
7d9d112ec2
Apply suggestions from code review
Co-Authored-By: Atemo <Atemo@users.noreply.github.com>
2019-09-18 07:24:49 +07:00
Cydh
c8bd4dbf6a Item script corrections
* Thanks to @attackjom
2019-09-17 21:51:51 +07:00
Cydh
9e05ed3397 Follow up updates
* Correction on database entries
* Added missing entries for `F_Lapine_Magma_Essence`
* Thanks to @ecdarreola, @ssboyz
2019-09-17 18:05:23 +07:00
Cydh
fe16295762 Follow up 10f0ead08f82711135ee0d582e2ab905579380e0
* Some correction on parsing yaml block
2019-09-17 17:00:16 +07:00
Cydh
6abd8463b9 Follow up 600ff371c2f66be63f481337ea39fbad7f02cc58
* Corrected script function `F_Lapine_Shadow_Random_Mix`
* Corrected item script for `23780`
2019-09-16 11:12:16 +07:00
Cydh
600ff371c2 Follow up 10f0ead08f82711135ee0d582e2ab905579380e0
* Added missing script function `F_Lapine_Shadow_Random_Mix`
* Corrected `F_Lapine_Gold_Statue`usage
* Corrected `F_Lapine_Cursed_Blood` usage
* fixed some alerts
* Thanks to @ecdarreola, @Angelic234, @teededung
2019-09-16 10:54:25 +07:00
Cydh
10f0ead08f Lapine UI Features
* Features from LapineDdukDdakBox and LapineUpgradeBox
* Added db files: item_synthesis.yml, item_upgrade.yml
* Added script commands: upgradeui, synthesisui
* Supported & tested for clients: 2018-06-20e RagexeRE and 2018-06-21a RagexeRE
* Thanks to: @Lemongrass3110, Divine-pride.net
2019-09-15 23:13:36 +07:00
31 changed files with 12475 additions and 400 deletions

View File

@ -559,7 +559,8 @@
//541: %.0s%.0sSomeone got %s
542: '%s' stole %s's %s (chance: %0.02f%%)
//542: %.0s%.0sSomeone stole %s
// 543~548 are not used (previously @away messages)
543: Cannot use @refresh when Lapine UI is opened.
//544-548: free
// @autotrade
549: You should have a shop open to use @autotrade.
@ -874,7 +875,13 @@
// NoRODEX Mapflag
796: You cannot use RODEX on this map.
//797-899 free
// @reloadsynthesisdb
797: Item Synthesis database has been reloaded.
// @reloadupgradedb
798: Item Upgrade database has been reloaded.
//799-899 free
//------------------------------------
// More atcommands message

View File

@ -0,0 +1,39 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# 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/>.
#
###########################################################################
# Item Synthesis Database
###########################################################################
#
# Item Synthesis Settings
#
###########################################################################
# - Item # Item name of Synthesis Box
# NeedRefineMin # Minimum refine level needed for source item (Default: 0)
# NeedRefineMax # Maximum refine level needed for source item (Default: MAX_REFINE)
# SourceNeeded # Number of item sets (in SourceItem) that must be selected (Default: 1)
# SourceItem # List of required items
# - Item # Source item name
# Amount # Item amount that will be consumed (Default: 1)
# Remove # Remove this item from the list while importing (Default: false) (optional)
# Reward # Script executed on successful synthesis
# ClearSourceItem # Used to clear SourceItem list while importing (Default: false) (optional)
###########################################################################
Header:
Type: ITEM_SYNTHESIS_DB
Version: 1

View File

@ -0,0 +1,39 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# 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/>.
#
###########################################################################
# Item Upgrade Database
###########################################################################
#
# Item Upgrade Settings
#
###########################################################################
# - Item # Item name of Upgrade Box
# NeedRefineMin # Minimum refine level needed for target item (Default: 0)
# NeedRefineMax # Maximum refine level needed for target item (Default: MAX_REFINE)
# NeedOptionNumMin # Minimum random option that target item has (Default: 0)
# NotSocketEnchantItem # Target item must not have enchant stone (Default: true)
# TargetItem # List of possible item to be upgraded
# - Item # Target item name
# Remove # Remove this item from the list while importing (Default: false) (optional)
# Result # Script executed on successful upgrade
# ClearTargetItem # Used to clear TargetItem list while importing (Default: false) (optional)
###########################################################################
Header:
Type: ITEM_UPGRADE_DB
Version: 1

45
db/item_synthesis.yml Normal file
View File

@ -0,0 +1,45 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# 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/>.
#
###########################################################################
# Item Synthesis Database
###########################################################################
#
# Item Synthesis Settings
#
###########################################################################
# - Item # Item name of Synthesis Box
# NeedRefineMin # Minimum refine level needed for source item (Default: 0)
# NeedRefineMax # Maximum refine level needed for source item (Default: MAX_REFINE)
# SourceNeeded # Number of item sets (in SourceItem) that must be selected (Default: 1)
# SourceItem # List of required items
# - Item # Source item name
# Amount # Item amount that will be consumed (Default: 1)
# Remove # Remove this item from the list while importing (Default: false) (optional)
# Reward # Script executed on successful synthesis
# ClearSourceItem # Used to clear SourceItem list while importing (Default: false) (optional)
###########################################################################
Header:
Type: ITEM_SYNTHESIS_DB
Version: 1
Footer:
Imports:
- Path: db/re/item_synthesis.yml
Mode: Renewal
- Path: db/import/item_synthesis.yml

45
db/item_upgrade.yml Normal file
View File

@ -0,0 +1,45 @@
# This file is a part of rAthena.
# Copyright(C) 2020 rAthena Development Team
# https://rathena.org - https://github.com/rathena
#
# 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/>.
#
###########################################################################
# Item Upgrade Database
###########################################################################
#
# Item Upgrade Settings
#
###########################################################################
# - Item # Item name of Upgrade Box
# NeedRefineMin # Minimum refine level needed for target item (Default: 0)
# NeedRefineMax # Maximum refine level needed for target item (Default: MAX_REFINE)
# NeedOptionNumMin # Minimum random option that target item has (Default: 0)
# NotSocketEnchantItem # Target item must not have enchant stone (Default: true)
# TargetItem # List of possible item to be upgraded
# - Item # Target item name
# Remove # Remove this item from the list while importing (Default: false) (optional)
# Result # Script executed on successful upgrade
# ClearTargetItem # Used to clear TargetItem list while importing (Default: false) (optional)
###########################################################################
Header:
Type: ITEM_UPGRADE_DB
Version: 1
Footer:
Imports:
- Path: db/re/item_upgrade.yml
Mode: Renewal
- Path: db/import/item_upgrade.yml

View File

@ -5252,7 +5252,7 @@ Body:
bonus bAtkEle,Ele_Holy;
bonus3 bAutoSpell,"NPC_DRAGONFEAR",1,30;
- Id: 1298
AegisName: Shiver_Katar_K
AegisName: Shiver_Katar
Name: Katar Of Horror
Type: Weapon
SubType: Katar
@ -17716,7 +17716,7 @@ Body:
bonus2 bSkillCooldown,"SR_RAMPAGEBLASTER",-1000;
}
- Id: 1865
AegisName: Raging_Dragon_Fist
AegisName: Combo_Fist
Name: Raging Dragon Fist
Type: Weapon
SubType: Knuckle
@ -17745,7 +17745,7 @@ Body:
if (.@r >= 11)
bonus2 bSkillAtk,"CH_CHAINCRUSH",30;
- Id: 1866
AegisName: Dedicated_Bandage
AegisName: Asura_Bandage
Name: Dedicated Bandage
Type: Weapon
SubType: Knuckle
@ -21006,7 +21006,7 @@ Body:
bonus2 bSkillAtk,"WL_CRIMSONROCK",15;
}
- Id: 2048
AegisName: Aeon_Staff
AegisName: Iron_Staff
Name: Aeon Staff
Type: Weapon
SubType: 2hStaff
@ -21077,7 +21077,7 @@ Body:
bonus2 bMagicAtkEle,Ele_Water,.@val;
bonus2 bMagicAtkEle,Ele_Holy,.@val;
- Id: 2051
AegisName: Illusion_Survivor's_Staff
AegisName: Survival_Staff_IL
Name: Illusion Survivor's Staff
Type: Weapon
SubType: 2hStaff
@ -21183,7 +21183,7 @@ Body:
bonus2 bSkillCooldown,"WL_EARTHSTRAIN",-1000;
}
- Id: 2055
AegisName: Staff_of_Miracle
AegisName: Staff_Of_Miracle
Name: Staff of Miracle
Type: Weapon
SubType: 2hStaff
@ -21280,7 +21280,7 @@ Body:
bonus2 bSubSize,Size_All,25;
}
- Id: 2058
AegisName: Detecting_Staff
AegisName: Ein_BHSTAFF
Name: Detecting Staff
Type: Weapon
SubType: 2hStaff
@ -67876,7 +67876,7 @@ Body:
bonus2 bMagicAddEle,Ele_Wind,10;
}
- Id: 15280
AegisName: S_Cri_Hit_Armor
AegisName: S_CriticalHit_Armor
Name: Critical Hit Shadow Armor
Type: Shadowgear
Locations:
@ -68038,7 +68038,7 @@ Body:
bonus2 bAddEle,Ele_Wind,10;
}
- Id: 15348
AegisName: Illusion_Goibne_Armor
AegisName: Goibne_Armor_IL
Name: Illusion Goibne Armor
Type: Armor
Weight: 3500
@ -68211,7 +68211,7 @@ Body:
if (.@r>=9)
bonus bDef,50;
- Id: 15379
AegisName: Lava_Leather_Suit
AegisName: Lava_Leather_Suits
Name: Lava Leather Suit
Type: Armor
Buy: 20
@ -70743,7 +70743,7 @@ Body:
bonus3 bAutoSpell,"AB_JUDEX",max(2,getskilllv("AB_JUDEX")),50;
/* Unknow Rates */
- Id: 16096
AegisName: Bright_Pendulum
AegisName: Bright_Mace
Name: Bright Pendulum
Type: Weapon
SubType: Mace
@ -72075,7 +72075,7 @@ Body:
if (.@r>=11)
bonus2 bSkillCooldown,"WM_SEVERE_RAINSTORM",-2000;
- Id: 18174
AegisName: Illusion_Hunter_Bow
AegisName: Hunter_Bow_IL
Name: Illusion Hunter Bow
Type: Weapon
SubType: Bow
@ -72317,7 +72317,7 @@ Body:
bonus2 bSkillCooldown,"WM_SEVERE_RAINSTORM",-2000;
}
- Id: 18184
AegisName: Rapid_Fire
AegisName: Rapid_Fire_C_Bow
Name: Rapid Fire
Type: Weapon
SubType: Bow
@ -83914,7 +83914,7 @@ Body:
bonus2 bSkillAtk,"LG_OVERBRAND",.@dmg;
bonus bVariableCastrate,.@cast;
- Id: 19344
AegisName: Illusion_Hot_blooded_Headband
AegisName: Headband_Of_Power_IL
Name: Illusion Hot-blooded Headband
Type: Armor
Weight: 100
@ -83974,7 +83974,7 @@ Body:
bonus2 bMagicAddRace,RC_Formless,min(.@r-10,15);
}
- Id: 19366
AegisName: Illusion_Goibne_Helm
AegisName: Goibne_Helmet_IL
Name: Illusion Goibne Helm
Type: Armor
Weight: 1000
@ -84152,7 +84152,7 @@ Body:
if (getskilllv("GN_MANDRAGORA") == 5)
bonus2 bFixedCastrate,"GN_MANDRAGORA",-70;
- Id: 19396
AegisName: Racing_Cap_SG
AegisName: Racing_C_Star
Name: Racing Cap (Star Gladiator)
Type: Armor
Buy: 20
@ -84184,7 +84184,7 @@ Body:
if (.@r>=11)
autobonus3 "{ bonus2 bSkillAtk,\"SJ_SOLARBURST\",30; }",1000,10000,"SJ_PROMINENCEKICK";
- Id: 19397
AegisName: Racing_Cap_SL
AegisName: Racing_C_Soul
Name: Racing Cap (Soul Linker)
Type: Armor
Buy: 20
@ -84384,7 +84384,7 @@ Body:
if (.@r>=10)
bonus bIgnoreMdefRace,RC_All;
- Id: 19428
AegisName: Illusion_Morpheus's_Hood
AegisName: Morpheus_Hood_IL
Name: Illusion Morpheus's Hood
Type: Armor
Buy: 20
@ -97409,7 +97409,7 @@ Body:
if (.@r>=10)
bonus2 bSubEle,Ele_Water,100;
- Id: 20923
AegisName: Illusion_Goibne_Spaulders
AegisName: Goibne_Shoulder_IL
Name: Illusion Goibne Spaulders
Type: Armor
Weight: 1000
@ -97848,7 +97848,7 @@ Body:
bonus bVariableCastrate,-10;
}
- Id: 20948
AegisName: Illusion_Morpheus's_Shawl
AegisName: Morpheus_Shawl_IL
Name: Illusion Morpheus's Shawl
Type: Armor
Buy: 20
@ -99097,7 +99097,7 @@ Body:
bonus bUnbreakableWeapon;
}
- Id: 21050
AegisName: Illusion_Tae_Goo_Lyeon
AegisName: Taegoolyeon_IL
Name: Illusion Tae Goo Lyeon
Type: Weapon
SubType: 2hSword
@ -101764,7 +101764,7 @@ Body:
bonus bUseSPrate,-5;
}
- Id: 22190
AegisName: Illusion_Boots
AegisName: Boots_IL
Name: Illusion Boots
Type: Armor
Weight: 600
@ -101780,7 +101780,7 @@ Body:
bonus bCritical,(5*(.@r/3));
bonus bAspdRate,.@r;
- Id: 22192
AegisName: Illusion_Goibne's_Greaves
AegisName: Goibne_Boots_IL
Name: Illusion Goibne's Greaves
Type: Armor
Weight: 1200
@ -108269,7 +108269,7 @@ Body:
bonus bMatkRate,2;
}
- Id: 24399
AegisName: S_Immune_Athena_Shield
AegisName: S_ImmunedAthena_Shield
Name: Immune Athena Shadow Shield
Type: Shadowgear
Locations:
@ -108281,7 +108281,7 @@ Body:
bonus bMaxHP,.@r*10;
bonus bDef,50+20*(.@r/2);
- Id: 24400
AegisName: S_Hard_Champion_Shoes
AegisName: S_HardChamption_Shoes
Name: Hard Champion Shadow Shoes
Type: Shadowgear
Locations:
@ -108295,7 +108295,7 @@ Body:
bonus bMaxHPrate,.@r;
bonus bMaxSPrate,.@r;
- Id: 24401
AegisName: S_Kingbird_Ancient_Armor
AegisName: S_KingbirdAncient_Armor
Name: Kingbird Ancient Shadow Armor
Type: Shadowgear
Locations:
@ -108689,7 +108689,7 @@ Body:
bonus bMaxHP,.@r*10;
bonus2 bIgnoreMdefClassRate,Class_Normal,5+(.@r/2);
- Id: 24425
AegisName: S_Perfect_Size_Weapon
AegisName: S_PerfectSize_Weapon
Name: Perfect Size Shadow Weapon
Type: Shadowgear
Locations:
@ -108711,7 +108711,7 @@ Body:
bonus2 bMagicAddSize,Size_All,3;
}
- Id: 24426
AegisName: S_Perfect_Size_Armor
AegisName: S_PerfectSize_Armor
Name: Perfect Size Shadow Armor
Type: Shadowgear
Locations:
@ -114945,7 +114945,7 @@ Body:
bonus2 bMagicAtkEle,Ele_Water,5;
bonus2 bMagicAtkEle,Ele_Earth,5;
- Id: 26161
AegisName: Penitentia
AegisName: Ponitendtia
Name: Penitentia
Type: Weapon
SubType: Staff
@ -115831,7 +115831,7 @@ Body:
}
}
- Id: 28039
AegisName: Katar_of_Shiver
AegisName: Shiver_Katar_K
Name: Katar of Shiver
Type: Weapon
SubType: Katar
@ -115908,7 +115908,7 @@ Body:
bonus2 bAddRace,RC_DemiHuman,15;
}
- Id: 28042
AegisName: Ripper_Cross
AegisName: Reaper_Cross
Name: Ripper Cross
Type: Weapon
SubType: Katar
@ -117373,7 +117373,7 @@ Body:
bonus2 bSkillAtk,"RL_D_TAIL",15 + (.@r > 11 ? 15 : 0);
}
- Id: 28244
AegisName: Illusion_Gate_Keeper_DD
AegisName: Gate_KeeperDD_IL
Name: Illusion Gate Keeper DD
Type: Weapon
SubType: Shotgun
@ -117562,7 +117562,7 @@ Body:
}
}
- Id: 28254
AegisName: Illusion_Butcher
AegisName: Butcher_IL
Name: Illusion Butcher
Type: Weapon
SubType: Gatling
@ -120509,7 +120509,7 @@ Body:
bonus bVit,8;
bonus bInt,8;
- Id: 28602
AegisName: Demon_Hunting_Bible_K
AegisName: Demon_Hunting_Bible
Name: Demon Hunting Bible
Type: Weapon
SubType: Book
@ -120942,7 +120942,7 @@ Body:
bonus2 bMagicAddRace,RC_Demon,.@val;
bonus2 bMagicAddRace,RC_Undead,.@val;
- Id: 28626
AegisName: Illusion_Tablet
AegisName: Tablet_IL
Name: Illusion Tablet
Type: Weapon
SubType: Book
@ -121034,7 +121034,7 @@ Body:
}
}
- Id: 28630
AegisName: Exoricists_Bible_
AegisName: Demon_Hunting_Bible_K
Name: Exoricist's Bible
Type: Weapon
SubType: Book
@ -121138,7 +121138,7 @@ Body:
bonus2 bSkillAtk,"AB_DUPLELIGHT",30;
}
- Id: 28633
AegisName: Boltijin
AegisName: Boltigin
Name: Boltijin
Type: Weapon
SubType: Book
@ -121912,7 +121912,7 @@ Body:
bonus5 bAutoSpell,"SO_PSYCHIC_WAVE",3,50,BF_WEAPON|BF_SHORT,1;
}
- Id: 28745
AegisName: Illusion_Counter_Dagger
AegisName: Counter_Dagger_IL
Name: Illusion Counter Dagger
Type: Weapon
SubType: Dagger
@ -122068,7 +122068,7 @@ Body:
bonus5 bAutoSpell,"SO_PSYCHIC_WAVE",3,100,BF_SHORT|BF_WEAPON,1;
}
- Id: 28762
AegisName: Illusion_Bazerald
AegisName: Bazerald_IL
Name: Illusion Bazerald
Type: Weapon
SubType: Dagger
@ -125868,7 +125868,7 @@ Body:
EquipLevelMin: 1
View: 1675
- Id: 31332
AegisName: Khalitzburg_KN_Helm_BL
AegisName: C_Khalitzburg_Helm_BL
Name: C Black Khalitzburg Knight Helm
Type: Armor
Locations:
@ -125976,7 +125976,7 @@ Body:
EquipLevelMin: 1
View: 1335
- Id: 31380
AegisName: C_Crow
AegisName: C_Gossip_Raven
Name: C Crow
Type: Armor
Locations:
@ -127415,7 +127415,7 @@ Body:
EquipLevelMin: 1
View: 1786
- Id: 31566
AegisName: C_Stole_Of_Dominion
AegisName: C_Stall_Of_Dominions
Name: C Stole Of Dominion
Type: Armor
Locations:
@ -127694,7 +127694,7 @@ Body:
EquipLevelMin: 1
View: 1804
- Id: 31601
AegisName: C_Under_Rim_Glasses_Blue
AegisName: C_Under_Rim_Glasses_Bu
Name: C Under Rim Glasses Blue
Type: Armor
Locations:
@ -128183,7 +128183,7 @@ Body:
EquipLevelMin: 1
View: 1864
- Id: 31671
AegisName: Costume_Twin_Cannon
AegisName: C_Twin_Canon
Name: C Twin Cannon
Type: Armor
Locations:
@ -128510,7 +128510,7 @@ Body:
EquipLevelMin: 1
View: 1887
- Id: 31716
AegisName: Costume_Twinkling_Red_Eyes
AegisName: C_Blinking_Eyes_RD
Name: Costume Twinkling Red Eyes
Type: Armor
Locations:
@ -128648,7 +128648,7 @@ Body:
EquipLevelMin: 1
View: 1900
- Id: 31735
AegisName: Costume_Yawata_Seal
AegisName: C_FortunetellinSealed
Name: C Yawata Seal
Type: Armor
Locations:
@ -128954,7 +128954,7 @@ Body:
EquipLevelMin: 1
View: 1809
- Id: 31815
AegisName: Costume_Angola_Intention
AegisName: C_Angola_Intention
Name: C Angola Intention
Type: Armor
Locations:
@ -129930,7 +129930,7 @@ Body:
bonus2 bSkillAtk,"LG_SHIELDPRESS",20;
}
- Id: 32025
AegisName: Fortridge
AegisName: Fortrage
Name: Fortridge
Type: Weapon
SubType: 1hSpear
@ -130745,7 +130745,7 @@ Body:
bonus2 bSubRace,RC_Player_Human,5;
}
- Id: 32301
AegisName: Illusion_Gold_Lux
AegisName: Gold_Lux_IL
Name: Illusion Gold Lux
Type: Weapon
SubType: Revolver
@ -131352,7 +131352,7 @@ Body:
bonus2 bAddSize,Size_Medium,15;
}
- Id: 400053
AegisName: Morrigane's_Helm_IL
AegisName: Morrigane_Helm_IL
Name: Illusion Morrigane's Helm
Type: Armor
View: 257
@ -131525,7 +131525,7 @@ Body:
NoMail: true
NoAuction: true
- Id: 400078
AegisName: aegis_400078
AegisName: BioWeapon_Helm_RK
Name: Goral Crown
Type: Armor
View: 532
@ -131556,7 +131556,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400079
AegisName: aegis_400079
AegisName: BioWeapon_Helm_LG
Name: Trial Diadem
Type: Armor
View: 594
@ -131591,7 +131591,7 @@ Body:
bonus2 bMagicAddSize,Size_All,10;
}
- Id: 400094
AegisName: aegis_400094
AegisName: BioWeapon_Helm_WL
Name: Jade Crown
Type: Armor
View: 510
@ -131625,7 +131625,7 @@ Body:
bonus2 bMagicAtkEle,Ele_Fire,20;
}
- Id: 400095
AegisName: aegis_400095
AegisName: BioWeapon_Helm_SO
Name: Spinel Diadem
Type: Armor
View: 509
@ -131680,7 +131680,7 @@ Body:
bonus bBaseAtk,40;
}
- Id: 400098
AegisName: aegis_400098
AegisName: BioWeapon_Helm_NC
Name: Bull Crown
Type: Armor
View: 536
@ -131711,7 +131711,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400099
AegisName: aegis_400099
AegisName: BioWeapon_Helm_GN
Name: Taurus Diadem
Type: Armor
View: 535
@ -131758,7 +131758,7 @@ Body:
NoMail: true
NoAuction: true
- Id: 400116
AegisName: aegis_400116
AegisName: BioWeapon_Helm_RA
Name: Celestial Jewel Crown
Type: Armor
View: 574
@ -131789,7 +131789,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400117
AegisName: aegis_400117
AegisName: BioWeapon_Helm_WM
Name: Libra Crown
Type: Armor
View: 593
@ -131824,7 +131824,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400118
AegisName: aegis_400118
AegisName: BioWeapon_Helm_AB
Name: Saint Crown
Type: Armor
View: 560
@ -131859,7 +131859,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400119
AegisName: aegis_400119
AegisName: BioWeapon_Helm_SR
Name: Lion Crown
Type: Armor
View: 565
@ -131890,7 +131890,7 @@ Body:
bonus2 bAddSize,Size_All,10;
}
- Id: 400120
AegisName: aegis_400120
AegisName: BioWeapon_Helm_SC
Name: Goat Crown
Type: Armor
View: 621
@ -131924,7 +131924,7 @@ Body:
bonus2 bMagicAddSize,Size_All,10;
}
- Id: 400121
AegisName: aegis_400121
AegisName: BioWeapon_Helm_GC
Name: Twin Crown
Type: Armor
View: 551
@ -132656,7 +132656,7 @@ Body:
Script: |
bonus bMaxHP,100;
- Id: 450001
AegisName: Attacker_Booster_Plate_
AegisName: Atker_Plate
Name: Attacker Booster Plate
Type: Armor
Defense: 120
@ -132683,7 +132683,7 @@ Body:
bonus bDelayrate,-5;
}
- Id: 450002
AegisName: Elemental_Booster_Robe_
AegisName: Ele_Robe
Name: Elemental Booster Robe
Type: Armor
Defense: 80
@ -132710,7 +132710,7 @@ Body:
bonus bVariableCastrate,-5;
}
- Id: 450003
AegisName: Defender_Booster_Robe_
AegisName: Defn_Robe
Name: Defender Booster Robe
Type: Armor
Defense: 90
@ -132737,7 +132737,7 @@ Body:
bonus bVariableCastrate,-5;
}
- Id: 450004
AegisName: Ranger_Booster_Suits_
AegisName: Ran_Suits
Name: Ranger Booster Suits
Type: Armor
Defense: 100
@ -132926,7 +132926,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450023
AegisName: Noblesse_Aimed_suit
AegisName: Noblesse_Aim_Suit
Name: Noblesse Aimed suit
Type: Armor
Buy: 20
@ -133086,7 +133086,7 @@ Body:
if (.@r>=9)
bonus bCritAtkRate,5;
- Id: 450028
AegisName: Noblesse_Tornado_Armor
AegisName: Noblesse_Tonado_Armor
Name: Noblesse Tornado Armor
Type: Armor
Buy: 20
@ -133150,7 +133150,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450030
AegisName: Noblesse_Cart_Cannon_Suit
AegisName: Noblesse_Kart_Suit
Name: Noblesse Cart Cannon Suit
Type: Armor
Buy: 20
@ -133182,7 +133182,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450031
AegisName: Noblesse_Cart_Tornado_Suit
AegisName: Noblesse_Kart_Suit2
Name: Noblesse Cart Tornado Suit
Type: Armor
Buy: 20
@ -133246,7 +133246,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450033
AegisName: Noblesse_Assassin_Suit
AegisName: Noblesse_Assasin_Suit
Name: Noblesse Assassin Suit
Type: Armor
Buy: 20
@ -133372,7 +133372,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450037
AegisName: Noblesse_Catnip_Robe
AegisName: Noblesse_Carrot_Robe
Name: Noblesse Catnip Robe
Type: Armor
Buy: 20
@ -133432,7 +133432,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450039
AegisName: Noblesse_Fire_Rain_Suit
AegisName: Noblesse_Firerain_Suit
Name: Noblesse Fire Rain Suit
Type: Armor
Buy: 20
@ -133714,7 +133714,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,5;
- Id: 450048
AegisName: Noblesse_Eswhoo_Robe
AegisName: Noblesse_Swhoo_Robe
Name: Noblesse Eswhoo Robe
Type: Armor
Buy: 20
@ -134002,7 +134002,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450057
AegisName: Imperial_Aimed_Suit
AegisName: Imperial_Aim_Suit
Name: Imperial Aimed Suit
Type: Armor
Buy: 20
@ -134226,7 +134226,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,4;
- Id: 450064
AegisName: Imperial_Tornado_Armor
AegisName: Imperial_Tonado_Armor
Name: Imperial Tornado Armor
Type: Armor
Buy: 20
@ -134290,7 +134290,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450066
AegisName: Imperial_Cart_Cannon_Suit
AegisName: Imperial_Kart_Suit
Name: Imperial Cart Cannon Suit
Type: Armor
Buy: 20
@ -134322,7 +134322,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450067
AegisName: Imperial_Cart_Tornado_Suit
AegisName: Imperial_Kart_Suit2
Name: Imperial Cart Tornado Suit
Type: Armor
Buy: 20
@ -134386,7 +134386,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450069
AegisName: Imperial_Assassin_Suit
AegisName: Imperial_Assasin_Suit
Name: Imperial Assassin Suit
Type: Armor
Buy: 20
@ -134512,7 +134512,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450073
AegisName: Imperial_Catnip_Robe
AegisName: Imperial_Carrot_Robe
Name: Imperial Catnip Robe
Type: Armor
Buy: 20
@ -134572,7 +134572,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450075
AegisName: Imperial_Fire_Rain_Suit
AegisName: Imperial_Firerain_Suit
Name: Imperial Fire Rain Suit
Type: Armor
Buy: 20
@ -134854,7 +134854,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,7;
- Id: 450084
AegisName: Imperial_Eswhoo_Robe
AegisName: Imperial_Swhoo_Robe
Name: Imperial Eswhoo Robe
Type: Armor
Buy: 20
@ -135078,7 +135078,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450091
AegisName: Grace_Aimed_Suit
AegisName: Grace_Aim_Suit
Name: Grace Aimed Suit
Type: Armor
Buy: 20
@ -135302,7 +135302,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,5;
- Id: 450098
AegisName: Grace_Tornado_Armor
AegisName: Grace_Tonado_Armor
Name: Grace Tornado Armor
Type: Armor
Buy: 20
@ -135366,7 +135366,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450100
AegisName: Grace_Cart_Cannon_Suit
AegisName: Grace_Kart_Suit
Name: Grace Cart Cannon Suit
Type: Armor
Buy: 20
@ -135398,7 +135398,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450101
AegisName: Grace_Cart_Tornado_Suit
AegisName: Grace_Kart_Suit2
Name: Grace Cart Tornado Suit
Type: Armor
Buy: 20
@ -135462,7 +135462,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450103
AegisName: Grace_Assassin_Suit
AegisName: Grace_Assasin_Suit
Name: Grace Assassin Suit
Type: Armor
Buy: 20
@ -135588,7 +135588,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450107
AegisName: Grace_Catnip_Robe
AegisName: Grace_Carrot_Robe
Name: Grace Catnip Robe
Type: Armor
Buy: 20
@ -135648,7 +135648,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450109
AegisName: Grace_Fire_Rain_Suit
AegisName: Grace_Firerain_Suit
Name: Grace Fire Rain Suit
Type: Armor
Buy: 20
@ -135930,7 +135930,7 @@ Body:
if (.@r>=9)
bonus bLongAtkRate,10;
- Id: 450118
AegisName: Grace_Eswhoo_Robe
AegisName: Grace_Swhoo_Robe
Name: Grace Eswhoo Robe
Type: Armor
Buy: 20
@ -135994,7 +135994,7 @@ Body:
if (.@r>=9)
bonus2 bMagicAtkEle,Ele_Dark,10;
- Id: 450121
AegisName: Noblesse_Super_Novice_Suit
AegisName: Noblesse_Snovice_Suit
Name: Noblesse Super Novice Suit
Type: Armor
Buy: 20
@ -136024,7 +136024,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,5;
- Id: 450122
AegisName: Noblesse_Super_Novice_Robe
AegisName: Noblesse_Snovice_Robe
Name: Noblesse Super Novice Robe
Type: Armor
Buy: 20
@ -136054,7 +136054,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,5;
- Id: 450123
AegisName: Imperial_Super_Novice_Suit
AegisName: Imperial_Snovice_Suit
Name: Imperial Super Novice Suit
Type: Armor
Buy: 20
@ -136084,7 +136084,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,7;
- Id: 450124
AegisName: Imperial_Super_Novice_Robe
AegisName: Imperial_Snovice_Robe
Name: Imperial Super Novice Robe
Type: Armor
Buy: 20
@ -136114,7 +136114,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,7;
- Id: 450125
AegisName: Grace_Super_Novice_Suit
AegisName: Grace_Snovice_Suit
Name: Grace Super Novice Suit
Type: Armor
Buy: 20
@ -136144,7 +136144,7 @@ Body:
if (.@r>=9)
bonus bMaxHPrate,10;
- Id: 450126
AegisName: Grace_Super_Novice_Robe
AegisName: Grace_Snovice_Robe
Name: Grace Super Novice Robe
Type: Armor
Buy: 20
@ -136666,7 +136666,7 @@ Body:
bonus bVariableCastrate,-7;
bonus bDelayrate,-(min(getrefine(),12)/2);
- Id: 470000
AegisName: Attacker_Booster_Greaves_
AegisName: Atker_Greave
Name: Attacker Booster Greaves
Type: Armor
Defense: 20
@ -136690,7 +136690,7 @@ Body:
bonus bFixedCast,-500;
}
- Id: 470001
AegisName: Elemental_Booster_Shoes_
AegisName: Ele_Shoes
Name: Elemental Booster Shoes
Type: Armor
Defense: 15
@ -136714,7 +136714,7 @@ Body:
bonus bFixedCast,-500;
}
- Id: 470002
AegisName: Defender_Booster_Shoes_
AegisName: Defn_Shoes
Name: Defender Booster Shoes
Type: Armor
Defense: 18
@ -136738,7 +136738,7 @@ Body:
bonus bFixedCast,-500;
}
- Id: 470003
AegisName: Ranger_Booster_Boots_
AegisName: Ran_Boots
Name: Ranger Booster Boots
Type: Armor
Defense: 18
@ -137253,7 +137253,7 @@ Body:
if (BaseLevel>=130)
bonus bMatkRate,5;
- Id: 480000
AegisName: Attacker_Booster_Manteau_
AegisName: Atker_Manteau
Name: Attacker Booster Manteau
Type: Armor
Defense: 30
@ -137276,7 +137276,7 @@ Body:
bonus bDelayrate,-10;
}
- Id: 480001
AegisName: Elemental_Booster_Muffler_
AegisName: Ele_Muffler
Name: Elemental Booster Muffler
Type: Armor
Defense: 20
@ -137303,7 +137303,7 @@ Body:
bonus bDelayrate,-10;
}
- Id: 480002
AegisName: Defender_Booster_Muffler_
AegisName: Defn_Muffler
Name: Defender Booster Muffler
Type: Armor
Defense: 25
@ -137330,7 +137330,7 @@ Body:
bonus bDelayrate,-10;
}
- Id: 480003
AegisName: Ranger_Booster_Manteau_
AegisName: Ran_Manteau
Name: Ranger Booster Manteau
Type: Armor
Defense: 30
@ -137553,7 +137553,7 @@ Body:
bonus bVariableCastrate,-7;
}
- Id: 480054
AegisName: Morrigane's_Manteau_IL
AegisName: Morrigane_Manyeau_IL
Name: Illusion Morrigane's Manteau
Type: Armor
Weight: 600
@ -138703,7 +138703,7 @@ Body:
bonus bMatkRate,5;
bonus2 bAddClass,Class_All,5;
- Id: 490100
AegisName: Blue_Mental_Pendant
AegisName: Red_Force_Pendant
Name: Red force pendant # !todo check english name
Type: Armor
Weight: 100
@ -138715,7 +138715,7 @@ Body:
bonus bMatkRate,5;
bonus2 bAddClass,Class_All,5;
- Id: 490101
AegisName: Red_Force_Pendant
AegisName: Blue_Mental_Pendant
Name: Blue mental pendant # !todo check english name
Type: Armor
Weight: 100
@ -140780,7 +140780,7 @@ Body:
}
}
- Id: 540000
AegisName: Boost_Spellbook
AegisName: Boost_Spl_Book
Name: Booster Spellbook
Type: Weapon
SubType: Book
@ -140810,7 +140810,7 @@ Body:
bonus2 bMagicAddSize,Size_All,10;
}
- Id: 540001
AegisName: Boost_Book
AegisName: Boost_Text
Name: Booster Book
Type: Weapon
SubType: Book
@ -140960,7 +140960,7 @@ Body:
bonus2 bSkillAtk,"MG_LIGHTNINGBOLT",15;
}
- Id: 540010
AegisName: Up_Thousand_Sun
AegisName: Up_OneSkyOneSun
Name: Patent One Sky One Sun
Type: Weapon
SubType: Book
@ -141526,7 +141526,7 @@ Body:
}
}
- Id: 550001
AegisName: Boost_Rod
AegisName: Boost_Soul_Rod
Name: Booster Rod
Type: Weapon
SubType: Staff
@ -141941,7 +141941,7 @@ Body:
bonus2 bSkillAtk,"SU_CN_METEOR",25;
}
- Id: 550015
AegisName: Up_Spirit_Pendulum_
AegisName: Up_SoulWeight
Name: Patent Spirit Pendulum
Type: Weapon
SubType: Staff
@ -142718,7 +142718,7 @@ Body:
}
}
- Id: 560000
AegisName: Boost_Knuckles
AegisName: Boost_Knuckle
Name: Booster Knuckles
Type: Weapon
SubType: Knuckle
@ -142775,7 +142775,7 @@ Body:
bonus2 bSkillCooldown,"SR_TIGERCANNON",-1000;
}
- Id: 560004
AegisName: Ep172_Bh_Knuck
AegisName: Ep172_Bh_knuck
Name: Ira Fist
Type: Weapon
SubType: Knuckle
@ -143286,7 +143286,7 @@ Body:
bonus2 bSkillCooldown,"WM_METALICSOUND",-2000;
}
- Id: 570008
AegisName: Electronic_Guitar_IL
AegisName: Electronic_Guitar_ILL
Name: Illusion Electric Guitar
Type: Weapon
SubType: Musical
@ -144090,7 +144090,7 @@ Body:
}
}
- Id: 590000
AegisName: Boost_Mace
AegisName: Boost_Hall
Name: Booster Mace
Type: Weapon
SubType: Mace
@ -147968,7 +147968,7 @@ Body:
bonus2 bSkillAtk,"RL_SLUGSHOT",25;
}
- Id: 820001
AegisName: Up_Demon_Slayer_Shot
AegisName: Up_Demon_S_Shot
Name: Patent Demon Slayer Shot
Type: Weapon
SubType: Shotgun
@ -148093,7 +148093,7 @@ Body:
bonus2 bSkillAtk,"RL_FIRE_RAIN",25;
}
- Id: 830002
AegisName: Up_The_Black
AegisName: Up_The_Black_Gatling
Name: Patent The Black
Type: Weapon
SubType: Gatling
@ -148229,7 +148229,7 @@ Body:
bonus2 bSkillAtk,"RL_H_MINE",25;
}
- Id: 840001
AegisName: Up_Golden_Lord_Launcher
AegisName: Up_Golden_L_Launcher
Name: Patent Golden Lord Launcher
Type: Weapon
SubType: Grenade

View File

@ -36657,19 +36657,19 @@ Body:
Buy: 20
Weight: 100
- Id: 25499
AegisName: WanderMinstrelStone_Middle
AegisName: WanderMinstStone_Middle
Name: Clown Gypsy Stone (Middle)
Type: Etc
Buy: 20
Weight: 100
- Id: 25500
AegisName: WanderMinstrelStone_Bottom
AegisName: WanderMinstStone_Bottom
Name: Clown Gypsy Stone (Lower)
Type: Etc
Buy: 20
Weight: 100
- Id: 25501
AegisName: WanderMinstrelStone_Robe
AegisName: WanderMinstreStone_Robe
Name: Wanderer Minstrel Stone (Garment)
Type: Etc
Buy: 20
@ -36971,7 +36971,7 @@ Body:
Type: Etc
Weight: 10
- Id: 25670
AegisName: M_M_Defense
AegisName: EP17_1_EVT03
Name: Modification Module (Defense)
Type: Card
Buy: 20
@ -36986,7 +36986,7 @@ Body:
}
bonus bDef,.@def;
- Id: 25671
AegisName: M_M_Magic_Defense
AegisName: EP17_1_EVT04
Name: Modification Module (Magic Defense)
Type: Card
Buy: 20
@ -37001,7 +37001,7 @@ Body:
}
bonus bMDef,.@mdef;
- Id: 25672
AegisName: M_M_Vit
AegisName: EP17_1_EVT05
Name: Modification Module (Vit)
Type: Card
Buy: 20
@ -37009,7 +37009,7 @@ Body:
Script: |
bonus bVit,3;
- Id: 25673
AegisName: M_M_Luk
AegisName: EP17_1_EVT06
Name: Modification Module (Luk)
Type: Card
Buy: 20
@ -37017,7 +37017,7 @@ Body:
Script: |
bonus bLuk,3;
- Id: 25674
AegisName: M_M_Str
AegisName: EP17_1_EVT07
Name: Modification Module (Str)
Type: Card
Buy: 20
@ -37025,7 +37025,7 @@ Body:
Script: |
bonus bStr,3;
- Id: 25675
AegisName: M_M_Agi
AegisName: EP17_1_EVT08
Name: Modification Module (Agi)
Type: Card
Buy: 20
@ -37033,7 +37033,7 @@ Body:
Script: |
bonus bAgi,3;
- Id: 25676
AegisName: M_M_Int
AegisName: EP17_1_EVT09
Name: Modification Module (Int)
Type: Card
Buy: 20
@ -37041,7 +37041,7 @@ Body:
Script: |
bonus bInt,3;
- Id: 25677
AegisName: M_M_Dex
AegisName: EP17_1_EVT10
Name: Modification Module (Dex)
Type: Card
Buy: 20
@ -37049,7 +37049,7 @@ Body:
Script: |
bonus bDex,3;
- Id: 25678
AegisName: M_M_HP_recovery
AegisName: EP17_1_EVT11
Name: Modification Module (HP recovery)
Type: Card
Buy: 20
@ -37057,7 +37057,7 @@ Body:
Script: |
bonus bHPrecovRate,20;
- Id: 25679
AegisName: M_M_SP_recovery
AegisName: EP17_1_EVT12
Name: Modification Module (SP recovery)
Type: Card
Buy: 20
@ -37065,7 +37065,7 @@ Body:
Script: |
bonus bSPrecovRate,20;
- Id: 25680
AegisName: M_M_Spell5
AegisName: EP17_1_EVT13
Name: Modification Module (Spell)
Type: Card
Buy: 20
@ -37074,7 +37074,7 @@ Body:
bonus bMatk,18;
bonus bVariableCastrate,-10;
- Id: 25681
AegisName: M_M_Attack_Delay_4
AegisName: EP17_1_EVT14
Name: Modification Module (Attack Speed)
Type: Card
Buy: 20
@ -37082,7 +37082,7 @@ Body:
Script: |
bonus bAspdRate,10;
- Id: 25682
AegisName: M_M_Fatal4
AegisName: EP17_1_EVT15
Name: Modification Module (Fatal)
Type: Card
Buy: 20
@ -37091,7 +37091,7 @@ Body:
bonus bCritAtkRate,10;
bonus bCritical,4;
- Id: 25683
AegisName: M_M_Expert_Archer5
AegisName: EP17_1_EVT16
Name: Modification Module (Expert Archer)
Type: Card
Buy: 20
@ -37099,7 +37099,7 @@ Body:
Script: |
bonus bLongAtkRate,10;
- Id: 25684
AegisName: M_M_Vital
AegisName: EP17_1_EVT17
Name: Modification Module (Vital)
Type: Card
Buy: 20
@ -37113,7 +37113,7 @@ Body:
bonus bMaxHP,500;
}
- Id: 25685
AegisName: M_M_Mental
AegisName: EP17_1_EVT18
Name: Modification Module (Mental)
Type: Card
Buy: 20
@ -37127,7 +37127,7 @@ Body:
bonus bMaxSP,100;
}
- Id: 25686
AegisName: M_M_Heal
AegisName: EP17_1_EVT19
Name: Modification Module (Heal)
Type: Card
Buy: 20
@ -37142,7 +37142,7 @@ Body:
}
bonus bHealPower,.@val;
- Id: 25687
AegisName: M_M_Power
AegisName: EP17_1_EVT20
Name: Modification Module (Power)
Type: Card
Buy: 20
@ -37156,7 +37156,7 @@ Body:
bonus bBaseAtk,25;
}
- Id: 25688
AegisName: M_M_Magic
AegisName: EP17_1_EVT21
Name: Modification Module (Magic)
Type: Card
Buy: 20
@ -37170,7 +37170,7 @@ Body:
bonus bMatk,25;
}
- Id: 25689
AegisName: M_M_Shooter
AegisName: EP17_1_EVT22
Name: Modification Module (Shooter)
Type: Card
Buy: 20
@ -37185,7 +37185,7 @@ Body:
}
bonus bLongAtkRate,.@val;
- Id: 25690
AegisName: M_M_Fast
AegisName: EP17_1_EVT23
Name: Modification Module (Fast)
Type: Card
Buy: 20
@ -37199,7 +37199,7 @@ Body:
bonus bAspdRate,3;
}
- Id: 25691
AegisName: M_M_Caster
AegisName: EP17_1_EVT24
Name: Modification Module (Caster)
Type: Card
Buy: 20
@ -37214,7 +37214,7 @@ Body:
}
bonus bVariableCastrate,.@val;
- Id: 25692
AegisName: M_M_Critical
AegisName: EP17_1_EVT25
Name: Modification Module (Critical)
Type: Card
Buy: 20
@ -37228,7 +37228,7 @@ Body:
bonus bCritAtkRate,5;
}
- Id: 25693
AegisName: M_M_Delay_After_skill
AegisName: EP17_1_EVT26
Name: Modification Module (Delay after skill)
Type: Card
Buy: 20
@ -37243,7 +37243,7 @@ Body:
}
bonus bDelayrate,.@val;
- Id: 25694
AegisName: M_M_Fixed_Casting
AegisName: EP17_1_EVT27
Name: Modification Module (Fixed Casting)
Type: Card
Buy: 20
@ -37258,7 +37258,7 @@ Body:
}
bonus bFixedCast,.@val;
- Id: 25695
AegisName: M_M_Above_All
AegisName: EP17_1_EVT28
Name: Modification Module (Above All)
Type: Card
Buy: 20
@ -37273,7 +37273,7 @@ Body:
bonus2 bSubRace,RC_Player_Human,-5;
} }
- Id: 25696
AegisName: M_M_Drain_Life
AegisName: EP17_1_EVT29
Name: Modification Module (Drain Life)
Type: Card
Buy: 20
@ -37281,7 +37281,7 @@ Body:
Script: |
bonus2 bHPDrainRate,20,2;
- Id: 25697
AegisName: M_M_Drain_Soul
AegisName: EP17_1_EVT30
Name: Modification Module (Drain Soul)
Type: Card
Buy: 20
@ -37289,7 +37289,7 @@ Body:
Script: |
bonus2 bSPDrainRate,10,1;
- Id: 25698
AegisName: M_M_Magic_Healing
AegisName: EP17_1_EVT31
Name: Modification Module (Magic Healing)
Type: Card
Buy: 20
@ -37297,7 +37297,7 @@ Body:
Script: |
autobonus "{ bonus2 bHPRegenRate,400,500; }",20,10000,BF_MAGIC;
- Id: 25699
AegisName: M_M_Magic_Soul
AegisName: EP17_1_EVT32
Name: Modification Module (Magic Soul)
Type: Card
Buy: 20
@ -37305,7 +37305,7 @@ Body:
Script: |
autobonus "{ bonus2 bSPRegenRate,80,500; }",10,10000,BF_MAGIC;
- Id: 25700
AegisName: M_M_Unlimited_Vital
AegisName: EP17_1_EVT33
Name: Modification Module (Unlimited Vital)
Type: Card
Buy: 20
@ -37314,7 +37314,7 @@ Body:
autobonus2 "{ bonus bVit,50; bonus2 bHPRegenRate,400,500; bonus2 bSPLossRate,20,1000; }",10,10000,BF_WEAPON|BF_MAGIC;
/* unknown rate */
- Id: 25701
AegisName: M_M_Spell_Buster
AegisName: EP17_1_EVT34
Name: Modification Module (Spell Buster)
Type: Card
Buy: 20
@ -37323,7 +37323,7 @@ Body:
autobonus "{ bonus bInt,50; bonus bMatkRate,15; bonus2 bAddClass,Class_All,-15; }",20,10000,BF_MAGIC;
/* unknown rate */
- Id: 25702
AegisName: M_M_Firing_Shot
AegisName: EP17_1_EVT35
Name: Modification Module (Firing Shot)
Type: Card
Buy: 20
@ -37332,7 +37332,7 @@ Body:
autobonus "{ bonus bDex,50; bonus bLongAtkRate,10; bonus2 bSPLossRate,20,1000; }",20,10000,BF_WEAPON;
/* unknown rate */
- Id: 25703
AegisName: M_M_Overpower
AegisName: EP17_1_EVT36
Name: Modification Module (Overpower)
Type: Card
Buy: 20
@ -37341,7 +37341,7 @@ Body:
autobonus "{ bonus bStr,50; bonus2 bAddClass,Class_All,15; bonus bMatkRate,-15; }",20,10000,BF_WEAPON;
/* unknown rate */
- Id: 25704
AegisName: M_M_Fatal_Flash
AegisName: EP17_1_EVT37
Name: Modification Module (Fatal Flash)
Type: Card
Buy: 20
@ -37350,7 +37350,7 @@ Body:
autobonus "{ bonus bStr,50; bonus bCritAtkRate,10; bonus2 bHPLossRate,300,1000; }",20,10000,BF_WEAPON;
/* unknown rate */
- Id: 25705
AegisName: M_M_Lucky_Strike
AegisName: EP17_1_EVT38
Name: Modification Module (Lucky Strike)
Type: Card
Buy: 20
@ -37872,42 +37872,42 @@ Body:
NoMail: true
NoAuction: true
- Id: 25842
AegisName: SoulReaperStone_Robe
AegisName: SoulreaperStone_Robe
Name: Soul Reaper Stone (Garment)
Type: Etc
Weight: 100
- Id: 25843
AegisName: SoulLinkerStone_Top
AegisName: SoullinkerStone_Top
Name: Soul Linker Stone (Upper)
Type: Etc
Weight: 100
- Id: 25844
AegisName: SoulLinkerStone_Middle
AegisName: SoullinkerStone_Middle
Name: Soul Linker Stone (Middle)
Type: Etc
Weight: 100
- Id: 25845
AegisName: SoulLinkerStone_Bottom
AegisName: SoullinkerStone_Bottom
Name: Soul Linker Stone (Bottom)
Type: Etc
Weight: 100
- Id: 25846
AegisName: StarGladiatorStone_Top
AegisName: GladiatorStone_Top
Name: Star Gladiator Stone (Upper)
Type: Etc
Weight: 100
- Id: 25847
AegisName: StarGladiatorStone_Middle
AegisName: GladiatorStone_Middle
Name: Star Gladiator Stone (Middle)
Type: Etc
Weight: 100
- Id: 25848
AegisName: StarGladiatorStone_Bottom
AegisName: GladiatorStone_Bottom
Name: Star Gladiator Stone (Bottom)
Type: Etc
Weight: 100
- Id: 25849
AegisName: StarEmperorStone_Garment
AegisName: StaremperorStone_Robe
Name: Star Emperor Stone (Garment)
Type: Etc
Weight: 100
@ -37952,7 +37952,7 @@ Body:
Type: Etc
Weight: 100
- Id: 25858
AegisName: GunslingerStone_Robe
AegisName: RebellionStone_Robe
Name: Gunslinger Stone (Garment)
Type: Etc
Weight: 100
@ -51499,62 +51499,62 @@ Body:
NoMail: true
NoAuction: true
- Id: 1000008
AegisName: RangerStone_II_Top
AegisName: RangerStone_Top2
Name: Sniper Stone II (Top)
Type: Etc
Weight: 100
- Id: 1000009
AegisName: RangerStone_II_Middle
AegisName: RangerStone_Middle2
Name: Sniper Stone II (Middle)
Type: Etc
Weight: 100
- Id: 1000010
AegisName: RangerStone_II_Bottom
AegisName: RangerStone_Bottom2
Name: Sniper Stone II (Bottom)
Type: Etc
Weight: 100
- Id: 1000011
AegisName: RangerStone_II_Garment
AegisName: RangerStone_Robe2
Name: Ranger Stone II (Garment)
Type: Etc
Weight: 100
- Id: 1000012
AegisName: MechanicStone_II_Top
AegisName: MechanicStone_Top2
Name: Whitesmith Stone II (Top)
Type: Etc
Weight: 100
- Id: 1000013
AegisName: MechanicStone_II_Middle
AegisName: MechanicStone_Middle2
Name: Whitesmith Stone II (Middle)
Type: Etc
Weight: 100
- Id: 1000014
AegisName: MechanicStone_II_Bottom
AegisName: MechanicStone_Bottom2
Name: Whitesmith Stone II (Bottom)
Type: Etc
Weight: 100
- Id: 1000015
AegisName: MechanicStone_II_Garment
AegisName: MechanicStone_Robe2
Name: Mechanic Stone II (Garment)
Type: Etc
Weight: 100
- Id: 1000016
AegisName: HighpriestStone_II_Top
AegisName: HighpriestStone_Top2
Name: High Priest Stone II (Top)
Type: Etc
Weight: 100
- Id: 1000017
AegisName: HighpriestStone_II_Middle
AegisName: HighpriestStone_Middle2
Name: High Priest Stone II (Middle)
Type: Etc
Weight: 100
- Id: 1000018
AegisName: HighpriestStone_II_Bottom
AegisName: HighpriestStone_Bottom2
Name: High Priest Stone II (Bottom)
Type: Etc
Weight: 100
- Id: 1000019
AegisName: ArchbishopStone_II_Garment
AegisName: ArchbishopStone_Robe2
Name: Archbishop Stone II (Garment)
Type: Etc
Weight: 100
@ -52245,42 +52245,42 @@ Body:
Type: Etc
Weight: 100
- Id: 1000217
AegisName: RoyalGuardStone_Robe2
AegisName: RoyalguardStone_Robe2
Name: Royal Guard Stone II (Garment)
Type: Etc
Weight: 100
- Id: 1000218
AegisName: RoyalGuardStone_Top2
AegisName: PaladinStone_Top2
Name: Paladin Stone II (Upper)
Type: Etc
Weight: 100
- Id: 1000219
AegisName: RoyalGuardStone_Middle2
AegisName: PaladinStone_Middle2
Name: Paladin Stone II (Middle)
Type: Etc
Weight: 100
- Id: 1000220
AegisName: RoyalGuardStone_Bottom2
AegisName: PaladinStone_Bottom2
Name: Paladin Stone II (Lower)
Type: Etc
Weight: 100
- Id: 1000221
AegisName: GuillotineCrossStone_Robe2
AegisName: GuillcrossStone_Robe2
Name: Guillotine Cross Stone II (Garment)
Type: Etc
Weight: 100
- Id: 1000222
AegisName: GuillotineCrossStone_Top2
AegisName: AssacrossStone_Top2
Name: Assassin Cross Stone II (Upper)
Type: Etc
Weight: 100
- Id: 1000223
AegisName: GuillotineCrossStone_Middle2
AegisName: AssacrossStone_Middle2
Name: Assassin Cross Stone II (Middle)
Type: Etc
Weight: 100
- Id: 1000224
AegisName: GuillotineCrossStone_Bottom2
AegisName: AssacrossStone_Bottom2
Name: Assassin Cross Stone II (Lower)
Type: Etc
Weight: 100

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2779
db/re/item_synthesis.yml Normal file

File diff suppressed because it is too large Load Diff

2997
db/re/item_upgrade.yml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1178,6 +1178,20 @@ If args are given, sets camera position.
---------------------------------------
@synthesisui <id>
Open Lapine Synthesis UI. Valid 'id' can be found in db/[pre-]re/item_synthesis.yml
(available for PACKETVER >= 20160525)
---------------------------------------
@upgradeui <id>
Open Lapine Upgrade UI. Valid 'id' can be found in db/[pre-]re/item_upgrade.yml
(available for PACKETVER >= 20160525)
---------------------------------------
==============================
| 5. Administrative Commands |
==============================

View File

@ -10505,6 +10505,39 @@ If <char id> is specified, the specified player is used rather than the attached
---------------------------------------
*synthesisui(<id>,{<char_id>})
Open Item Synthesis UI for attached player. The id must be valid from
db/[pre-]re/item_synthesis.yml.
Returns 1 on success and 0 of failure.
---------------------------------------
*upgradeui(<id>,{<char_id>})
Open Item Upgrade UI for attached player. The id must be valid from
db/[pre-]re/item_upgrade.yml.
Returns 1 on success and 0 of failure.
If validation process is success, these variables are set:
@last_lapine_id - Item ID of target item
@last_lapine_idx - Inventory index of target item
@last_lapine_refine - Refine level
@last_lapine_attribute - Attribute flag
@last_lapine_card1 - Card value at slot 0
@last_lapine_card2 - Card value at slot 1
@last_lapine_card3 - Card value at slot 2
@last_lapine_card4 - Card value at slot 3
@last_lapine_bound - Bound flag
@last_lapine_uniqueid$ - Unqiue ID
@last_lapine_option_id[] - Array of Random Option IDs
@last_lapine_option_value[] - Array of Random Option Values
@last_lapine_option_param[] - Array of Random Option Params
---------------------------------------
========================
|14.- Channel commands.|
========================

File diff suppressed because it is too large Load Diff

View File

@ -156,6 +156,7 @@ npc: npc/re/other/resetskill.txt
npc: npc/re/other/stone_change.txt
npc: npc/re/other/turbo_track.txt
npc: npc/re/other/CashShop_Functions.txt
npc: npc/re/other/LapineEnchants.txt
// --------------------------- Quests ---------------------------
// - Eden Group -------------------------------------------------

View File

@ -67,6 +67,10 @@
#define OFFICIAL_GUILD_STORAGE
#endif
#if PACKETVER >= 20160525
#define FEATURE_LAPINE_UI
#endif
#ifndef DUMP_UNKNOWN_PACKET
//#define DUMP_UNKNOWN_PACKET
#endif

View File

@ -38,6 +38,8 @@
#include "instance.hpp"
#include "intif.hpp"
#include "itemdb.hpp" // MAX_ITEMGROUP
#include "item_synthesis.hpp"
#include "item_upgrade.hpp"
#include "log.hpp"
#include "mail.hpp"
#include "map.hpp"
@ -1022,7 +1024,7 @@ ACMD_FUNC(storage)
{
nullpo_retr(-1, sd);
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.trading || sd->state.storage_flag)
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.trading || sd->state.storage_flag || sd->state.lapine_ui)
return -1;
if (storage_storageopen(sd) == 1)
@ -1044,7 +1046,7 @@ ACMD_FUNC(guildstorage)
{
nullpo_retr(-1, sd);
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.trading)
if (sd->npc_id || sd->state.vending || sd->state.buyingstore || sd->state.trading || sd->state.lapine_ui)
return -1;
switch (storage_guild_storageopen(sd)) {
@ -4085,6 +4087,12 @@ ACMD_FUNC(reload) {
} else if (strstr(command, "attendancedb") || strncmp(message, "attendancedb", 4) == 0) {
attendance_db.reload();
clif_displaymessage(fd, msg_txt(sd, 795)); // Attendance database has been reloaded.
} else if (strstr(command, "synthesisdb") || strncmp(message, "synthesisdb", 6) == 0) {
item_synthesis_db_reload();
clif_displaymessage(fd, msg_txt(sd, 796)); // Item Synthesis database has been reloaded.
} else if (strstr(command, "upgradedb") || strncmp(message, "upgradedb", 6) == 0) {
item_upgrade_db_reload();
clif_displaymessage(fd, msg_txt(sd, 797)); // Item Upgrade database has been reloaded.
}
return 0;
@ -7282,6 +7290,10 @@ ACMD_FUNC(mute)
ACMD_FUNC(refresh)
{
nullpo_retr(-1, sd);
if (sd->state.lapine_ui) {
clif_displaymessage(sd->fd, msg_txt(sd, 543));
return -1;
}
clif_refresh(sd);
return 0;
}
@ -10396,6 +10408,46 @@ ACMD_FUNC(refineui)
#endif
}
ACMD_FUNC(synthesisui) {
nullpo_retr(-1, sd);
#ifdef FEATURE_LAPINE_UI
t_itemid itemid;
if (sscanf(message, "%u", &itemid) < 1) {
clif_displaymessage(fd, "Please input itemid of synthesis id.");
return -1;
}
if (!item_synthesis_open(sd, itemid))
return -1;
sd->state.lapine_ui |= 4;
sd->itemid = itemid;
#else
clif_displaymessage(fd, "Client is not supported.");
#endif
return 0;
}
ACMD_FUNC(upgradeui) {
nullpo_retr(-1, sd);
#ifdef FEATURE_LAPINE_UI
t_itemid itemid;
if (sscanf(message, "%u", &itemid) < 1) {
clif_displaymessage(fd, "Please input itemid of upgrade id.");
return -1;
}
if (!item_upgrade_open(sd, itemid))
return -1;
sd->state.lapine_ui |= 4;
sd->itemid = itemid;
#else
clif_displaymessage(fd, "Client is not supported.");
#endif
return 0;
}
#include "../custom/atcommand.inc"
/**
@ -10705,6 +10757,8 @@ void atcommand_basecommands(void) {
ACMD_DEF2("completequest", quest),
ACMD_DEF2("checkquest", quest),
ACMD_DEF(refineui),
ACMD_DEFR(synthesisui, ATCMD_NOCONSOLE | ATCMD_NOAUTOTRADE),
ACMD_DEFR(upgradeui, ATCMD_NOCONSOLE | ATCMD_NOAUTOTRADE),
};
AtCommandInfo* atcommand;
int i;

View File

@ -40,6 +40,8 @@
#include "instance.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "item_synthesis.hpp"
#include "item_upgrade.hpp"
#include "log.hpp"
#include "mail.hpp"
#include "map.hpp"
@ -11837,7 +11839,7 @@ void clif_parse_UseItem(int fd, struct map_session_data *sd)
return;
}
if ( (!sd->npc_id && pc_istrading(sd)) || sd->chatID || (sd->state.block_action & PCBLOCK_USEITEM) ) {
if ( (!sd->npc_id && pc_istrading(sd)) || sd->chatID || sd->state.lapine_ui || (sd->state.block_action & PCBLOCK_USEITEM) ) {
clif_msg(sd, WORK_IN_PROGRESS);
return;
}
@ -22027,6 +22029,266 @@ void clif_parse_refineui_refine( int fd, struct map_session_data* sd ){
#endif
}
/**
* Reset Lapine UI variables
* @param sd: Player
*/
static void clif_lapine_ui_reset(map_session_data *sd) {
sd->state.lapine_ui = 0;
sd->last_lapine_box = 0;
sd->itemid = sd->itemindex = -1;
}
/**
* Open Lapine Synthesis UI
* @param sd: Player
* @param itemid: ID for synthesis item
* 0A4E <itemid>.W (ZC_LAPINE_SYNTHESIS_OPEN)
* 0A4E <itemid>.L (ZC_LAPINE_SYNTHESIS_OPEN PACKETVER >= 20181121)
*/
bool clif_synthesisui_open(struct map_session_data *sd, t_itemid itemid) {
#ifdef FEATURE_LAPINE_UI
nullpo_retr(false, sd);
PACKET_ZC_LAPINEDDUKDDAK_OPEN p;
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_OPEN;
p.itemId = client_nameid(itemid);
clif_send(&p, sizeof(p), &sd->bl, SELF);
return true;
#else
return false;
#endif
}
/**
* Send Lapine Synthesis result to player
* @param sd: Player
* @param result: @see e_item_synthesis_result
* 0A50 <result>.W (ZC_LAPINE_SYNTHESIS_RESULT)
*/
void clif_synthesisui_result(struct map_session_data *sd, e_item_synthesis_result result) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
clif_lapine_ui_reset(sd);
PACKET_ZC_LAPINEDDUKDDAK_RESULT p;
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_RESULT;
p.result = result;
clif_send(&p, sizeof(p), &sd->bl, SELF);
#endif
}
/**
* Received selected items from Lapine Synthesis UI
* @param fd
* @param sd
* 0A4F <length>.W <itemid>.W { <index>.W <count>.W }.*4B (CZ_LAPINE_SYNTHESIS_ACK)
* 0A4F <length>.W <itemid>.L { <index>.W <count>.W }.*4B (CZ_LAPINE_SYNTHESIS_ACK PACKETVER >= 20181121)
*/
void clif_parse_lapineSynthesis_submit(int fd, struct map_session_data* sd) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
if (pc_istrading(sd)) {
clif_synthesisui_result(sd, SYNTHESIS_INVALID_ITEM);
return;
}
if (!(sd->state.lapine_ui&1)) {
set_eof(sd->fd);
return;
}
s_packet_db* info = &packet_db[RFIFOW(fd, 0)];
if (!info) {
set_eof(sd->fd);
return;
}
int len = RFIFOW(fd, info->pos[0]), i = 0, n = (len - info->pos[2]) / info->pos[3];
#if PACKETVER >= 20181121
t_itemid itemid = RFIFOL(fd, info->pos[1]);
#else
t_itemid itemid = RFIFOW(fd, info->pos[1]);
#endif
item_data *id;
if (n < 1 || n > MAX_SYNTHESIS_SOURCES || sd->last_lapine_box != itemid || sd->last_lapine_box != sd->itemid || !(id = itemdb_exists(itemid))) {
//clif_synthesisui_result(sd, SYNTHESIS_INVALID_ITEM);
set_eof(sd->fd);
return;
}
if (!(sd->state.lapine_ui&4) && id->flag.delay_consume) {
item *it;
if (sd->itemindex == -1 || sd->itemid == -1 || !(it = &sd->inventory.u.items_inventory[sd->itemindex]) || it->nameid != itemid) {
//clif_synthesisui_result(sd, SYNTHESIS_INVALID_ITEM);
set_eof(sd->fd);
return;
}
if (id->flag.delay_consume != 2)
pc_delitem(sd, sd->itemindex, 1, 0, 0, LOG_TYPE_CONSUME);
}
std::vector<s_item_synthesis_list> items;
for (; i < n; i++) {
int index = RFIFOW(fd, info->pos[2] + i * info->pos[3]) - 2;
int amount = RFIFOW(fd, info->pos[2] + i * info->pos[3] + 2);
if (amount < 1 || index < 0 || index >= MAX_INVENTORY) {
//clif_synthesisui_result(sd, SYNTHESIS_INVALID_ITEM);
set_eof(sd->fd);
return;
}
s_item_synthesis_list item;
item.index = (uint16)index;
item.amount = (uint16)amount;
items.push_back(item);
}
clif_synthesisui_result(sd, item_synthesis_submit(sd, itemid, items));
clif_lapine_ui_reset(sd);
#endif
}
/**
* Close Lapine Synthesis UI
* @param fd
* @param sd
* 0A70 CZ_LAPINE_SYNTHESIS_CLOSE
*/
void clif_parse_lapineSynthesis_close(int fd, struct map_session_data* sd) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
clif_lapine_ui_reset(sd);
#endif
}
/**
* Open Lapine Upgrade UI
* @param sd: Player
* @param itemid: ID for upgrade item
* 0AB4 <itemid>.W (ZC_LAPINE_UPGRADE_OPEN)
* 0AB4 <itemid>.L (ZC_LAPINE_UPGRADE_OPEN PACKETVER >= 20181121)
*/
bool clif_lapine_upgrade_open(struct map_session_data *sd, t_itemid itemid) {
#ifdef FEATURE_LAPINE_UI
nullpo_retr(false, sd);
PACKET_ZC_LAPINEUPGRADE_OPEN p;
p.packetType = HEADER_ZC_LAPINEUPGRADE_OPEN;
p.itemId = client_nameid(itemid);
clif_send(&p, sizeof(p), &sd->bl, SELF);
return true;
#else
return false;
#endif
}
/**
* Send Lapine Upgrade result to player
* @param sd: Player
* @param result: @see e_item_upgrade_result
* 0AB7 <result>.W (ZC_LAPINE_UPGRADE_RESULT)
*/
void clif_lapine_upgrade_result(struct map_session_data *sd, e_item_upgrade_result result) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
clif_lapine_ui_reset(sd);
PACKET_ZC_LAPINEUPGRADE_RESULT p;
p.packetType = HEADER_ZC_LAPINEUPGRADE_RESULT;
p.result = result;
clif_send(&p, sizeof(p), &sd->bl, SELF);
#endif
}
/**
* Received selected item from Lapine Upgrade UI
* @param fd
* @param sd
* 0AB6 <itemid>.W <index>.W (CZ_LAPINE_UPGRADE_ACK)
* 0AB6 <itemid>.L <index>.W (CZ_LAPINE_UPGRADE_ACK PACKETVER >= 20181121)
*/
void clif_parse_lapineUpgrade_submit(int fd, struct map_session_data* sd) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
if (pc_istrading(sd)) {
clif_lapine_upgrade_result(sd, LAPINE_UPRAGDE_FAILURE);
return;
}
if (!(sd->state.lapine_ui&2)) {
set_eof(sd->fd);
return;
}
s_packet_db* info = &packet_db[RFIFOW(fd, 0)];
if (!info) {
set_eof(sd->fd);
return;
}
short index = RFIFOW(fd, info->pos[1]) - 2;
t_itemid itemid;
#if PACKETVER >= 20181121
itemid = RFIFOL(fd, info->pos[0]);
#else
itemid = RFIFOW(fd, info->pos[0]);
#endif
item_data *id;
if (sd->last_lapine_box != itemid || sd->last_lapine_box != sd->itemid || index < 0 || index >= MAX_INVENTORY || !(id = itemdb_search(sd->last_lapine_box))) {
//clif_lapine_upgrade_result(sd, LAPINE_UPRAGDE_FAILURE);
set_eof(sd->fd);
return;
}
if (!(sd->state.lapine_ui&4) && id->flag.delay_consume) {
if (sd->itemindex == -1 || sd->itemid == -1) {
//clif_lapine_upgrade_result(sd, LAPINE_UPRAGDE_FAILURE);
set_eof(sd->fd);
return;
}
if (id->flag.delay_consume != 2)
pc_delitem(sd, sd->itemindex, 1, 0, 0, LOG_TYPE_CONSUME);
}
clif_lapine_upgrade_result(sd, item_upgrade_submit(sd, itemid, index));
clif_lapine_ui_reset(sd);
#endif
}
/**
* Close Lapine Upgrade UI
* @param fd
* @param sd
* 0AB5 CZ_LAPINE_UPGRADE_CLOSE
*/
void clif_parse_lapineUpgrade_close(int fd, struct map_session_data* sd) {
#ifdef FEATURE_LAPINE_UI
nullpo_retv(sd);
clif_lapine_ui_reset(sd);
#endif
}
/*==========================================
* Main client packet processing function
*------------------------------------------*/

View File

@ -41,6 +41,8 @@ struct party_booking_ad_info;
struct sale_item_data;
struct mail_message;
struct achievement;
struct s_item_synthesis_list;
struct s_item_upgrade_list;
struct guild_log_entry;
enum e_guild_storage_log : uint16;
enum e_bg_queue_apply_ack : uint16;
@ -69,6 +71,10 @@ enum e_packet_ack : uint8_t{
ZC_MERGE_ITEM_OPEN,
ZC_ACK_MERGE_ITEM,
ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN,
ZC_LAPINE_SYNTHESIS_OPEN,
ZC_LAPINE_SYNTHESIS_RESULT,
ZC_LAPINE_UPGRADE_OPEN,
ZC_LAPINE_UPGRADE_RESULT,
//add other here
MAX_ACK_FUNC //auto upd len
};
@ -186,6 +192,18 @@ enum e_bossmap_info {
BOSS_INFO_DEAD,
};
enum e_item_synthesis_result : uint8 {
SYNTHESIS_SUCCESS = 0,
SYNTHESIS_INSUFFICIENT_AMOUNT = 5,
SYNTHESIS_INVALID_ITEM = 7,
};
enum e_item_upgrade_result : uint8 {
LAPINE_UPRAGDE_SUCCESS = 0,
LAPINE_UPRAGDE_FAILURE = 1,
};
#define packet_len(cmd) packet_db[cmd].len
extern struct s_packet_db packet_db[MAX_PACKET_DB+1];
extern int packet_db_ack[MAX_ACK_FUNC + 1];
@ -1152,4 +1170,7 @@ void clif_pet_evolution_result( struct map_session_data* sd, e_pet_evolution_res
void clif_parse_skill_toid( struct map_session_data* sd, uint16 skill_id, uint16 skill_lv, int target_id );
bool clif_synthesisui_open(struct map_session_data *sd, t_itemid itemid);
bool clif_lapine_upgrade_open(struct map_session_data *sd, t_itemid itemid);
#endif /* CLIF_HPP */

View File

@ -2287,6 +2287,14 @@
#if PACKETVER >= 20160525
parseable_packet(0x0A77,15,clif_parse_camerainfo,0);
packet(0x0A78, 15);
ack_packet(ZC_LAPINE_SYNTHESIS_OPEN, 0x0A4E, 4, 2); // ZC_LAPINE_SYNTHESIS_OPEN
parseable_packet(0x0A4F, -1, clif_parse_lapineSynthesis_submit, 2, 4, 6, 4); // CZ_LAPINE_SYNTHESIS_ACK
ack_packet(ZC_LAPINE_SYNTHESIS_RESULT, 0x0A50, 4, 2); // ZC_LAPINE_SYNTHESIS_RESULT
parseable_packet(0x0A70, 2, clif_parse_lapineSynthesis_close, 0); // CZ_LAPINE_SYNTHESIS_CLOSE
ack_packet(ZC_LAPINE_UPGRADE_OPEN, 0x0AB4, 4, 2); // ZC_LAPINE_UPGRADE_OPEN
parseable_packet(0x0AB5, 2, clif_parse_lapineUpgrade_close, 0); // CZ_LAPINE_UPGRADE_CLOSE
parseable_packet(0x0AB6, 6, clif_parse_lapineUpgrade_submit, 2, 4); // CZ_LAPINE_UPGRADE_ACK
ack_packet(ZC_LAPINE_UPGRADE_RESULT, 0x0AB7, 4, 2); // ZC_LAPINE_UPGRADE_RESULT
#endif
// 2016-06-01aRagexe
@ -2394,6 +2402,14 @@
packet(0x0ADD, 22);
#endif
// 2018-11-21 Ragexe
#if PACKETVER >= 20181121
ack_packet(ZC_LAPINE_SYNTHESIS_OPEN, 0x0A4E, 6, 2); // ZC_LAPINE_SYNTHESIS_OPEN
parseable_packet(0x0A4F, -1, clif_parse_lapineSynthesis_submit, 2, 4, 8, 4); // CZ_LAPINE_SYNTHESIS_ACK
ack_packet(ZC_LAPINE_UPGRADE_OPEN, 0x0AB4, 6, 2); // ZC_LAPINE_UPGRADE_OPEN
parseable_packet(0x0AB6, 8, clif_parse_lapineUpgrade_submit, 2, 6); // CZ_LAPINE_UPGRADE_ACK
#endif
#if PACKETVER_MAIN_NUM >= 20181002 || PACKETVER_RE_NUM >= 20181002 || PACKETVER_ZERO_NUM >= 20181010
parseable_packet( 0x0B10, sizeof( struct PACKET_CZ_START_USE_SKILL ), clif_parse_StartUseSkillToId, 0 );
parseable_packet( 0x0B11, sizeof( struct PACKET_CZ_STOP_USE_SKILL ), clif_parse_StopUseSkillToId, 0 );

344
src/map/item_synthesis.cpp Normal file
View File

@ -0,0 +1,344 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#include "item_synthesis.hpp"
#include <algorithm>
#include <memory>
#include "../common/nullpo.hpp"
#include "../common/showmsg.hpp"
#include "log.hpp" // e_log_pick_type
ItemSynthesisDatabase item_synthesis_db;
void ItemSynthesisDatabase::clear() {
TypesafeYamlDatabase::clear();
}
const std::string ItemSynthesisDatabase::getDefaultLocation() {
return std::string(db_path) + "/item_synthesis.yml";
}
/**
* Reads and parses an entry from the item_synthesis file.
* @param node: YAML node containing the entry.
* @return count of successfully parsed rows
*/
uint64 ItemSynthesisDatabase::parseBodyNode(const YAML::Node &node) {
std::string synthesis_item_name;
if (!this->asString(node, "Item", synthesis_item_name))
return 0;
std::shared_ptr<item_data> item = item_db.search_aegisname(synthesis_item_name.c_str());
if (item == nullptr) {
this->invalidWarning(node["Item"], "Item name for Synthesis Box %s does not exist.\n", synthesis_item_name.c_str());
return 0;
}
std::shared_ptr<s_item_synthesis_db> entry = this->find(item->nameid);
bool exists = entry != nullptr;
if (!exists) {
if (!this->nodesExist(node, { "SourceItem", "Reward" }))
return 0;
entry = std::make_shared<s_item_synthesis_db>();
entry->id = item->nameid;
}
if (this->nodeExists(node, "SourceNeeded")) {
if (!this->asUInt16(node, "SourceNeeded", entry->source_needed))
return 0;
}
if (this->nodeExists(node, "NeedRefineMin")) {
if (!this->asUInt16(node, "NeedRefineMin", entry->source_refine_min))
return 0;
}
if (this->nodeExists(node, "NeedRefineMax")) {
if (!this->asUInt16(node, "NeedRefineMax", entry->source_refine_max))
return 0;
}
if (exists && this->nodeExists(node, "ClearSourceItem")) {
ShowNotice("item_synthesis: Cleared all items in SourceItem. Synthesis: %s (%u)\n", item->name.c_str(), item->nameid);
if (!entry->sources.empty())
entry->sources.clear();
}
if (this->nodeExists(node, "SourceItem")) {
const YAML::Node& sourceNode = node["SourceItem"];
if (!exists)
entry->sources.reserve(entry->source_needed);
for (const YAML::Node &source : sourceNode) {
std::string source_item_name;
if (!this->asString(source, "Item", source_item_name))
continue;
std::shared_ptr<item_data> source_it = item_db.search_aegisname(source_item_name.c_str());
if (source_it == nullptr) {
this->invalidWarning(node["SourceItem"], "Source item name %s does not exist, skipping.\n", source_item_name.c_str());
continue;
}
s_item_synthesis_source source_item = {};
source_item.nameid = source_it->nameid;
if (exists && this->nodeExists(source, "Remove")) {
entry->sources.erase(std::remove_if(entry->sources.begin(), entry->sources.end(), [&source_item](const s_item_synthesis_source &x) { return x.nameid == source_item.nameid; }));
ShowNotice("item_synthesis: Removed %s (%u) from SourceItem. Synthesis: %s (%u)\n", source_it->name.c_str(), source_item.nameid, item->name.c_str(), item->nameid);
continue;
}
if (this->nodeExists(source, "Amount"))
this->asUInt16(source, "Amount", source_item.amount);
if (entry->sources.end() == std::find_if(
entry->sources.begin(), entry->sources.end(), [&source_item](s_item_synthesis_source &x)
{
if (x.nameid == source_item.nameid) {
x.amount = source_item.amount;
return true;
}
return false;
}
))
entry->sources.push_back(source_item);
}
}
if (this->nodeExists(node, "Reward")) {
std::string script_str;
script_code *code;
if (!this->asString(node, "Reward", script_str))
return 0;
if (!(code = parse_script(script_str.c_str(), this->getCurrentFile().c_str(), item->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS))) {
this->invalidWarning(node["Reward"], "Invalid Reward item script.\n");
return 0;
}
if (entry->reward)
script_free_code(entry->reward);
entry->reward = code;
}
if (!exists)
this->put(item->nameid, entry);
return 1;
}
/**
* Attempt to open synthesis UI for a player
* @param sd: Open UI for this player
* @param itemid: ID of synthesis UI
* @return True on succes, false on failure
*/
bool item_synthesis_open(map_session_data *sd, t_itemid itemid) {
nullpo_retr(false, sd);
if (pc_cant_act2(sd) || (sd)->chatID)
return false;
if (pc_is90overweight(sd) || !pc_inventoryblank(sd)) {
clif_msg(sd, ITEM_CANT_OBTAIN_WEIGHT);
return false;
}
if (!item_synthesis_db.exists(itemid))
return false;
if (clif_synthesisui_open(sd, itemid)) {
sd->last_lapine_box = itemid;
sd->state.lapine_ui = 1;
}
return true;
}
/**
* Process synthesis input from player
* @param sd: Player who request
* @param itemid: ID of synthesis UI
* @param items: Item list sent by player
* @return SYNTHESIS_SUCCESS on success. @see e_item_synthesis_result
*/
e_item_synthesis_result item_synthesis_submit(map_session_data *sd, t_itemid itemid, const std::vector<s_item_synthesis_list> items) {
nullpo_retr(SYNTHESIS_INVALID_ITEM, sd);
if (!sd->state.lapine_ui || itemid != sd->last_lapine_box) {
sd->state.lapine_ui = sd->last_lapine_box = 0;
return SYNTHESIS_INVALID_ITEM;
}
auto info = item_synthesis_db.find(itemid);
if (!info || !info->checkRequirement(sd, items))
return SYNTHESIS_INSUFFICIENT_AMOUNT;
if (!info->deleteRequirement(sd, items))
return SYNTHESIS_INSUFFICIENT_AMOUNT;
if (info->reward)
run_script(info->reward, 0, sd->status.account_id, 0);
sd->state.lapine_ui = sd->last_lapine_box = 0;
return SYNTHESIS_SUCCESS;
}
/**
* Loads lapine synthesis database
*/
void item_synthesis_read_db(void)
{
item_synthesis_db.load();
}
/**
* Reloads the lapine synthesis database
*/
void item_synthesis_db_reload(void)
{
do_final_item_synthesis();
do_init_item_synthesis();
}
/**
* Initializes the lapine synthesis database
*/
void do_init_item_synthesis(void)
{
item_synthesis_db.load();
}
/**
* Finalizes the lapine synthesis database
*/
void do_final_item_synthesis(void) {
item_synthesis_db.clear();
}
/**
* Constructor
*/
s_item_synthesis_db::s_item_synthesis_db()
: source_needed(1)
, sources()
, reward(nullptr)
, source_refine_min(0)
, source_refine_max(MAX_REFINE)
{}
/**
* Destructor
*/
s_item_synthesis_db::~s_item_synthesis_db()
{
if (this->reward) {
script_free_code(this->reward);
this->reward = nullptr;
}
}
/**
* Check if the source for synthesis item is exists
* @param source_id: Item ID of source item
* @return true if source exists, false if doesn't
*/
bool s_item_synthesis_db::sourceExists(t_itemid source_id)
{
if (this->sources.empty())
return false;
auto source = std::find_if(
this->sources.begin(), this->sources.end(),
[&source_id](const s_item_synthesis_source &source) { return source.nameid == source_id; }
);
return (source != this->sources.end());
}
/**
* Check all submitted items are valid
* @param sd: Player
* @param items: Submitted items by player
* @return True if all items are valid
*/
bool s_item_synthesis_db::checkRequirement(map_session_data *sd, const std::vector<s_item_synthesis_list> items)
{
if (items.empty() || items.size() != this->source_needed)
return false;
item *item = nullptr;
item_data *id = nullptr;
std::vector<int> indexes(this->source_needed);
for (auto &it : items) {
if (it.index >= MAX_INVENTORY)
return false;
if (!(item = &sd->inventory.u.items_inventory[it.index]) || !(id = sd->inventory_data[it.index]))
return false;
if (item->equip || item->expire_time || item->amount < it.amount || item->identify != 1)
return false;
if (!this->sourceExists(item->nameid))
return false;
if (item->refine < this->source_refine_min)
return false;
if (item->refine > this->source_refine_max)
return false;
if (std::find(indexes.begin(), indexes.end(), it.index) != indexes.end())
return false;
indexes.push_back(it.index);
}
return true;
}
/**
* Delete all submitted items for synthesis
* @param sd: Player
* @param items: Submitted items by player
* @return True if all items are deleted
*/
bool s_item_synthesis_db::deleteRequirement(map_session_data *sd, const std::vector<s_item_synthesis_list> items)
{
if (items.empty() || items.size() != this->source_needed)
return false;
for (auto &it : items) {
if (it.index >= MAX_INVENTORY)
return false;
if (pc_delitem(sd, it.index, it.amount, 0, 0, LOG_TYPE_OTHER) != 0)
return false;
}
return true;
}
/**
* Synthesis items constructor.
* Set default amount to 1
*/
s_item_synthesis_source::s_item_synthesis_source()
: amount(1)
{
}

View File

@ -0,0 +1,71 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef ITEM_SYNTHESIS_HPP
#define ITEM_SYNTHESIS_HPP
#include <string>
#include <vector>
#include "../common/cbasetypes.hpp"
#include "../common/database.hpp"
#include "../common/mmo.hpp"
#include "clif.hpp"
#include "pc.hpp" // struct map_session_data
#include "itemdb.hpp" // struct item_data, struct s_item_group_db
#include "script.hpp"
#define MAX_SYNTHESIS_SOURCES 10 // Client's limit for source is 10
struct s_item_synthesis_list {
uint16 index;
uint16 amount;
};
struct s_item_synthesis_source {
t_itemid nameid;
uint16 amount;
s_item_synthesis_source();
};
struct s_item_synthesis_db {
t_itemid id;
uint16 source_needed;
std::vector<s_item_synthesis_source> sources;
script_code *reward;
uint16 source_refine_min;
uint16 source_refine_max;
s_item_synthesis_db();
~s_item_synthesis_db();
bool sourceExists(t_itemid source_id);
bool checkRequirement(map_session_data *sd, const std::vector<s_item_synthesis_list> items);
bool deleteRequirement(map_session_data *sd, const std::vector<s_item_synthesis_list> items);
};
class ItemSynthesisDatabase : public TypesafeYamlDatabase<t_itemid, s_item_synthesis_db> {
public:
ItemSynthesisDatabase() : TypesafeYamlDatabase("ITEM_SYNTHESIS_DB", 1) {
}
void clear();
const std::string getDefaultLocation();
uint64 parseBodyNode(const YAML::Node& node);
};
extern ItemSynthesisDatabase item_synthesis_db;
bool item_synthesis_open(map_session_data *sd, t_itemid itemid);
e_item_synthesis_result item_synthesis_submit(map_session_data *sd, t_itemid itemid, const std::vector<s_item_synthesis_list> items);
void item_synthesis_read_db(void);
void item_synthesis_db_reload(void);
void do_init_item_synthesis(void);
void do_final_item_synthesis(void);
#endif /* ITEM_SYNTHESIS_HPP */

334
src/map/item_upgrade.cpp Normal file
View File

@ -0,0 +1,334 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#include "item_upgrade.hpp"
#include <algorithm>
#include <memory>
#include "../common/nullpo.hpp"
#include "../common/showmsg.hpp"
#include "log.hpp" // e_log_pick_type
ItemUpgradeDatabase item_upgrade_db;
void ItemUpgradeDatabase::clear() {
TypesafeYamlDatabase::clear();
}
const std::string ItemUpgradeDatabase::getDefaultLocation() {
return std::string(db_path) + "/item_upgrade.yml";
}
/**
* Reads and parses an entry from the item_upgrade file.
* @param node: YAML node containing the entry.
* @return count of successfully parsed rows
*/
uint64 ItemUpgradeDatabase::parseBodyNode(const YAML::Node &node) {
std::string upgrade_item_name;
if (!this->asString(node, "Item", upgrade_item_name))
return 0;
std::shared_ptr<item_data> item = item_db.search_aegisname(upgrade_item_name.c_str());
if (item == nullptr) {
this->invalidWarning(node["Item"], "Item name for Upgrade Box %s does not exist.\n", upgrade_item_name.c_str());
return 0;
}
std::shared_ptr<s_item_upgrade_db> entry = this->find(item->nameid);
bool exists = entry != nullptr;
if (!exists) {
if (!this->nodesExist(node, { "TargetItem", "Result" }))
return 0;
entry = std::make_shared<s_item_upgrade_db>();
entry->id = item->nameid;
}
if (this->nodeExists(node, "Result")) {
std::string script_str;
script_code *code;
if (!this->asString(node, "Result", script_str))
return 0;
if (!(code = parse_script(script_str.c_str(), this->getCurrentFile().c_str(), item->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS))) {
this->invalidWarning(node["Result"], "Invalid Result item script.\n");
return 0;
}
if (entry->result)
script_free_code(entry->result);
entry->result = code;
}
if (exists && this->nodeExists(node, "ClearTargetItem")) {
ShowNotice("item_upgrade: Cleared all items in TargetItem. Upgrade: %s (%u)\n", item->name.c_str(), item->nameid);
if (!entry->targets.empty())
entry->targets.clear();
}
if (this->nodeExists(node, "TargetItem")) {
const YAML::Node& targetNode = node["TargetItem"];
std::string target_item_name;
for (const YAML::Node &target : targetNode) {
if (!this->asString(target, "Item", target_item_name))
continue;
std::shared_ptr<item_data> target_item = item_db.search_aegisname(target_item_name.c_str());
if (target_item == nullptr) {
this->invalidWarning(node["TargetItem"], "Target item name %s does not exist, skipping.\n", target_item_name.c_str());
continue;
}
t_itemid itemid = target_item->nameid;
if (exists && this->nodeExists(target, "Remove")) {
entry->targets.erase(std::remove_if(entry->targets.begin(), entry->targets.end(), [&itemid](const t_itemid &x) { return x == itemid; }));
ShowNotice("item_upgrade: Removed %s (%u) from TargetItem. Upgrade: %s (%u)\n", target_item->name.c_str(), itemid, item->name.c_str(), item->nameid);
continue;
}
entry->targets.push_back(itemid);
}
}
if (this->nodeExists(node, "NeedRefineMin")) {
if (!this->asUInt16(node, "NeedRefineMin", entry->source_refine_min))
return 0;
}
if (this->nodeExists(node, "NeedRefineMax")) {
if (!this->asUInt16(node, "NeedRefineMax", entry->source_refine_max))
return 0;
}
if (this->nodeExists(node, "NeedOptionNumMin")) {
if (!this->asUInt16(node, "NeedOptionNumMin", entry->need_option_num))
return 0;
}
if (this->nodeExists(node, "NotSocketEnchantItem")) {
if (!this->asBool(node, "NotSocketEnchantItem", entry->not_socket_enchant))
return 0;
}
if (!exists)
this->put(item->nameid, entry);
return 1;
}
/**
* Attempt to open upgrade UI for a player
* @param sd: Open UI for this player
* @param itemid: ID of upgrade UI
* @return True on succes, false on failure
*/
bool item_upgrade_open(map_session_data *sd, t_itemid itemid) {
nullpo_retr(false, sd);
if (pc_cant_act2(sd) || (sd)->chatID)
return false;
if (pc_is90overweight(sd) || !pc_inventoryblank(sd)) {
clif_msg(sd, ITEM_CANT_OBTAIN_WEIGHT);
return false;
}
if (!item_upgrade_db.exists(itemid))
return false;
if (clif_lapine_upgrade_open(sd, itemid)) {
sd->last_lapine_box = itemid;
sd->state.lapine_ui = 2;
}
return true;
}
/**
* Process selected item from player's input
* @param sd: Player
* @param source_itemid: Item ID of source item to open Upgrade UI
* @param target_index: Index of target item in player's inventory
* @return LAPINE_UPRAGDE_SUCCESS on success. @see e_item_upgrade_result
*/
e_item_upgrade_result item_upgrade_submit(map_session_data *sd, t_itemid source_itemid, uint16 target_index) {
nullpo_retr(LAPINE_UPRAGDE_FAILURE, sd);
if (!sd->state.lapine_ui || source_itemid != sd->last_lapine_box) {
sd->state.lapine_ui = sd->last_lapine_box = 0;
return LAPINE_UPRAGDE_FAILURE;
}
item *it;
if (target_index >= MAX_INVENTORY || !sd->inventory_data[target_index] || !(it = &sd->inventory.u.items_inventory[target_index]))
return LAPINE_UPRAGDE_FAILURE;
if (it->expire_time || it->equip || it->identify != 1)
return LAPINE_UPRAGDE_FAILURE;
auto info = item_upgrade_db.find(source_itemid);
if (!info || !info->targetExists(it->nameid) || !info->checkRequirement(it, sd->inventory_data[target_index]))
return LAPINE_UPRAGDE_FAILURE;
info->setPlayerInfo(sd, target_index, it);
if (info->delete_target_onsuccess)
pc_delitem(sd, target_index, 1, 0, 0, LOG_TYPE_OTHER);
sd->state.lapine_ui = sd->last_lapine_box = 0;
if (info->result)
run_script(info->result, 0, sd->status.account_id, 0);
return LAPINE_UPRAGDE_SUCCESS;
}
/**
* Loads lapine upgrade database
*/
void item_upgrade_read_db(void)
{
item_upgrade_db.load();
}
/**
* Reloads the lapine upgrade database
*/
void item_upgrade_db_reload(void)
{
do_final_item_upgrade();
do_init_item_upgrade();
}
/**
* Initializes the lapine upgrade database
*/
void do_init_item_upgrade(void)
{
item_upgrade_db.load();
}
/**
* Finalizes the lapine upgrade database
*/
void do_final_item_upgrade(void) {
item_upgrade_db.clear();
}
/**
* Constructor
*/
s_item_upgrade_db::s_item_upgrade_db()
: targets()
, result(nullptr)
, source_refine_min(0)
, source_refine_max(MAX_REFINE)
, need_option_num(0)
, not_socket_enchant(false)
, delete_target_onsuccess(true)
{}
/**
* Destructor
*/
s_item_upgrade_db::~s_item_upgrade_db()
{
if (this->result) {
script_free_code(this->result);
this->result = nullptr;
}
}
/**
* Check if submitted target item is valid
* @param target_id: Item ID of target item
* @return True if exist, false if not
*/
bool s_item_upgrade_db::targetExists(t_itemid target_id)
{
if (this->targets.empty())
return false;
auto target = std::find(this->targets.begin(), this->targets.end(), target_id);
return (target != this->targets.end());
}
/**
* Check if the target item is valid
* @param it: Target item
* @param id: Item data
* @return True if valid, false if invalid
*/
bool s_item_upgrade_db::checkRequirement(item *it, item_data *id)
{
if (this->source_refine_min > it->refine)
return false;
if (this->source_refine_max < it->refine)
return false;
if (this->not_socket_enchant) {
for (int i = id->slots; i < MAX_SLOTS; i++) {
if (it->card[i])
return false;
}
}
if (this->need_option_num) {
int c = 0;
for (int i = 0; i < MAX_ITEM_RDM_OPT; i++) {
if (it->option[i].id)
c++;
}
if (c < this->need_option_num)
return false;
}
return true;
}
/**
* Set variables for player on success upgrade process
* @param sd: Player
* @param target_index: Index of player's inventory items as upgrade target
* @param it: Latest item data
*/
void s_item_upgrade_db::setPlayerInfo(map_session_data * sd, uint16 target_index, item *it)
{
pc_setreg(sd, add_str("@last_lapine_id"), it->nameid);
pc_setreg(sd, add_str("@last_lapine_idx"), target_index);
pc_setreg(sd, add_str("@last_lapine_refine"), it->refine);
pc_setreg(sd, add_str("@last_lapine_attribute"), it->attribute);
pc_setreg(sd, add_str("@last_lapine_card1"), it->card[0]);
pc_setreg(sd, add_str("@last_lapine_card2"), it->card[1]);
pc_setreg(sd, add_str("@last_lapine_card3"), it->card[2]);
pc_setreg(sd, add_str("@last_lapine_card4"), it->card[3]);
pc_setreg(sd, add_str("@last_lapine_bound"), it->bound);
char unique_id[23];
memset(unique_id, '\0', sizeof(unique_id));
snprintf(unique_id, sizeof(unique_id), "%llu", (unsigned long long)it->unique_id);
pc_setregstr(sd, add_str("@last_lapine_uniqueid$"), unique_id);
int key_opt_id = 0, key_opt_value = 0, key_opt_param = 0;
script_cleararray_pc(sd, "@last_lapine_option_id");
script_cleararray_pc(sd, "@last_lapine_option_value");
script_cleararray_pc(sd, "@last_lapine_option_param");
for (int i = 0; i < MAX_ITEM_RDM_OPT; i++) {
script_setarray_pc(sd, "@last_lapine_option_id", i, (intptr_t)it->option[i].id, &key_opt_id);
script_setarray_pc(sd, "@last_lapine_option_value", i, (intptr_t)it->option[i].value, &key_opt_value);
script_setarray_pc(sd, "@last_lapine_option_param", i, (intptr_t)it->option[i].param, &key_opt_param);
}
}

59
src/map/item_upgrade.hpp Normal file
View File

@ -0,0 +1,59 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef ITEM_UPGRADE_HPP
#define ITEM_UPGRADE_HPP
#include <string>
#include <vector>
#include "../common/cbasetypes.hpp"
#include "../common/database.hpp"
#include "../common/mmo.hpp"
#include "clif.hpp"
#include "pc.hpp" // struct map_session_data
#include "itemdb.hpp" // struct item_data, struct s_item_group_db
#include "script.hpp"
struct s_item_upgrade_db {
t_itemid id;
std::vector<t_itemid> targets;
script_code *result;
uint16 source_refine_min;
uint16 source_refine_max;
uint16 need_option_num;
bool not_socket_enchant;
bool delete_target_onsuccess;
s_item_upgrade_db();
~s_item_upgrade_db();
bool targetExists(t_itemid target_id);
bool checkRequirement(item *it, item_data *id);
void setPlayerInfo(map_session_data *sd, uint16 target_index, item *it);
};
class ItemUpgradeDatabase : public TypesafeYamlDatabase<t_itemid, s_item_upgrade_db> {
public:
ItemUpgradeDatabase() : TypesafeYamlDatabase("ITEM_UPGRADE_DB", 1) {
}
void clear();
const std::string getDefaultLocation();
uint64 parseBodyNode(const YAML::Node& node);
};
extern ItemUpgradeDatabase item_upgrade_db;
bool item_upgrade_open(map_session_data *sd, t_itemid itemid);
e_item_upgrade_result item_upgrade_submit(map_session_data *sd, t_itemid source_itemid, uint16 target_index);
void item_upgrade_read_db(void);
void item_upgrade_db_reload(void);
void do_init_item_upgrade(void);
void do_final_item_upgrade(void);
#endif /* ITEM_UPGRADE_HPP */

View File

@ -759,6 +759,55 @@ enum e_random_item_group {
IG_XMAS_PACKAGE_14,
IG_EASTER_EGG,
IG_PITAPAT_BOX,
IG_BS_SHA_M_S_1,
IG_BS_SHA_M_S_17,
IG_BS_SHA_M_S_18,
IG_BS_SHA_M_S_19,
IG_BS_SHA_M_S_20,
IG_BS_ITEM_M_S_12,
IG_BS_ITEM_M_S_15,
IG_BS_SHA_M_S_5,
IG_BS_SHA_M_S_6,
IG_BS_SHA_M_S_7,
IG_BS_SHA_M_S_8,
IG_BS_SHA_M_S_13,
IG_BS_SHA_M_S_15,
IG_BS_SHA_M_S_16,
IG_BS_SHA_M_S_23,
IG_BS_ITEM_M_S_5,
IG_BS_SHA_M_S_9,
IG_BS_SHA_M_S_10,
IG_BS_SHA_M_S_11,
IG_BS_SHA_M_S_21,
IG_BS_SHA_M_S_22,
IG_BS_SHA_M_S_3,
IG_BS_SHA_M_S_4,
IG_BS_SHA_M_S_12,
IG_BS_SHA_M_S_14,
IG_BS_SHA_M_S_24,
IG_BS_SHA_M_S_25,
IG_PHYSICALMAGICAL_MIX,
IG_SILVER_STATUE,
IG_STABILITY_SHADOW_BOX,
IG_RACE_SHADOW_BOX,
IG_BEARERS_S_CONVERSION_BOX,
IG_GEMSTONE_S_CONVERSION_BOX,
IG_STATUS_S_CONVERSION_BOX,
IG_SHADOW_EXCHANGE_BOX,
IG_COSTUME_ENCHANT_STONE_BOX,
IG_PIERCING_SHADOW_BOX,
IG_ENCHANTSTONE_RECIPE_4M,
IG_ENCHANTSTONE_RECIPE_9M,
IG_CLASS_SHADOW_PENDANT,
IG_CLASS_SHADOW_EARRING,
IG_CLASS_SHADOW_SHIELD,
IG_CLASS_SHADOW_SHOES,
IG_CLASS_SHADOW_ARMOR,
IG_CLASS_SHADOW_WEAPON,
IG_COSTUME_EXCHANGE_BOX,
IG_COLLECTIBLES_EXCHANGE_BOX,
IG_PERFECTSIZE_MIX,
IG_MAGICPIERCING_MIX,
IG_MAX,
};

View File

@ -186,6 +186,8 @@
<ClInclude Include="instance.hpp" />
<ClInclude Include="intif.hpp" />
<ClInclude Include="itemdb.hpp" />
<ClInclude Include="item_synthesis.hpp" />
<ClInclude Include="item_upgrade.hpp" />
<ClInclude Include="log.hpp" />
<ClInclude Include="mail.hpp" />
<ClInclude Include="map.hpp" />
@ -231,6 +233,8 @@
<ClCompile Include="instance.cpp" />
<ClCompile Include="intif.cpp" />
<ClCompile Include="itemdb.cpp" />
<ClCompile Include="item_synthesis.cpp" />
<ClCompile Include="item_upgrade.cpp" />
<ClCompile Include="log.cpp" />
<ClCompile Include="mail.cpp" />
<ClCompile Include="map.cpp" />
@ -316,6 +320,12 @@
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_db.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_group_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_group_db.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_noequip.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_noequip.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_db.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_group.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_group.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_stack.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_stack.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_trade.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_trade.txt')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_synthesis.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_synthesis.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_upgrade.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_upgrade.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_db.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_db.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\item_randomopt_group.yml" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\item_randomopt_group.yml')" />
<Copy SourceFiles="$(SolutionDir)db\import-tmpl\job_basehpsp_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\job_basehpsp_db.txt')" />

View File

@ -149,6 +149,12 @@
<ClInclude Include="vending.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="item_upgrade.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="item_synthesis.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="achievement.cpp">
@ -274,5 +280,11 @@
<ClCompile Include="vending.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="item_upgrade.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="item_synthesis.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -37,6 +37,8 @@
#include "homunculus.hpp"
#include "instance.hpp"
#include "intif.hpp"
#include "item_upgrade.hpp"
#include "item_synthesis.hpp"
#include "log.hpp"
#include "mapreg.hpp"
#include "mercenary.hpp"
@ -4935,6 +4937,8 @@ void do_final(void){
do_final_channel(); //should be called after final guild
do_final_vending();
do_final_buyingstore();
do_final_item_upgrade();
do_final_item_synthesis();
do_final_path();
map_db->destroy(map_db, map_db_final);
@ -5258,6 +5262,8 @@ int do_init(int argc, char *argv[])
do_init_quest();
do_init_achievement();
do_init_battleground();
do_init_item_upgrade();
do_init_item_synthesis();
do_init_npc();
do_init_unit();
do_init_duel();

View File

@ -343,6 +343,7 @@ struct map_session_data {
bool mail_writing; // Whether the player is currently writing a mail in RODEX or not
bool cashshop_open;
bool sale_open;
unsigned int lapine_ui : 3; // Lapine Synthesis/Upgrade UI is opened
unsigned int block_action : 10;
bool refineui_open;
} state;
@ -797,6 +798,7 @@ struct map_session_data {
e_instance_mode instance_mode; ///< Mode of instance player last leaves from (used for instance destruction button)
short setlook_head_top, setlook_head_mid, setlook_head_bottom, setlook_robe; ///< Stores 'setlook' script command values.
t_itemid last_lapine_box;
#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO)
std::vector<int16> hatEffects;
@ -986,7 +988,7 @@ extern struct s_job_info job_info[CLASS_COUNT];
#define pc_istrading(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->state.trading )
// equals pc_cant_act2 and additionally checks for chat rooms and npcs
#define pc_cant_act(sd) ( (sd)->npc_id || (sd)->chatID || pc_cant_act2( (sd) ) )
#define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend || (sd)->state.refineui_open )
#define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend || (sd)->state.refineui_open || (sd)->state.lapine_ui )
#define pc_setdir(sd,b,h) ( (sd)->ud.dir = (b) ,(sd)->head_dir = (h) )
#define pc_setchatid(sd,n) ( (sd)->chatID = n )

View File

@ -47,6 +47,8 @@
#include "instance.hpp"
#include "intif.hpp"
#include "itemdb.hpp"
#include "item_synthesis.hpp"
#include "item_upgrade.hpp"
#include "log.hpp"
#include "mail.hpp"
#include "map.hpp"
@ -25230,6 +25232,36 @@ BUILDIN_FUNC(getvariableofinstance)
return SCRIPT_CMD_SUCCESS;
}
/** Open Item Synthesis UI
* synthesisui(<id>);
*/
BUILDIN_FUNC(synthesisui) {
#ifdef FEATURE_LAPINE_UI
TBL_PC *sd;
if (!script_charid2sd(3, sd)) {
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
script_pushint(st, item_synthesis_open(sd, script_getnum(st, 2)));
#endif
return SCRIPT_CMD_SUCCESS;
}
/** Open Item Upgrade UI
* upgradeui(<id>);
*/
BUILDIN_FUNC(upgradeui) {
#ifdef FEATURE_LAPINE_UI
TBL_PC *sd;
if (!script_charid2sd(3, sd)) {
script_pushint(st, 0);
return SCRIPT_CMD_FAILURE;
}
script_pushint(st, item_upgrade_open(sd, script_getnum(st, 2)));
#endif
return SCRIPT_CMD_SUCCESS;
}
/*
convertpcinfo(<char_id>,<type>)
convertpcinfo(<account_id>,<type>)
@ -26062,6 +26094,8 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(achievement_condition,"i"),
BUILDIN_DEF(getvariableofinstance,"ri"),
BUILDIN_DEF(synthesisui, "i"),
BUILDIN_DEF(upgradeui, "i"),
BUILDIN_DEF(convertpcinfo,"vi"),
BUILDIN_DEF(isnpccloaked, "??"),

View File

@ -5250,6 +5250,55 @@
export_constant(IG_XMAS_PACKAGE_14);
export_constant(IG_EASTER_EGG);
export_constant(IG_PITAPAT_BOX);
export_constant(IG_BS_SHA_M_S_1);
export_constant(IG_BS_SHA_M_S_17);
export_constant(IG_BS_SHA_M_S_18);
export_constant(IG_BS_SHA_M_S_19);
export_constant(IG_BS_SHA_M_S_20);
export_constant(IG_BS_ITEM_M_S_12);
export_constant(IG_BS_ITEM_M_S_15);
export_constant(IG_BS_SHA_M_S_5);
export_constant(IG_BS_SHA_M_S_6);
export_constant(IG_BS_SHA_M_S_7);
export_constant(IG_BS_SHA_M_S_8);
export_constant(IG_BS_SHA_M_S_13);
export_constant(IG_BS_SHA_M_S_15);
export_constant(IG_BS_SHA_M_S_16);
export_constant(IG_BS_SHA_M_S_23);
export_constant(IG_BS_ITEM_M_S_5);
export_constant(IG_BS_SHA_M_S_9);
export_constant(IG_BS_SHA_M_S_10);
export_constant(IG_BS_SHA_M_S_11);
export_constant(IG_BS_SHA_M_S_21);
export_constant(IG_BS_SHA_M_S_22);
export_constant(IG_BS_SHA_M_S_3);
export_constant(IG_BS_SHA_M_S_4);
export_constant(IG_BS_SHA_M_S_12);
export_constant(IG_BS_SHA_M_S_14);
export_constant(IG_BS_SHA_M_S_24);
export_constant(IG_BS_SHA_M_S_25);
export_constant(IG_PHYSICALMAGICAL_MIX);
export_constant(IG_SILVER_STATUE);
export_constant(IG_STABILITY_SHADOW_BOX);
export_constant(IG_RACE_SHADOW_BOX);
export_constant(IG_BEARERS_S_CONVERSION_BOX);
export_constant(IG_GEMSTONE_S_CONVERSION_BOX);
export_constant(IG_STATUS_S_CONVERSION_BOX);
export_constant(IG_SHADOW_EXCHANGE_BOX);
export_constant(IG_COSTUME_ENCHANT_STONE_BOX);
export_constant(IG_PIERCING_SHADOW_BOX);
export_constant(IG_ENCHANTSTONE_RECIPE_4M);
export_constant(IG_ENCHANTSTONE_RECIPE_9M);
export_constant(IG_CLASS_SHADOW_PENDANT);
export_constant(IG_CLASS_SHADOW_EARRING);
export_constant(IG_CLASS_SHADOW_SHIELD);
export_constant(IG_CLASS_SHADOW_SHOES);
export_constant(IG_CLASS_SHADOW_ARMOR);
export_constant(IG_CLASS_SHADOW_WEAPON);
export_constant(IG_COSTUME_EXCHANGE_BOX);
export_constant(IG_COLLECTIBLES_EXCHANGE_BOX);
export_constant(IG_PERFECTSIZE_MIX);
export_constant(IG_MAGICPIERCING_MIX);
/* unit stop walking */
export_constant(USW_NONE);