Compare commits
56 Commits
master
...
feature/la
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4eaa33c221 | ||
![]() |
d8b35cb2f5 | ||
![]() |
0a32c1731a | ||
![]() |
97af1d5c2c | ||
![]() |
d2ac0d96fc | ||
![]() |
32b0b5ed18 | ||
![]() |
4a2a2ab483 | ||
![]() |
432dfd05f9 | ||
![]() |
3369b00a79 | ||
![]() |
667e9dd7cf | ||
![]() |
9ebdb0dec3 | ||
![]() |
70feb94f30 | ||
![]() |
e188374f43 | ||
![]() |
bf9bcbe9f7 | ||
![]() |
c8a3b7dc16 | ||
![]() |
6d69a4dc46 | ||
![]() |
72b57720f6 | ||
![]() |
b4ef4db25f | ||
![]() |
5e598936c1 | ||
![]() |
9dab8f91da | ||
![]() |
d79513402d | ||
![]() |
89dc2df2ab | ||
![]() |
0dae6b4251 | ||
![]() |
de5bf08898 | ||
![]() |
51bb52af2e | ||
![]() |
93cfc55118 | ||
![]() |
b44f0e66f4 | ||
![]() |
2bf7e818b7 | ||
![]() |
22da4efed2 | ||
![]() |
616ca96c92 | ||
![]() |
480e6e75bd | ||
![]() |
a02e829d03 | ||
![]() |
30cb8fa9a2 | ||
![]() |
d13eed6cd8 | ||
![]() |
be9fc60377 | ||
![]() |
4ef7888af9 | ||
![]() |
50bda6a46c | ||
![]() |
f41f65f437 | ||
![]() |
91fb8e8378 | ||
![]() |
c1c02048f9 | ||
![]() |
0368896510 | ||
![]() |
38a05e9b28 | ||
![]() |
7c7e8885c1 | ||
![]() |
dc0d74266b | ||
![]() |
70642d405f | ||
![]() |
c56b4985da | ||
![]() |
c16cbc55ec | ||
![]() |
80218e99e2 | ||
![]() |
22c466ba65 | ||
![]() |
7d9d112ec2 | ||
![]() |
c8bd4dbf6a | ||
![]() |
9e05ed3397 | ||
![]() |
fe16295762 | ||
![]() |
6abd8463b9 | ||
![]() |
600ff371c2 | ||
![]() |
10f0ead08f |
@ -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
|
||||
|
39
db/import-tmpl/item_synthesis.yml
Normal file
39
db/import-tmpl/item_synthesis.yml
Normal 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
|
39
db/import-tmpl/item_upgrade.yml
Normal file
39
db/import-tmpl/item_upgrade.yml
Normal 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
45
db/item_synthesis.yml
Normal 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
45
db/item_upgrade.yml
Normal 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
|
@ -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
|
||||
|
@ -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
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
2997
db/re/item_upgrade.yml
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 |
|
||||
==============================
|
||||
|
@ -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.|
|
||||
========================
|
||||
|
2097
npc/re/other/LapineEnchants.txt
Normal file
2097
npc/re/other/LapineEnchants.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 -------------------------------------------------
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
264
src/map/clif.cpp
264
src/map/clif.cpp
@ -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
|
||||
*------------------------------------------*/
|
||||
|
@ -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 */
|
||||
|
@ -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
344
src/map/item_synthesis.cpp
Normal 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)
|
||||
{
|
||||
}
|
71
src/map/item_synthesis.hpp
Normal file
71
src/map/item_synthesis.hpp
Normal 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
334
src/map/item_upgrade.cpp
Normal 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
59
src/map/item_upgrade.hpp
Normal 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 */
|
@ -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,
|
||||
};
|
||||
|
@ -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')" />
|
||||
|
@ -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>
|
||||
|
@ -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();
|
||||
|
@ -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 )
|
||||
|
@ -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, "??"),
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user