Merge of Rytech's 4CrAM (#6414)
Merged Rytech2/4CrAM-Open@978d4fc406 Original author is @Rytech2 and all credits belong to him. Cleanups by @Lemongrass3110, @aleos89 and @Atemo. Co-authored-by: Rytech2 <rytech16@gmail.com> Co-authored-by: aleos <aleos89@users.noreply.github.com> Co-authored-by: Atemo <capucrath@gmail.com>
This commit is contained in:
parent
5105a03aec
commit
7556453dfc
@ -335,6 +335,10 @@ Body:
|
||||
Help: |
|
||||
Params: [<HP> <SP>]
|
||||
Heals the desired amount of HP and SP. No value specified will do a full heal.
|
||||
- Command: healap
|
||||
Help: |
|
||||
Params: [<AP>]
|
||||
Heals the desired amount of AP. No value specified will do a full AP heal.
|
||||
- Command: dye
|
||||
Aliases:
|
||||
- ccolor
|
||||
@ -480,6 +484,9 @@ Body:
|
||||
- Command: stpoint
|
||||
Help: |
|
||||
Params: <number of points> - Gives you the desired number of stat points.
|
||||
- Command: trpoint
|
||||
Help: |
|
||||
Params: <number of points> - Gives you the desired number of trait stat points.
|
||||
- Command: skpoint
|
||||
Help: |
|
||||
Params: <number of points> - Gives you the desired number of skill points.
|
||||
|
@ -102,6 +102,11 @@ disp_zeny: no
|
||||
// through external means (ie: stat point buyers/sellers)
|
||||
use_statpoint_table: yes
|
||||
|
||||
// Use the contents of db/statpoint.yml when doing a stats reset and leveling up? (Note 1)
|
||||
// If no, an equation will be used which preserves trait points earned/lost
|
||||
// through external means (ie: trait point buyers/sellers)
|
||||
use_traitpoint_table: yes
|
||||
|
||||
// EXP cost for cast PR_REDEMPTIO (Note 2)
|
||||
exp_cost_redemptio: 1
|
||||
|
||||
|
@ -108,14 +108,11 @@ max_baby_parameter: 80
|
||||
max_baby_third_parameter: 117
|
||||
max_extended_parameter: 125
|
||||
max_summoner_parameter: 120
|
||||
max_fourth_parameter: 135
|
||||
max_fourth_parameter: 130
|
||||
|
||||
// Status points bonus for transcendent class
|
||||
transcendent_status_points: 52
|
||||
|
||||
// Maximum traits for fourth class. (pow, sta, wis, spl, con, and crt)
|
||||
max_fourth_trait: 100
|
||||
|
||||
// Max armor def/mdef
|
||||
// NOTE: This setting have no effect if server is run on Renewal Mode (RENEWAL)
|
||||
// NOTE: does not affects skills and status effects like Mental Strength
|
||||
@ -288,3 +285,45 @@ idletime_option: 0x7C1F
|
||||
// - Summoners are small size (0) instead of medium (1)
|
||||
summoner_race: 11
|
||||
summoner_size: 0
|
||||
|
||||
//================================
|
||||
// 4th Job Systems
|
||||
//================================
|
||||
// How many trait points do players get when changing to a 4th job?
|
||||
// Default: 7
|
||||
trait_points_job_change: 7
|
||||
|
||||
// Max trait stats cap.
|
||||
// Trait Stats: POW, STA, WIS, SPL, CON, CRT
|
||||
// Official is 100.
|
||||
max_trait_parameter: 100
|
||||
|
||||
// Max amount of RES/MRES to take into the resistance damage reduction formula.
|
||||
// A setting of 625 means the max reduction of damage allowed is 50.0%.
|
||||
// Formula is 100 - 100 * (5000 + RES) / (5000 + 10 * RES)
|
||||
// Note: Best to leave this setting alone unless you know what your doing.
|
||||
// Default: 625
|
||||
max_res_mres_reduction: 625
|
||||
|
||||
// Maximum AP
|
||||
// Default: 1000
|
||||
max_ap: 1000
|
||||
|
||||
// Players' maximum AP rate? (Default is 100)
|
||||
ap_rate: 100
|
||||
|
||||
// The amount of AP a player will respawn with, 0 is default.
|
||||
// (Unit is in percentage of total AP, 100 is full heal of AP, 0 is respawn with 0 AP total.)
|
||||
restart_ap_rate: 0
|
||||
|
||||
// Is AP lost when the player dies?
|
||||
// Default: yes
|
||||
loose_ap_on_death: yes
|
||||
|
||||
// Is AP lost when the player enters a PVP/GVG/WoE/Battleground maps?
|
||||
// Default: yes
|
||||
loose_ap_on_map: yes
|
||||
|
||||
// Do player's keep their AP when logging out?
|
||||
// Default: yes
|
||||
keep_ap_on_logout: yes
|
||||
|
@ -274,8 +274,9 @@ sg_miracle_skill_duration: 3600000
|
||||
sg_angel_skill_ratio: 10
|
||||
|
||||
// Skills that bHealPower has effect on
|
||||
// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun
|
||||
skill_add_heal_rate: 7
|
||||
// 1: Heal, 2: Sanctuary, 4: Potion Pitcher, 8: Slim Pitcher, 16: Apple of Idun,
|
||||
// 32: Coluceo Heal, 64: Highness Heal, 128: Mediale Votum, 256: Dilectio Heal
|
||||
skill_add_heal_rate: 487
|
||||
|
||||
// Whether the damage of EarthQuake with a single target on screen is able to be reflected.
|
||||
// Note: On official servers, EQ is reflectable when there is only one target on the screen,
|
||||
@ -410,3 +411,7 @@ skill_drop_items_full: no
|
||||
// 2: Enabled on renewal.
|
||||
// 3: 1+2
|
||||
switch_remove_edp: 2
|
||||
|
||||
// Max Level Difference when casting Meister's Attack Machine on other party members.
|
||||
// Default: 15
|
||||
attack_machine_level_difference: 15
|
||||
|
@ -142,13 +142,13 @@
|
||||
132: Inquisitor
|
||||
133: Troubadour
|
||||
134: Trouvere
|
||||
144: Sky Emperor
|
||||
145: Soul Ascetic
|
||||
146: Shinkiro
|
||||
147: Shiranui
|
||||
148: Night Watch
|
||||
149: Hyper Novice
|
||||
150: Spirit Handler
|
||||
135: Sky Emperor
|
||||
136: Soul Ascetic
|
||||
137: Shinkiro
|
||||
138: Shiranui
|
||||
139: Night Watch
|
||||
140: Hyper Novice
|
||||
141: Spirit Handler
|
||||
|
||||
199: Unknown Job
|
||||
|
||||
|
@ -899,7 +899,27 @@
|
||||
818: Hyper Novice
|
||||
819: Spirit Handler
|
||||
|
||||
//820-899 free
|
||||
// @trpoint
|
||||
820: Please enter a number (usage: @trpoint <number of points>).
|
||||
|
||||
// @chargeap
|
||||
821: AP recovered.
|
||||
822: AP modified.
|
||||
823: AP have already been recovered.
|
||||
|
||||
// @displayskillcast
|
||||
824: Usage: @displayskillcast <skill ID> {<skill level> <ground target flag> <cast time>}
|
||||
|
||||
// @displayskill (2nd Message Line)
|
||||
825: Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
|
||||
|
||||
// @displayskillunit
|
||||
826: Usage: @displayskillunit <unit ID> {<skill level> <range>}
|
||||
|
||||
// @mobinfo RES/MRES
|
||||
827: RES:%d MRES:%d
|
||||
|
||||
//828-899 free
|
||||
|
||||
//------------------------------------
|
||||
// More atcommands message
|
||||
@ -1220,7 +1240,7 @@
|
||||
1165: Usage: @useskill <skill ID> <skill level> <char name>
|
||||
|
||||
// @displayskill
|
||||
1166: Usage: @displayskill <skill ID> {<skill level>}
|
||||
1166: Usage: @displayskill <skill ID> {<skill level> <type>}
|
||||
|
||||
// @skilltree
|
||||
1167: Usage: @skilltree <skill ID> <char name>
|
||||
|
@ -36,6 +36,8 @@
|
||||
# Attack2 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
|
||||
# Defense Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicDefense Magic defense of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Resistance Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicResistance Magic resistance of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Str Strength which affects attack. (Default: 1)
|
||||
# Agi Agility which affects flee. (Default: 1)
|
||||
# Vit Vitality which affects defense. (Default: 1)
|
||||
@ -75,7 +77,7 @@
|
||||
|
||||
Header:
|
||||
Type: MOB_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
#Body:
|
||||
# eAthena Dev Team
|
||||
|
@ -49,6 +49,9 @@
|
||||
# Knockback: Amount of tiles the skill knockbacks. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Knockback count at specific skill level.
|
||||
# GiveAp: Gives AP on successful skill cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP gained at specific skill level.
|
||||
# CopyFlags: Determines if the skill is copyable. (Optional)
|
||||
# Skill: Type of skill that can copy.
|
||||
# RemoveRequirement: Remove a requirement type. (Optional)
|
||||
@ -87,12 +90,18 @@
|
||||
# SpCost: SP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP required at specific skill level.
|
||||
# ApCost: AP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP required at specific skill level.
|
||||
# HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount HP rate required at specific skill level.
|
||||
# SpRateCost: SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP rate required at specific skill level.
|
||||
# ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP rate required at specific skill level.
|
||||
# MaxHpTrigger: Maximum amount of HP to cast the skill. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Maximum HP trigger required at specific skill level.
|
||||
@ -130,4 +139,4 @@
|
||||
|
||||
Header:
|
||||
Type: SKILL_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
@ -24,8 +24,9 @@
|
||||
###########################################################################
|
||||
# - Level BaseLevel required.
|
||||
# Points Total status points given from BaseLevel 1 to 'Level'.
|
||||
# TraitPoints Total trait points given from BaseLevel 1 to 'Level'.
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
Type: STATPOINT_DB
|
||||
Version: 1
|
||||
Version: 2
|
||||
|
@ -36,6 +36,8 @@
|
||||
# Attack2 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
|
||||
# Defense Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicDefense Magic defense of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Resistance Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicResistance Magic resistance of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Str Strength which affects attack. (Default: 1)
|
||||
# Agi Agility which affects flee. (Default: 1)
|
||||
# Vit Vitality which affects defense. (Default: 1)
|
||||
@ -75,7 +77,7 @@
|
||||
|
||||
Header:
|
||||
Type: MOB_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
Footer:
|
||||
Imports:
|
||||
|
@ -36,6 +36,8 @@
|
||||
# Attack2 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
|
||||
# Defense Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicDefense Magic defense of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Resistance Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicResistance Magic resistance of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Str Strength which affects attack. (Default: 1)
|
||||
# Agi Agility which affects flee. (Default: 1)
|
||||
# Vit Vitality which affects defense. (Default: 1)
|
||||
@ -75,7 +77,7 @@
|
||||
|
||||
Header:
|
||||
Type: MOB_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
Body:
|
||||
- Id: 1001
|
||||
|
@ -49,6 +49,9 @@
|
||||
# Knockback: Amount of tiles the skill knockbacks. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Knockback count at specific skill level.
|
||||
# GiveAp: Gives AP on successful skill cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP gained at specific skill level.
|
||||
# CopyFlags: Determines if the skill is copyable. (Optional)
|
||||
# Skill: Type of skill that can copy.
|
||||
# RemoveRequirement: Remove a requirement type. (Optional)
|
||||
@ -87,12 +90,18 @@
|
||||
# SpCost: SP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP required at specific skill level.
|
||||
# ApCost: AP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP required at specific skill level.
|
||||
# HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount HP rate required at specific skill level.
|
||||
# SpRateCost: SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP rate required at specific skill level.
|
||||
# ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP rate required at specific skill level.
|
||||
# MaxHpTrigger: Maximum amount of HP to cast the skill. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Maximum HP trigger required at specific skill level.
|
||||
@ -130,7 +139,7 @@
|
||||
|
||||
Header:
|
||||
Type: SKILL_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
Body:
|
||||
- Id: 1
|
||||
|
@ -24,11 +24,12 @@
|
||||
###########################################################################
|
||||
# - Level BaseLevel required.
|
||||
# Points Total status points given from BaseLevel 1 to 'Level'.
|
||||
# TraitPoints Total trait points given from BaseLevel 1 to 'Level'.
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
Type: STATPOINT_DB
|
||||
Version: 1
|
||||
Version: 2
|
||||
|
||||
Body:
|
||||
- Level: 1
|
||||
|
@ -234,3 +234,73 @@ Body:
|
||||
Skill: EL_POWER_OF_GAIA
|
||||
Aggressive:
|
||||
Skill: EL_STONE_RAIN
|
||||
- Id: 20816
|
||||
AegisName: EM_DILUVIO
|
||||
Name: Diluvio
|
||||
Level: 200
|
||||
Size: Large
|
||||
Element: Water
|
||||
ElementLevel: 4
|
||||
Mode:
|
||||
Passive:
|
||||
Skill: EM_EL_COLD_FORCE
|
||||
Assist:
|
||||
Skill: EM_EL_CRYSTAL_ARMOR
|
||||
Aggressive:
|
||||
Skill: EM_EL_AGE_OF_ICE
|
||||
- Id: 20817
|
||||
AegisName: EM_ARDOR
|
||||
Name: Ardor
|
||||
Level: 200
|
||||
Size: Large
|
||||
Element: Fire
|
||||
ElementLevel: 4
|
||||
Mode:
|
||||
Passive:
|
||||
Skill: EM_EL_FLAMETECHNIC
|
||||
Assist:
|
||||
Skill: EM_EL_FLAMEARMOR
|
||||
Aggressive:
|
||||
Skill: EM_EL_FLAMEROCK
|
||||
- Id: 20818
|
||||
AegisName: EM_PROCELLA
|
||||
Name: Procella
|
||||
Level: 200
|
||||
Size: Large
|
||||
Element: Wind
|
||||
ElementLevel: 4
|
||||
Mode:
|
||||
Passive:
|
||||
Skill: EM_EL_GRACE_BREEZE
|
||||
Assist:
|
||||
Skill: EM_EL_EYES_OF_STORM
|
||||
Aggressive:
|
||||
Skill: EM_EL_STORM_WIND
|
||||
- Id: 20819
|
||||
AegisName: EM_TERREMOTUS
|
||||
Name: Terremotus
|
||||
Level: 200
|
||||
Size: Large
|
||||
Element: Earth
|
||||
ElementLevel: 4
|
||||
Mode:
|
||||
Passive:
|
||||
Skill: EM_EL_EARTH_CARE
|
||||
Assist:
|
||||
Skill: EM_EL_STRONG_PROTECTION
|
||||
Aggressive:
|
||||
Skill: EM_EL_AVALANCHE
|
||||
- Id: 20820
|
||||
AegisName: EM_SERPENS
|
||||
Name: Serpens
|
||||
Level: 200
|
||||
Size: Large
|
||||
Element: Poison
|
||||
ElementLevel: 4
|
||||
Mode:
|
||||
Passive:
|
||||
Skill: EM_EL_DEEP_POISONING
|
||||
Assist:
|
||||
Skill: EM_EL_POISON_SHIELD
|
||||
Aggressive:
|
||||
Skill: EM_EL_DEADLY_POISON
|
||||
|
@ -144377,6 +144377,7 @@ Body:
|
||||
AegisName: 4th_Q_Necklace
|
||||
Name: Hourglass Necklace
|
||||
Type: Armor
|
||||
Buy: 20
|
||||
Locations:
|
||||
Both_Accessory: true
|
||||
ArmorLevel: 1
|
||||
@ -144390,6 +144391,8 @@ Body:
|
||||
NoGuildStorage: true
|
||||
NoMail: true
|
||||
NoAuction: true
|
||||
Script: |
|
||||
bonus bAllTraits,6-(JobLevel/5);
|
||||
- Id: 490090
|
||||
AegisName: aegis_490090
|
||||
Name: Aegir Ring
|
||||
|
@ -31918,7 +31918,7 @@ Body:
|
||||
Name: Special Alloy Trap
|
||||
Type: Etc
|
||||
Buy: 300
|
||||
Weight: 1
|
||||
Weight: 2
|
||||
Flags:
|
||||
BuyingStore: true
|
||||
- Id: 7941
|
||||
@ -56651,36 +56651,43 @@ Body:
|
||||
AegisName: Beaker
|
||||
Name: Beaker
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000276
|
||||
AegisName: Flame_Acid_Bottle
|
||||
Name: Flame Acid Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000277
|
||||
AegisName: Earth_Acid_Bottle
|
||||
Name: Earth Acid Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000278
|
||||
AegisName: Gale_Acid_Bottle
|
||||
Name: Gale Acid Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000279
|
||||
AegisName: Icicle_Acid_Bottle
|
||||
Name: Icicle Acid Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000280
|
||||
AegisName: High_Coating_Bottle
|
||||
Name: Advanced Coating Potion
|
||||
Name: High Coating Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000281
|
||||
AegisName: High_Plant_Bottle
|
||||
Name: Greater Plant Bottle
|
||||
Name: High Plant Bottle
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 1
|
||||
- Id: 1000282
|
||||
AegisName: EpisodClear16
|
||||
@ -56724,38 +56731,45 @@ Body:
|
||||
NoAuction: true
|
||||
- Id: 1000289
|
||||
AegisName: Device_Capsule
|
||||
Name: Machine Capsule
|
||||
Name: Device Capsule
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 5
|
||||
- Id: 1000290
|
||||
AegisName: Auto_Battle_Capsule
|
||||
Name: ABR Capsule
|
||||
Name: Auto Battle Capsule
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 10
|
||||
- Id: 1000291
|
||||
AegisName: Wind_Stone_4th
|
||||
Name: Lightning Stone
|
||||
Name: Wind Stone 4th
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000292
|
||||
AegisName: Earth_Stone_4th
|
||||
Name: Earth Stone
|
||||
Name: Earth Stone 4th
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000293
|
||||
AegisName: Flame_Stone_4th
|
||||
Name: Fire Stone
|
||||
Name: Flame Stone 4th
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000294
|
||||
AegisName: Poison_Stone_4th
|
||||
Name: Poison Stone
|
||||
Name: Poison Stone 4th
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000295
|
||||
AegisName: Ice_Stone_4th
|
||||
Name: Ice Stone
|
||||
Name: Ice Stone 4th
|
||||
Type: Etc
|
||||
Buy: 1000
|
||||
Weight: 1
|
||||
- Id: 1000296
|
||||
AegisName: RuneknightStone_Robe2
|
||||
@ -56821,6 +56835,7 @@ Body:
|
||||
AegisName: Hawk_Flute
|
||||
Name: Hawk Flute
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Trade:
|
||||
Override: 100
|
||||
NoDrop: true
|
||||
@ -56952,13 +56967,15 @@ Body:
|
||||
Flags:
|
||||
BuyingStore: true
|
||||
- Id: 1000346
|
||||
AegisName: aegis_1000346
|
||||
Name: Guide for 4th Job Change
|
||||
AegisName: 4th_Job_Guide
|
||||
Name: 4th Job Guide
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
- Id: 1000352
|
||||
AegisName: aegis_1000352
|
||||
Name: Machine Creation Guide
|
||||
AegisName: Device_Creation_Guide
|
||||
Name: Device Creation Guide
|
||||
Type: Etc
|
||||
Buy: 20
|
||||
Weight: 10
|
||||
- Id: 1000363
|
||||
AegisName: MD_Airboat_Tokken
|
||||
|
@ -1857,7 +1857,7 @@ Body:
|
||||
Flags:
|
||||
BuyingStore: true
|
||||
Script: |
|
||||
if (Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T) {
|
||||
if (Class == Job_Assassin_Cross || Class == Job_Guillotine_Cross || Class == Job_Guillotine_Cross_T || Class == Job_Shadow_Cross) {
|
||||
sc_start SC_DPOISON,60000,0;
|
||||
sc_start SC_ASPDPOTION3,60000,9;
|
||||
}
|
||||
@ -50841,6 +50841,48 @@ Body:
|
||||
BuyingStore: true
|
||||
Script: |
|
||||
/* upgradeui 100436; */
|
||||
- Id: 100452
|
||||
AegisName: Minus_POW
|
||||
Name: POW Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bPow,-1,100452;
|
||||
- Id: 100453
|
||||
AegisName: Minus_SPL
|
||||
Name: SPL Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bSpl,-1,100453;
|
||||
- Id: 100454
|
||||
AegisName: Minus_STA
|
||||
Name: STA Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bSta,-1,100454;
|
||||
- Id: 100455
|
||||
AegisName: Minus_WIS
|
||||
Name: WIS Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bWis,-1,100455;
|
||||
- Id: 100456
|
||||
AegisName: Minus_CON
|
||||
Name: CON Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bCon,-1,100456;
|
||||
- Id: 100457
|
||||
AegisName: Minus_CRT
|
||||
Name: CRT Reduction Potion
|
||||
Type: Delayconsume
|
||||
Buy: 10
|
||||
Script: |
|
||||
callfunc "F_CashReduceTraitStat",bCrt,-1,100457;
|
||||
- Id: 100466
|
||||
AegisName: Egir_Power_Box
|
||||
Name: Aegir's Power Box
|
||||
@ -50921,6 +50963,70 @@ Body:
|
||||
Container: true
|
||||
Script: |
|
||||
/* getgroupitem(IG_Enchant_Stone_Box22); */
|
||||
- Id: 100516
|
||||
AegisName: Eye_Cleaner
|
||||
Name: Eye Cleaner
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_DEEPBLIND;
|
||||
- Id: 100517
|
||||
AegisName: Ear_Cleaner
|
||||
Name: Ear Cleaner
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_DEEPSILENCE;
|
||||
- Id: 100518
|
||||
AegisName: Tonics
|
||||
Name: Tonics
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_LASSITUDE;
|
||||
- Id: 100519
|
||||
AegisName: Mini_Extinguisher
|
||||
Name: Mini Extinguisher
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_CONFLAGRATION;
|
||||
- Id: 100520
|
||||
AegisName: Water_Of_Lucky
|
||||
Name: Water Of Lucky
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_MISFORTUNE;
|
||||
- Id: 100521
|
||||
AegisName: Strong_Antidote
|
||||
Name: Strong Antidote
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_DEADLYPOISON;
|
||||
- Id: 100522
|
||||
AegisName: High_Energy_Chocolate
|
||||
Name: High Energy Chocolate
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_DEPRESSION;
|
||||
- Id: 100523
|
||||
AegisName: Refined_Holy_Water
|
||||
Name: Refined Holy Water
|
||||
Type: Healing
|
||||
Buy: 20
|
||||
Weight: 50
|
||||
Script: |
|
||||
sc_end SC_HANDICAPSTATE_HOLYFLAME;
|
||||
- Id: 100572
|
||||
AegisName: FullPeneShadow_Mix
|
||||
Name: Full Penetration Shadow Thump Box
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -104,4 +104,33 @@ JOB_SOUL_REAPER,4112,100
|
||||
JOB_BABY_STAR_EMPEROR,4112,100
|
||||
JOB_BABY_SOUL_REAPER,4112,100
|
||||
JOB_STAR_EMPEROR2,4112,100
|
||||
JOB_BABY_STAR_EMPEROR2,4112,100
|
||||
JOB_BABY_STAR_EMPEROR2,4112,100
|
||||
|
||||
JOB_DRAGON_KNIGHT,4112,100
|
||||
JOB_MEISTER,4112,100
|
||||
JOB_SHADOW_CROSS,4112,100
|
||||
JOB_ARCH_MAGE,4112,100
|
||||
JOB_CARDINAL,4112,100
|
||||
JOB_WINDHAWK,4112,100
|
||||
JOB_IMPERIAL_GUARD,4112,100
|
||||
JOB_BIOLO,4112,100
|
||||
JOB_ABYSS_CHASER,4112,100
|
||||
JOB_ELEMENTAL_MASTER,4112,100
|
||||
JOB_INQUISITOR,4112,100
|
||||
JOB_TROUBADOUR,4112,100
|
||||
JOB_TROUVERE,4112,100
|
||||
|
||||
JOB_WINDHAWK2,4112,100
|
||||
JOB_MEISTER2,4112,100
|
||||
JOB_DRAGON_KNIGHT2,4112,100
|
||||
JOB_IMPERIAL_GUARD2,4112,100
|
||||
|
||||
JOB_SKY_EMPEROR,4112,100
|
||||
JOB_SOUL_ASCETIC,4112,100
|
||||
JOB_SHINKIRO,4112,100
|
||||
JOB_SHIRANUI,4112,100
|
||||
JOB_NIGHT_WATCH,4112,100
|
||||
JOB_HYPER_NOVICE,4112,100
|
||||
JOB_SPIRIT_HANDLER,4112,100
|
||||
|
||||
JOB_SKY_EMPEROR2,4112,100
|
||||
|
220
db/re/mob_db.yml
220
db/re/mob_db.yml
@ -36,6 +36,8 @@
|
||||
# Attack2 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
|
||||
# Defense Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicDefense Magic defense of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Resistance Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicResistance Magic resistance of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Str Strength which affects attack. (Default: 1)
|
||||
# Agi Agility which affects flee. (Default: 1)
|
||||
# Vit Vitality which affects defense. (Default: 1)
|
||||
@ -75,7 +77,7 @@
|
||||
|
||||
Header:
|
||||
Type: MOB_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
Body:
|
||||
- Id: 1001
|
||||
@ -88910,14 +88912,106 @@ Body:
|
||||
# AegisName: 4JOB_R_FALCON
|
||||
# - Id: 20833
|
||||
# AegisName: 4JOB_WORG
|
||||
# - Id: 20834
|
||||
# AegisName: MEISTER_ABR1
|
||||
# - Id: 20835
|
||||
# AegisName: MEISTER_ABR2
|
||||
# - Id: 20836
|
||||
# AegisName: MEISTER_ABR3
|
||||
# - Id: 20837
|
||||
# AegisName: MEISTER_ABR4
|
||||
- Id: 20834
|
||||
AegisName: ABR_BATTLE_WARIOR
|
||||
Name: ABR Battle Warrior
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 1
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Formless
|
||||
Element: Neutral
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20835
|
||||
AegisName: ABR_DUAL_CANNON
|
||||
Name: ABR Duel Cannon
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 6
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Formless
|
||||
Element: Neutral
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20836
|
||||
AegisName: ABR_MOTHER_NET
|
||||
Name: ABR Mother Net
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 6
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Formless
|
||||
Element: Neutral
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20837
|
||||
AegisName: ABR_INFINITY
|
||||
Name: ABR Infinity
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 6
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Large
|
||||
Race: Formless
|
||||
Element: Neutral
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
# - Id: 20838
|
||||
# AegisName: ELEMETAL_MASTER_S1
|
||||
# - Id: 20839
|
||||
@ -88938,14 +89032,106 @@ Body:
|
||||
# AegisName: MD_HIDDEN_GROUND01
|
||||
# - Id: 20847
|
||||
# AegisName: MD_HIDDEN_GROUND02
|
||||
# - Id: 20848
|
||||
# AegisName: SUMMON_WOODENWARRIOR
|
||||
# - Id: 20849
|
||||
# AegisName: SUMMON_WOODEN_FAIRY
|
||||
# - Id: 20850
|
||||
# AegisName: SUMMON_CREEPER
|
||||
# - Id: 20851
|
||||
# AegisName: SUMMON_HELLTREE
|
||||
- Id: 20848
|
||||
AegisName: SUMMON_WOODENWARRIOR
|
||||
Name: Wooden Warrior
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 3
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Plant
|
||||
Element: Earth
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20849
|
||||
AegisName: SUMMON_WOODEN_FAIRY
|
||||
Name: Wooden Fairy
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 5
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Plant
|
||||
Element: Earth
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20850
|
||||
AegisName: SUMMON_CREEPER
|
||||
Name: Creeper
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 5
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Plant
|
||||
Element: Earth
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
- Id: 20851
|
||||
AegisName: SUMMON_HELLTREE
|
||||
Name: Hell Tree
|
||||
Level: 200
|
||||
Hp: 20000
|
||||
Defense: 200
|
||||
MagicDefense: 40
|
||||
Str: 10
|
||||
Agi: 10
|
||||
Vit: 10
|
||||
Int: 10
|
||||
Dex: 10
|
||||
Luk: 10
|
||||
AttackRange: 5
|
||||
SkillRange: 10
|
||||
ChaseRange: 12
|
||||
Size: Medium
|
||||
Race: Plant
|
||||
Element: Earth
|
||||
ElementLevel: 1
|
||||
WalkSpeed: 200
|
||||
AttackDelay: 1000
|
||||
AttackMotion: 500
|
||||
DamageMotion: 300
|
||||
Ai: 20
|
||||
# - Id: 20856
|
||||
# AegisName: MD_N_ARENA_1
|
||||
# - Id: 20857
|
||||
|
@ -12192,3 +12192,17 @@
|
||||
3633,EP16_2_VENOM_KIMERA@NPC_WIDESIGHT,attack,669,1,10000,0,30000,yes,self,always,0,,,,,,,
|
||||
3633,EP16_2_VENOM_KIMERA@NPC_ACIDBREATH,attack,657,6,10000,3000,25000,no,target,always,0,,,,,,,
|
||||
3633,EP16_2_VENOM_KIMERA@RG_STRIPARMOR,attack,217,5,500,1000,5000,no,target,always,0,,,,,,,
|
||||
|
||||
// Meister ABR's (Automated Battle Robot)
|
||||
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,chase,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,attack,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
20835,ABR_DUAL_CANNON@ABR_DUAL_CANNON_FIRE,chase,8602,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
20835,ABR_DUAL_CANNON@ABR_DUAL_CANNON_FIRE,attack,8602,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_REPAIR,idle,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_REPAIR,chase,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_REPAIR,attack,8603,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,idle,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,chase,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20836,ABR_MOTHER_NET@ABR_NET_SUPPORT,attack,8604,1,10000,500,5000,yes,self,always,0,,,,,,,
|
||||
20837,ABR_INFINITY@ABR_INFINITY_BUSTER,chase,8605,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
20837,ABR_INFINITY@ABR_INFINITY_BUSTER,attack,8605,1,10000,500,5000,yes,target,always,0,,,,,,,
|
||||
|
@ -694,3 +694,41 @@
|
||||
280,533,30,0,0,11058,0,514,1,519,1
|
||||
// Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples
|
||||
281,619,30,0,0,11058,0,938,10,511,20,512,10
|
||||
|
||||
//===== Manufacture Machine === ItemLV=31 ======
|
||||
// Device Capsule (1000289) <-- MT_M_MACHINE Lvl, Device Creation Guide, 5 Mini Furnace, 5 Oridecon Hammer, 50 Magic Gear Fuel
|
||||
282,1000289,31,5297,1,1000352,0,612,5,615,5,6146,50
|
||||
// Auto Battle Capsule (1000290) <-- MT_M_MACHINE Lvl, Device Creation Guide, 5 Mini Furnace, 5 Oridecon Hammer, 75 Magic Gear Fuel
|
||||
283,1000290,31,5297,1,1000352,0,612,5,615,5,6146,75
|
||||
//==============================================
|
||||
|
||||
//===== Bionic Pharmacy === ItemLV=32 ==========
|
||||
// Flame Acid Bottle (1000276) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Bloody Red
|
||||
284,1000276,32,5336,1,1000275,1,7135,5,7136,5,990,2
|
||||
// Earth Acid Bottle (1000277) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Yellow Live
|
||||
285,1000277,32,5336,1,1000275,1,7135,5,7136,5,993,2
|
||||
// Gale Acid Bottle (1000278) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Wind of Verdure
|
||||
286,1000278,32,5336,1,1000275,1,7135,5,7136,5,992,2
|
||||
// Icicle Acid Bottle (1000279) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Fire Bottle, 5 Acid Bottle, 2 Crystal Blue
|
||||
287,1000279,32,5336,1,1000275,1,7135,5,7136,5,991,2
|
||||
// High Coating Bottle (1000280) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 5 Empty Bottle, 10 Coating Bottle
|
||||
288,1000280,32,5336,1,1000275,1,713,5,7139,10
|
||||
// High Plant Bottle (1000281) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 2 Seed Of Thorny Plant, 2 Bloodsuck Plant Seed, 5 Mandragora Flowerpot, 10 Plant Bottle
|
||||
289,1000281,32,5336,1,1000275,1,6210,2,6211,2,6217,5,7137,10
|
||||
// Eye Cleaner (100516) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 3 White Herb, 3 Green Herb
|
||||
290,100516,32,5336,1,1000275,1,713,10,523,5,509,3,511,3
|
||||
// Ear Cleaner (100517) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 2 Blue Herb, 3 Green Herb
|
||||
291,100517,32,5336,1,1000275,1,713,10,523,5,510,2,511,3
|
||||
// Tonics (100518) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 2 Yggdrasilberry, 3 Royal Jelly
|
||||
292,100518,32,5336,1,1000275,1,713,10,523,5,607,2,526,3
|
||||
// Mini Extinguisher (100519) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 5 Crystal Blue, 3 Iron
|
||||
293,100519,32,5336,1,1000275,1,713,10,523,5,991,5,998,3
|
||||
// Water Of Lucky (100520) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 10 Clover, 3 Green Herb
|
||||
294,100520,32,5336,1,1000275,1,713,10,523,5,705,10,511,3
|
||||
// Strong Antidote (100521) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 5 Holy Water, 3 Poison Bottle, 10 Green Herb
|
||||
295,100521,32,5336,1,1000275,1,713,10,523,5,678,3,511,10
|
||||
// High Energy Chocolate (100522) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 3 Cacao, 3 Royal Jelly, 5 Yggdrasil Seed
|
||||
296,100522,32,5336,1,1000275,1,713,10,7182,3,526,3,608,5
|
||||
// Refined Holy Water (100523) <-- BO_BIONIC_PHARMACY Lvl, 1 Beaker, 10 Empty Bottle, 10 Holy Water, 3 Royal Jelly
|
||||
297,100523,32,5336,1,1000275,1,713,10,523,10,526,3
|
||||
//==============================================
|
||||
|
6457
db/re/skill_db.yml
6457
db/re/skill_db.yml
File diff suppressed because it is too large
Load Diff
@ -41,6 +41,9 @@
|
||||
2433,1 //WM_BEYOND_OF_WARCRY
|
||||
2455,1 //SO_ARRULLO
|
||||
2299,1 //SC_MANHOLE
|
||||
5359,1 //TR_ROKI_CAPRICCIO
|
||||
5363,1 //TR_NIPELHEIM_REQUIEM
|
||||
5367,1 //EM_ACTIVITY_BURN
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// PVP
|
||||
|
1187
db/re/skill_tree.yml
1187
db/re/skill_tree.yml
File diff suppressed because it is too large
Load Diff
@ -24,11 +24,12 @@
|
||||
###########################################################################
|
||||
# - Level BaseLevel required.
|
||||
# Points Total status points given from BaseLevel 1 to 'Level'.
|
||||
# TraitPoints Total trait points given from BaseLevel 1 to 'Level'.
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
Type: STATPOINT_DB
|
||||
Version: 1
|
||||
Version: 2
|
||||
|
||||
Body:
|
||||
- Level: 1
|
||||
@ -382,152 +383,202 @@ Body:
|
||||
- Level: 175
|
||||
Points: 3278
|
||||
- Level: 176
|
||||
Points: 3295
|
||||
Points: 3309
|
||||
- Level: 177
|
||||
Points: 3325
|
||||
Points: 3340
|
||||
- Level: 178
|
||||
Points: 3355
|
||||
Points: 3371
|
||||
- Level: 179
|
||||
Points: 3385
|
||||
Points: 3403
|
||||
- Level: 180
|
||||
Points: 3415
|
||||
Points: 3435
|
||||
- Level: 181
|
||||
Points: 3446
|
||||
Points: 3467
|
||||
- Level: 182
|
||||
Points: 3477
|
||||
Points: 3499
|
||||
- Level: 183
|
||||
Points: 3508
|
||||
Points: 3531
|
||||
- Level: 184
|
||||
Points: 3539
|
||||
Points: 3563
|
||||
- Level: 185
|
||||
Points: 3570
|
||||
Points: 3595
|
||||
- Level: 186
|
||||
Points: 3601
|
||||
Points: 3628
|
||||
- Level: 187
|
||||
Points: 3632
|
||||
Points: 3661
|
||||
- Level: 188
|
||||
Points: 3663
|
||||
- Level: 189
|
||||
Points: 3694
|
||||
- Level: 189
|
||||
Points: 3727
|
||||
- Level: 190
|
||||
Points: 3725
|
||||
Points: 3760
|
||||
- Level: 191
|
||||
Points: 3757
|
||||
Points: 3793
|
||||
- Level: 192
|
||||
Points: 3789
|
||||
Points: 3826
|
||||
- Level: 193
|
||||
Points: 3821
|
||||
Points: 3860
|
||||
- Level: 194
|
||||
Points: 3853
|
||||
Points: 3894
|
||||
- Level: 195
|
||||
Points: 3885
|
||||
Points: 3928
|
||||
- Level: 196
|
||||
Points: 3917
|
||||
Points: 3962
|
||||
- Level: 197
|
||||
Points: 3949
|
||||
Points: 3996
|
||||
- Level: 198
|
||||
Points: 3981
|
||||
Points: 4030
|
||||
- Level: 199
|
||||
Points: 4013
|
||||
Points: 4064
|
||||
- Level: 200
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
- Level: 201
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 3
|
||||
- Level: 202
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 6
|
||||
- Level: 203
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 9
|
||||
- Level: 204
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 12
|
||||
- Level: 205
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 19
|
||||
- Level: 206
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 22
|
||||
- Level: 207
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 25
|
||||
- Level: 208
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 28
|
||||
- Level: 209
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 31
|
||||
- Level: 210
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 38
|
||||
- Level: 211
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 41
|
||||
- Level: 212
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 44
|
||||
- Level: 213
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 47
|
||||
- Level: 214
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 50
|
||||
- Level: 215
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 57
|
||||
- Level: 216
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 60
|
||||
- Level: 217
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 63
|
||||
- Level: 218
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 66
|
||||
- Level: 219
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 69
|
||||
- Level: 220
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 76
|
||||
- Level: 221
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 79
|
||||
- Level: 222
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 82
|
||||
- Level: 223
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 85
|
||||
- Level: 224
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 88
|
||||
- Level: 225
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 95
|
||||
- Level: 226
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 98
|
||||
- Level: 227
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 101
|
||||
- Level: 228
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 104
|
||||
- Level: 229
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 107
|
||||
- Level: 230
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 114
|
||||
- Level: 231
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 117
|
||||
- Level: 232
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 120
|
||||
- Level: 233
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 123
|
||||
- Level: 234
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 126
|
||||
- Level: 235
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 133
|
||||
- Level: 236
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 136
|
||||
- Level: 237
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 139
|
||||
- Level: 238
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 142
|
||||
- Level: 239
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 145
|
||||
- Level: 240
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 152
|
||||
- Level: 241
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 155
|
||||
- Level: 242
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 158
|
||||
- Level: 243
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 161
|
||||
- Level: 244
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 164
|
||||
- Level: 245
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 171
|
||||
- Level: 246
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 174
|
||||
- Level: 247
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 177
|
||||
- Level: 248
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 180
|
||||
- Level: 249
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 183
|
||||
- Level: 250
|
||||
Points: 4045
|
||||
Points: 4099
|
||||
TraitPoints: 190
|
||||
|
@ -49,6 +49,9 @@
|
||||
# Knockback: Amount of tiles the skill knockbacks. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Knockback count at specific skill level.
|
||||
# GiveAp: Gives AP on successful skill cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP gained at specific skill level.
|
||||
# CopyFlags: Determines if the skill is copyable. (Optional)
|
||||
# Skill: Type of skill that can copy.
|
||||
# RemoveRequirement: Remove a requirement type. (Optional)
|
||||
@ -87,12 +90,18 @@
|
||||
# SpCost: SP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP required at specific skill level.
|
||||
# ApCost: AP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP required at specific skill level.
|
||||
# HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount HP rate required at specific skill level.
|
||||
# SpRateCost: SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP rate required at specific skill level.
|
||||
# ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP rate required at specific skill level.
|
||||
# MaxHpTrigger: Maximum amount of HP to cast the skill. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Maximum HP trigger required at specific skill level.
|
||||
@ -130,7 +139,7 @@
|
||||
|
||||
Header:
|
||||
Type: SKILL_DB
|
||||
Version: 2
|
||||
Version: 3
|
||||
|
||||
Footer:
|
||||
Imports:
|
||||
|
@ -24,11 +24,12 @@
|
||||
###########################################################################
|
||||
# - Level BaseLevel required.
|
||||
# Points Total status points given from BaseLevel 1 to 'Level'.
|
||||
# TraitPoints Total trait points given from BaseLevel 1 to 'Level'.
|
||||
###########################################################################
|
||||
|
||||
Header:
|
||||
Type: STATPOINT_DB
|
||||
Version: 1
|
||||
Version: 2
|
||||
|
||||
Footer:
|
||||
Imports:
|
||||
|
@ -363,3 +363,143 @@ SC_FREEZING,16
|
||||
SC_TEARGAS_SOB,16
|
||||
SC__FEINTBOMB,16
|
||||
SC__CHAOS,16
|
||||
|
||||
// 4th Job Common Status
|
||||
SC_HANDICAPSTATE_DEEPBLIND,16
|
||||
SC_HANDICAPSTATE_DEEPSILENCE,16
|
||||
SC_HANDICAPSTATE_LASSITUDE,16
|
||||
SC_HANDICAPSTATE_FROSTBITE,16
|
||||
SC_HANDICAPSTATE_SWOONING,16
|
||||
SC_HANDICAPSTATE_LIGHTNINGSTRIKE,16
|
||||
SC_HANDICAPSTATE_CRYSTALLIZATION,16
|
||||
SC_HANDICAPSTATE_CONFLAGRATION,16
|
||||
SC_HANDICAPSTATE_MISFORTUNE,16
|
||||
SC_HANDICAPSTATE_DEADLYPOISON,16
|
||||
SC_HANDICAPSTATE_DEPRESSION,16
|
||||
SC_HANDICAPSTATE_HOLYFLAME,16
|
||||
|
||||
// Dragon Knight
|
||||
SC_SERVANTWEAPON,16
|
||||
SC_SERVANT_SIGN,16
|
||||
SC_CHARGINGPIERCE,16
|
||||
SC_CHARGINGPIERCE_COUNT,16
|
||||
SC_DRAGONIC_AURA,16
|
||||
SC_VIGOR,16
|
||||
|
||||
// Arch Mage
|
||||
SC_DEADLY_DEFEASANCE,16
|
||||
SC_CLIMAX_DES_HU,16
|
||||
SC_CLIMAX,16
|
||||
SC_CLIMAX_EARTH,16
|
||||
SC_CLIMAX_BLOOM,16
|
||||
SC_CLIMAX_CRYIMP,16
|
||||
|
||||
// Windhawk
|
||||
SC_WINDSIGN,16
|
||||
SC_CRESCIVEBOLT,16
|
||||
SC_CALAMITYGALE,16
|
||||
|
||||
// Cardinal
|
||||
SC_MEDIALE,16
|
||||
SC_A_VITA,16
|
||||
SC_A_TELUM,16
|
||||
SC_PRE_ACIES,16
|
||||
SC_COMPETENTIA,16
|
||||
SC_RELIGIO,16
|
||||
SC_BENEDICTUM,16
|
||||
|
||||
// Meister
|
||||
SC_AXE_STOMP,16
|
||||
SC_A_MACHINE,16
|
||||
SC_D_MACHINE,16
|
||||
SC_ABR_BATTLE_WARIOR,16
|
||||
SC_ABR_DUAL_CANNON,16
|
||||
SC_ABR_MOTHER_NET,16
|
||||
SC_ABR_INFINITY,16
|
||||
|
||||
// Shadow Cross
|
||||
SC_SHADOW_EXCEED,16
|
||||
SC_DANCING_KNIFE,16
|
||||
SC_POTENT_VENOM,16
|
||||
SC_SHADOW_SCAR,16
|
||||
SC_E_SLASH_COUNT,16
|
||||
SC_SHADOW_WEAPON,16
|
||||
|
||||
// Imperial Guard
|
||||
SC_GUARD_STANCE,16
|
||||
SC_ATTACK_STANCE,16
|
||||
SC_GUARDIAN_S,16
|
||||
SC_REBOUND_S,16
|
||||
SC_HOLY_S,16
|
||||
SC_ULTIMATE_S,16
|
||||
SC_SPEAR_SCAR,16
|
||||
SC_SHIELD_POWER,16
|
||||
|
||||
// Elemental Master
|
||||
SC_SPELL_ENCHANTING,16
|
||||
SC_SUMMON_ELEMENTAL_ARDOR,16
|
||||
SC_SUMMON_ELEMENTAL_DILUVIO,16
|
||||
SC_SUMMON_ELEMENTAL_PROCELLA,16
|
||||
SC_SUMMON_ELEMENTAL_TERREMOTUS,16
|
||||
SC_SUMMON_ELEMENTAL_SERPENS,16
|
||||
SC_ELEMENTAL_VEIL,16
|
||||
|
||||
// Troubadour/Trouvere
|
||||
SC_MYSTIC_SYMPHONY,16
|
||||
SC_KVASIR_SONATA,16
|
||||
SC_SOUNDBLEND,16
|
||||
SC_GEF_NOCTURN,16
|
||||
SC_AIN_RHAPSODY,16
|
||||
SC_MUSICAL_INTERLUDE,16
|
||||
SC_JAWAII_SERENADE,16
|
||||
SC_PRON_MARCH,16
|
||||
SC_ROSEBLOSSOM,16
|
||||
|
||||
// Inquisitor
|
||||
SC_POWERFUL_FAITH,16
|
||||
SC_SINCERE_FAITH,16
|
||||
SC_FIRM_FAITH,16
|
||||
SC_HOLY_OIL,16
|
||||
SC_FIRST_BRAND,16
|
||||
SC_SECOND_BRAND,16
|
||||
SC_SECOND_JUDGE,16
|
||||
SC_THIRD_EXOR_FLAME,16
|
||||
SC_FIRST_FAITH_POWER,16
|
||||
SC_MASSIVE_F_BLASTER,16
|
||||
|
||||
// Biolo
|
||||
SC_PROTECTSHADOWEQUIP,16
|
||||
SC_RESEARCHREPORT,16
|
||||
SC_BO_HELL_DUSTY,16
|
||||
SC_BIONIC_WOODENWARRIOR,16
|
||||
SC_BIONIC_WOODEN_FAIRY,16
|
||||
SC_BIONIC_CREEPER,16
|
||||
SC_BIONIC_HELLTREE,16
|
||||
|
||||
// Abyss Chaser
|
||||
SC_SHADOW_STRIP,16
|
||||
SC_ABYSS_DAGGER,16
|
||||
SC_ABYSSFORCEWEAPON,16
|
||||
SC_ABYSS_SLAYER,16
|
||||
|
||||
// Super Elementals
|
||||
SC_FLAMETECHNIC,16
|
||||
SC_FLAMETECHNIC_OPTION,16
|
||||
SC_FLAMEARMOR,16
|
||||
SC_FLAMEARMOR_OPTION,16
|
||||
SC_COLD_FORCE,16
|
||||
SC_COLD_FORCE_OPTION,16
|
||||
SC_CRYSTAL_ARMOR,16
|
||||
SC_CRYSTAL_ARMOR_OPTION,16
|
||||
SC_GRACE_BREEZE,16
|
||||
SC_GRACE_BREEZE_OPTION,16
|
||||
SC_EYES_OF_STORM,16
|
||||
SC_EYES_OF_STORM_OPTION,16
|
||||
SC_EARTH_CARE,16
|
||||
SC_EARTH_CARE_OPTION,16
|
||||
SC_STRONG_PROTECTION,16
|
||||
SC_STRONG_PROTECTION_OPTION,16
|
||||
SC_DEEP_POISONING,16
|
||||
SC_DEEP_POISONING_OPTION,16
|
||||
SC_POISON_SHIELD,16
|
||||
SC_POISON_SHIELD_OPTION,16
|
||||
|
@ -106,22 +106,16 @@ bonus bWis,n; WIS + n
|
||||
bonus bSpl,n; SPL + n
|
||||
bonus bCon,n; CON + n
|
||||
bonus bCrt,n; CRT + n
|
||||
bonus bAllTraitStats,n; POW + n, STA + n, WIS + n, SPL + n, CON + n, CRT + n
|
||||
|
||||
Sub-Trait Stats
|
||||
---------------
|
||||
bonus bPatk,n; Power Attack (P.ATK) + n
|
||||
bonus bSmatk,n; Spell Magic Attack (S.MATK) + n
|
||||
bonus bHplus,n; Heal Plus (H.PLUS) + n
|
||||
bonus bCrate,n; Critical Rate (C.RATE) + n
|
||||
bonus bRes,n; Physical Resistance (RES) + n
|
||||
bonus bMres,n; Magic Resistance (MRES) + n
|
||||
|
||||
HP/SP
|
||||
HP/SP/AP
|
||||
-----
|
||||
bonus bMaxHP,n; MaxHP + n
|
||||
bonus bMaxHPrate,n; MaxHP + n%
|
||||
bonus bMaxSP,n; MaxSP + n
|
||||
bonus bMaxSPrate,n; MaxSP + n%
|
||||
bonus bMaxAP,n; MaxAP + n
|
||||
bonus bMaxAPrate,n; MaxAP + n%
|
||||
|
||||
Atk/Def
|
||||
-------
|
||||
@ -162,6 +156,18 @@ bonus bAspd,n; Attack speed + n
|
||||
bonus bAspdRate,n; Attack speed + n%
|
||||
bonus bAtkRange,n; Attack range + n
|
||||
bonus bAddMaxWeight,n; MaxWeight + n (in units of 0.1)
|
||||
bonus bPAtk,n; PAtk + n
|
||||
bonus bPAtkRate,n; PAtk + n%
|
||||
bonus bSMatk,n; SMatk + n
|
||||
bonus bSMatkRate,n; SMatk + n%
|
||||
bonus bRes,n; Res + n
|
||||
bonus bResRate,n; Res + n%
|
||||
bonus bMRes,n; MRes + n
|
||||
bonus bMResRate,n; MRes + n%
|
||||
bonus bHPlus,n; HPlus + n
|
||||
bonus bHPlusRate,n; HPlus + n%
|
||||
bonus bCRate,n; CRate + n
|
||||
bonus bCRateRate,n; CRate + n%
|
||||
|
||||
=======================
|
||||
| 2. Extended Bonuses |
|
||||
@ -264,7 +270,8 @@ bonus2 bSubClass,c,x; +x% damage reduction against class c
|
||||
bonus2 bAddSize,s,x; +x% physical damage against size s
|
||||
bonus2 bMagicAddSize,s,x; +x% magical damage against size s
|
||||
bonus2 bSubSize,s,x; +x% damage reduction against size s
|
||||
bonus2 bMagicSubSize,s,x; +x% magic damage reduction against size s
|
||||
bonus2 bWeaponSubSize,s,x; +x% physical damage reduction against size s
|
||||
bonus2 bMagicSubSize,s,x; +x% magic damage reduction against size s
|
||||
bonus bNoSizeFix; Ignores the size modifier when calculating damage
|
||||
|
||||
bonus2 bAddDamageClass,mid,x; +x% physical damage against monster mid
|
||||
|
@ -159,10 +159,10 @@ Baby - Baby classes (no Third-Baby classes).
|
||||
Third - Third classes (no Transcedent-Third or Third-Baby classes).
|
||||
Third_Upper - Transcedent-Third classes.
|
||||
Third_Baby - Third-Baby classes.
|
||||
Fourth - Fourth classes.
|
||||
All_Upper - All Transcedent classes
|
||||
All_Baby - All baby classes
|
||||
All_Third - Applies to all Third classes.
|
||||
Fourth - Fourth classes.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
|
@ -68,6 +68,14 @@ MagicDefense: Magic defense of the monster, reduce magical skill.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Resistance: Physical resistance of the monster, reduce melee and ranged physical attack/skill.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
MagicResistance: Magic resistance of the monster, reduce magical skill.
|
||||
|
||||
---------------------------------------
|
||||
|
||||
Str: Strength of the monster. Affects ATK.
|
||||
|
||||
---------------------------------------
|
||||
|
@ -3586,6 +3586,8 @@ Valid types are:
|
||||
MOB_ATK2 - monster's atk2
|
||||
MOB_DEF - monster's def
|
||||
MOB_MDEF - monster's mdef
|
||||
MOB_RES - monster's res
|
||||
MOB_MRES - monster's mres
|
||||
MOB_STR - monster's str
|
||||
MOB_AGI - monster's agi
|
||||
MOB_VIT - monster's vit
|
||||
@ -6031,6 +6033,30 @@ specified amount permanently. The amount can be negative. See 'statusup'.
|
||||
|
||||
// This will decrease a character's Vit forever.
|
||||
statusup2 bVit,-1;
|
||||
---------------------------------------
|
||||
|
||||
*traitstatusup <stat>{,<char_id>};
|
||||
|
||||
This command will change a specified trait stat of the invoking character up by one
|
||||
permanently. Trait stats are to be given as number, but you can use these constants to
|
||||
replace them:
|
||||
|
||||
bPow - Power
|
||||
bSta - Stamina
|
||||
bWis - Wisdom
|
||||
bSpl - Spell
|
||||
bCon - Concentration
|
||||
bCrt - Creative
|
||||
|
||||
---------------------------------------
|
||||
|
||||
*traitstatusup2 <stat>,<amount>{,<char_id>};
|
||||
|
||||
This command will change a specified trait stat of the invoking character by the
|
||||
specified amount permanently. The amount can be negative. See 'statusup'.
|
||||
|
||||
// This will decrease a character's Sta forever.
|
||||
traitstatusup2 bSta,-1;
|
||||
|
||||
---------------------------------------
|
||||
|
||||
@ -8269,6 +8295,8 @@ Parameters (indexes) for monsters are:
|
||||
UMOB_BODY2
|
||||
UMOB_GROUP_ID
|
||||
UMOB_IGNORE_CELL_STACK_LIMIT
|
||||
UMOB_RES
|
||||
UMOB_MRES
|
||||
|
||||
-----
|
||||
|
||||
|
@ -525,6 +525,27 @@ Sequence Map Form
|
||||
|
||||
------------------
|
||||
|
||||
ApCost: AP required to cast.
|
||||
|
||||
Can be defined in scalar form or sequence map form:
|
||||
Scalar Form
|
||||
ApCost: 10
|
||||
|
||||
Sequence Map Form
|
||||
ApCost:
|
||||
- Level: 1
|
||||
Amount: 10
|
||||
- Level: 2
|
||||
Amount: 20
|
||||
- Level: 3
|
||||
Amount: 30
|
||||
- Level: 4
|
||||
Amount: 40
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
|
||||
------------------
|
||||
|
||||
HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP.
|
||||
|
||||
Can be defined in scalar form or sequence map form:
|
||||
@ -567,6 +588,27 @@ Sequence Map Form
|
||||
|
||||
------------------
|
||||
|
||||
ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP.
|
||||
|
||||
Can be defined in scalar form or sequence map form:
|
||||
Scalar Form
|
||||
ApRateCost: 10
|
||||
|
||||
Sequence Map Form
|
||||
ApRateCost:
|
||||
- Level: 1
|
||||
Amount: 10
|
||||
- Level: 2
|
||||
Amount: 20
|
||||
- Level: 3
|
||||
Amount: 30
|
||||
- Level: 4
|
||||
Amount: 40
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
|
||||
------------------
|
||||
|
||||
MaxHpTrigger: Maximum amount of HP to cast the skill.
|
||||
|
||||
Can be defined in scalar form or sequence map form:
|
||||
@ -754,6 +796,27 @@ Levels 1 - 5 have no item cost but levels 6 - 10 require a Blue Gemstone.
|
||||
|
||||
------------------
|
||||
|
||||
GiveAp: AP given on successful casting.
|
||||
|
||||
Can be defined in scalar form or sequence map form:
|
||||
Scalar Form
|
||||
GiveAp: 10
|
||||
|
||||
Sequence Map Form
|
||||
GiveAp:
|
||||
- Level: 1
|
||||
Amount: 10
|
||||
- Level: 2
|
||||
Amount: 20
|
||||
- Level: 3
|
||||
Amount: 30
|
||||
- Level: 4
|
||||
Amount: 40
|
||||
- Level: 5
|
||||
Amount: 50
|
||||
|
||||
------------------
|
||||
|
||||
Equipment: Equipped item required to cast.
|
||||
|
||||
---------------------------------------
|
||||
|
@ -19,6 +19,8 @@
|
||||
# Attack2 Maximum attack in pre-renewal and base magic attack in renewal. (Default: 0)
|
||||
# Defense Physical defense of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicDefense Magic defense of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Resistance Physical resistance of the monster, reduces melee and ranged physical attack/skill damage. (Default: 0)
|
||||
# MagicResistance Magic resistance of the monster, reduces magical skill damage. (Default: 0)
|
||||
# Str Strength which affects attack. (Default: 1)
|
||||
# Agi Agility which affects flee. (Default: 1)
|
||||
# Vit Vitality which affects defense. (Default: 1)
|
||||
|
@ -32,6 +32,9 @@
|
||||
# Knockback: Amount of tiles the skill knockbacks. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Knockback count at specific skill level.
|
||||
# GiveAp: Gives AP on successful skill cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP gained at specific skill level.
|
||||
# CopyFlags: Determines if the skill is copyable. (Optional)
|
||||
# Skill: Type of skill that can copy.
|
||||
# RemoveRequirement: Remove a requirement type. (Optional)
|
||||
@ -70,12 +73,18 @@
|
||||
# SpCost: SP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP required at specific skill level.
|
||||
# ApCost: AP required to cast. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP required at specific skill level.
|
||||
# HpRateCost: HP rate required to cast. If positive, uses current HP, else uses Max HP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount HP rate required at specific skill level.
|
||||
# SpRateCost: SP rate required to cast. If positive, uses current SP, else uses Max SP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount SP rate required at specific skill level.
|
||||
# ApRateCost: AP rate required to cast. If positive, uses current AP, else uses Max AP. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount AP rate required at specific skill level.
|
||||
# MaxHpTrigger: Maximum amount of HP to cast the skill. (Default: 0)
|
||||
# - Level Skill level.
|
||||
# Amount Maximum HP trigger required at specific skill level.
|
||||
|
@ -7,4 +7,5 @@
|
||||
###########################################################################
|
||||
# - Level BaseLevel required.
|
||||
# Points Total status points given from BaseLevel 1 to 'Level'.
|
||||
# TraitPoints Total trait points given from BaseLevel 1 to 'Level'.
|
||||
###########################################################################
|
||||
|
@ -18,6 +18,8 @@ CREATE TABLE `mob_db2_re` (
|
||||
`attack2` smallint(6) unsigned DEFAULT NULL,
|
||||
`defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`str` smallint(6) unsigned DEFAULT NULL,
|
||||
`agi` smallint(6) unsigned DEFAULT NULL,
|
||||
`vit` smallint(6) unsigned DEFAULT NULL,
|
||||
|
@ -18,6 +18,8 @@ CREATE TABLE `mob_db_re` (
|
||||
`attack2` smallint(6) unsigned DEFAULT NULL,
|
||||
`defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`str` smallint(6) unsigned DEFAULT NULL,
|
||||
`agi` smallint(6) unsigned DEFAULT NULL,
|
||||
`vit` smallint(6) unsigned DEFAULT NULL,
|
||||
|
@ -13,6 +13,7 @@
|
||||
//= 1.7 Readability changes. Also added BabyExpanded and BabySummoner classes. [Jey]
|
||||
//= 1.8 Added option to disable Baby Novice Only but Baby Class can be Enabled [mazvi]
|
||||
//= 1.9 Migrate/Integrate to Global Functions Platinum Skills. [mazvi]
|
||||
//= 2.0 Added 4th class [Lemongrass]
|
||||
//============================================================
|
||||
|
||||
prontera,153,193,6 script Job Master 123,{
|
||||
@ -42,6 +43,22 @@ function Is_Baby {
|
||||
return ((getarg(0, eaclass())&EAJL_BABY)>0);
|
||||
}
|
||||
|
||||
// Checks if the player can change to fourth class.
|
||||
// Note: This does not include the level checks.
|
||||
function Can_Change_Fourth {
|
||||
// To change to third class you need to be:
|
||||
// * Transcendent Third Class
|
||||
if( !.FourthClass )
|
||||
return false; // Fourth job change disabled
|
||||
if( (eaclass()&(EAJL_THIRD|EAJL_UPPER)) != (EAJL_THIRD|EAJL_UPPER) )
|
||||
return false; // Not Transcendent Third Class
|
||||
if( eaclass()&EAJL_FOURTH )
|
||||
return false; // Already Fourth Class
|
||||
if( roclass(eaclass()|EAJL_FOURTH) < 0 )
|
||||
return false; // Job has no Fourth Class
|
||||
return true;
|
||||
}
|
||||
|
||||
// Checks if the player can change to third class.
|
||||
// Note: This does not include the level checks.
|
||||
function Can_Change_Third {
|
||||
@ -127,6 +144,7 @@ function Job_Options {
|
||||
|
||||
// initialisation
|
||||
.@eac = eaclass();
|
||||
.@fourth_possible = Can_Change_Fourth();
|
||||
.@third_possible = Can_Change_Third();
|
||||
.@rebirth_possible = Can_Rebirth();
|
||||
.@first_eac = .@eac&EAJ_BASEMASK;
|
||||
@ -150,6 +168,11 @@ function Job_Options {
|
||||
Require_Level(.Req_Third[0], .Req_Third[1]);
|
||||
Job_Options(.@job_opt, roclass(.@eac|EAJL_THIRD));
|
||||
}
|
||||
if( .@fourth_possible ) {
|
||||
// Fourth Job change (displayed below rebirth)
|
||||
Require_Level(.Req_Fourth[0], .Req_Fourth[1]);
|
||||
Job_Options(.@job_opt, roclass(.@eac|EAJL_FOURTH));
|
||||
}
|
||||
|
||||
if (.SecondExpanded &&
|
||||
(.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice
|
||||
@ -353,7 +376,10 @@ function Get_Job_Equip {
|
||||
// Note: The item is dropping, when the player can't hold it.
|
||||
// But that's better than not giving the item at all.
|
||||
.@eac = eaclass();
|
||||
if( .@eac&EAJL_THIRD ) {
|
||||
if( .@eac&EAJL_FOURTH ) {
|
||||
// Fourth Class Items
|
||||
getitem 490087,1; // Hourglass Necklace
|
||||
} else if( .@eac&EAJL_THIRD ) {
|
||||
// Third Class Items
|
||||
getitem 2795,1; // Green Apple Ring for every 3rd Class
|
||||
switch(BaseJob) {
|
||||
@ -456,24 +482,26 @@ OnInit:
|
||||
.NPCName$ = "[Job Master]";
|
||||
|
||||
// Settings
|
||||
.ThirdClass = true; // Enable third classes?
|
||||
.RebirthClass = true; // Enable rebirth classes?
|
||||
.SecondExpanded = true; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
|
||||
.BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby.
|
||||
.BabyClass = true; // Enable Baby classes?
|
||||
.BabyThird = true; // Enable Baby third classes?
|
||||
.BabyExpanded = true; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
|
||||
.BabySummoner = true; // Enable Baby Summoner?
|
||||
.LastJob = true; // Enforce linear class changes?
|
||||
.SkillPointCheck = true; // Force player to use up all skill points?
|
||||
.Platinum = true; // Get platinum skills automatically?
|
||||
.GetJobEquip = false; // Get job equipment (mostly weapons) on job change?
|
||||
.FourthClass = true; // Enable fourth classes?
|
||||
.ThirdClass = true; // Enable third classes?
|
||||
.RebirthClass = true; // Enable rebirth classes?
|
||||
.SecondExpanded = true; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
|
||||
.BabyNovice = true; // Enable Baby novice classes? Disable it if you like player must have parent to get job baby.
|
||||
.BabyClass = true; // Enable Baby classes?
|
||||
.BabyThird = true; // Enable Baby third classes?
|
||||
.BabyExpanded = true; // Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
|
||||
.BabySummoner = true; // Enable Baby Summoner?
|
||||
.LastJob = true; // Enforce linear class changes?
|
||||
.SkillPointCheck = true; // Force player to use up all skill points?
|
||||
.Platinum = true; // Get platinum skills automatically?
|
||||
.GetJobEquip = false; // Get job equipment (mostly weapons) on job change?
|
||||
|
||||
// Level Requirements
|
||||
setarray .Req_First[0],1,10; // Minimum base level, job level to turn into 1st class
|
||||
setarray .Req_Second[0],1,40; // Minimum base level, job level to turn into 2nd class
|
||||
setarray .Req_Rebirth[0],99,50; // Minimum base level, job level to rebirth
|
||||
setarray .Req_Third[0],99,50; // Minimum base level, job level to change to third class
|
||||
setarray .Req_Fourth[0],200,70; // Minimum base level, job level to change to fourth class
|
||||
setarray .Req_Exp_NJ_GS[0],99,70; // Minimum base level, job level to turn into Expanded Ninja and Gunslinger
|
||||
setarray .Req_Exp_SNOVI[0],99,99; // Minimum base level, job level to turn into Expanded Super Novice
|
||||
.SNovice = 45; // Minimum base level to turn into Super Novice
|
||||
|
@ -328,3 +328,28 @@ function script F_CashReduceStat {
|
||||
statusup2 .@type,.@amount;
|
||||
return;
|
||||
}
|
||||
|
||||
// Trait Status reduction potion
|
||||
//============================================================
|
||||
// - Permanently reduces base trait stat <type> by <val>.
|
||||
// - Returns trait status points equals to points needed to raise
|
||||
// that trait stat to original value.
|
||||
// - Doesn't work if base trait status <type> would become lower than 0 after reduction.
|
||||
// * callfunc("F_CashReduceTraitStat",<type>{,<val>,<itemid>});
|
||||
function script F_CashReduceTraitStat {
|
||||
.@type = getarg(0);
|
||||
.@amount = getarg(1, -1);
|
||||
.@itemid = getarg(2, 0);
|
||||
|
||||
if((readparam(.@type) + .@amount) < 0) return;
|
||||
|
||||
if(.@itemid) {
|
||||
if(countitem(.@itemid))
|
||||
delitem .@itemid,1;
|
||||
else
|
||||
return;
|
||||
}
|
||||
TraitPoint += needed_trait_point(.@type, .@amount);
|
||||
traitstatusup2 .@type,.@amount;
|
||||
return;
|
||||
}
|
||||
|
@ -212,12 +212,21 @@ CREATE TABLE IF NOT EXISTS `char` (
|
||||
`int` smallint(4) unsigned NOT NULL default '0',
|
||||
`dex` smallint(4) unsigned NOT NULL default '0',
|
||||
`luk` smallint(4) unsigned NOT NULL default '0',
|
||||
`pow` smallint(4) unsigned NOT NULL default '0',
|
||||
`sta` smallint(4) unsigned NOT NULL default '0',
|
||||
`wis` smallint(4) unsigned NOT NULL default '0',
|
||||
`spl` smallint(4) unsigned NOT NULL default '0',
|
||||
`con` smallint(4) unsigned NOT NULL default '0',
|
||||
`crt` smallint(4) unsigned NOT NULL default '0',
|
||||
`max_hp` int(11) unsigned NOT NULL default '0',
|
||||
`hp` int(11) unsigned NOT NULL default '0',
|
||||
`max_sp` int(11) unsigned NOT NULL default '0',
|
||||
`sp` int(11) unsigned NOT NULL default '0',
|
||||
`max_ap` int(11) unsigned NOT NULL default '0',
|
||||
`ap` int(11) unsigned NOT NULL default '0',
|
||||
`status_point` int(11) unsigned NOT NULL default '0',
|
||||
`skill_point` int(11) unsigned NOT NULL default '0',
|
||||
`trait_point` int(11) unsigned NOT NULL default '0',
|
||||
`option` int(11) NOT NULL default '0',
|
||||
`karma` tinyint(3) NOT NULL default '0',
|
||||
`manner` smallint(6) NOT NULL default '0',
|
||||
|
@ -18,6 +18,8 @@ CREATE TABLE `mob_db2_re` (
|
||||
`attack2` smallint(6) unsigned DEFAULT NULL,
|
||||
`defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`str` smallint(6) unsigned DEFAULT NULL,
|
||||
`agi` smallint(6) unsigned DEFAULT NULL,
|
||||
`vit` smallint(6) unsigned DEFAULT NULL,
|
||||
|
@ -18,6 +18,8 @@ CREATE TABLE `mob_db_re` (
|
||||
`attack2` smallint(6) unsigned DEFAULT NULL,
|
||||
`defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_defense` smallint(6) unsigned DEFAULT NULL,
|
||||
`resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`magic_resistance` smallint(6) unsigned DEFAULT NULL,
|
||||
`str` smallint(6) unsigned DEFAULT NULL,
|
||||
`agi` smallint(6) unsigned DEFAULT NULL,
|
||||
`vit` smallint(6) unsigned DEFAULT NULL,
|
||||
|
11
sql-files/upgrades/upgrade_20211230.sql
Normal file
11
sql-files/upgrades/upgrade_20211230.sql
Normal file
@ -0,0 +1,11 @@
|
||||
ALTER TABLE `char`
|
||||
ADD COLUMN `pow` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `luk`,
|
||||
ADD COLUMN `sta` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `pow`,
|
||||
ADD COLUMN `wis` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `sta`,
|
||||
ADD COLUMN `spl` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `wis`,
|
||||
ADD COLUMN `con` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `spl`,
|
||||
ADD COLUMN `crt` SMALLINT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `con`,
|
||||
ADD COLUMN `max_ap` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `sp`,
|
||||
ADD COLUMN `ap` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `max_ap`,
|
||||
ADD COLUMN `trait_point` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `status_point
|
||||
;
|
@ -299,7 +299,10 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
|
||||
(p->rename != cp->rename) || (p->robe != cp->robe) || (p->character_moves != cp->character_moves) ||
|
||||
(p->unban_time != cp->unban_time) || (p->font != cp->font) || (p->uniqueitem_counter != cp->uniqueitem_counter) ||
|
||||
(p->hotkey_rowshift != cp->hotkey_rowshift) || (p->clan_id != cp->clan_id ) || (p->title_id != cp->title_id) ||
|
||||
(p->show_equip != cp->show_equip) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2)
|
||||
(p->show_equip != cp->show_equip) || (p->hotkey_rowshift2 != cp->hotkey_rowshift2) ||
|
||||
(p->max_ap != cp->max_ap) || (p->ap != cp->ap) || (p->trait_point != cp->trait_point) ||
|
||||
(p->pow != cp->pow) || (p->sta != cp->sta) || (p->wis != cp->wis) ||
|
||||
(p->spl != cp->spl) || (p->con != cp->con) || (p->crt != cp->crt)
|
||||
)
|
||||
{ //Save status
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `base_level`='%d', `job_level`='%d',"
|
||||
@ -310,7 +313,9 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
|
||||
"`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d',"
|
||||
"`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `rename`='%d',"
|
||||
"`delete_date`='%lu',`robe`='%d',`moves`='%d',`font`='%u',`uniqueitem_counter`='%u',"
|
||||
"`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d', `hotkey_rowshift2`='%d'"
|
||||
"`hotkey_rowshift`='%d', `clan_id`='%d', `title_id`='%lu', `show_equip`='%d', `hotkey_rowshift2`='%d',"
|
||||
"`max_ap`='%u',`ap`='%u',`trait_point`='%d',"
|
||||
"`pow`='%d',`sta`='%d',`wis`='%d',`spl`='%d',`con`='%d',`crt`='%d'"
|
||||
" WHERE `account_id`='%d' AND `char_id` = '%d'",
|
||||
schema_config.char_db, p->base_level, p->job_level,
|
||||
p->base_exp, p->job_exp, p->zeny,
|
||||
@ -323,6 +328,8 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
|
||||
(unsigned long)p->delete_date, // FIXME: platform-dependent size
|
||||
p->robe, p->character_moves, p->font, p->uniqueitem_counter,
|
||||
p->hotkey_rowshift, p->clan_id, p->title_id, p->show_equip, p->hotkey_rowshift2,
|
||||
p->max_ap, p->ap, p->trait_point,
|
||||
p->pow, p->sta, p->wis, p->spl, p->con, p->crt,
|
||||
p->account_id, p->char_id) )
|
||||
{
|
||||
Sql_ShowDebug(sql_handle);
|
||||
@ -924,7 +931,8 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun
|
||||
"`status_point`,`skill_point`,`option`,`karma`,`manner`,`hair`,`hair_color`,"
|
||||
"`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`rename`,`delete_date`,"
|
||||
"`robe`,`moves`,`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`title_id`,`show_equip`,"
|
||||
"`hotkey_rowshift2`"
|
||||
"`hotkey_rowshift2`,"
|
||||
"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
|
||||
" FROM `%s` WHERE `account_id`='%d' AND `char_num` < '%d'", schema_config.char_db, sd->account_id, MAX_CHARS)
|
||||
|| SQL_ERROR == SqlStmt_Execute(stmt)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 0, SQLDT_INT, &p.char_id, 0, NULL, NULL)
|
||||
@ -973,6 +981,15 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* coun
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_ULONG, &p.title_id, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_UINT16, &p.show_equip, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_UCHAR, &p.hotkey_rowshift2, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_UINT, &p.max_ap, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_UINT, &p.ap, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_UINT, &p.trait_point, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_SHORT, &p.pow, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 50, SQLDT_SHORT, &p.sta, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 51, SQLDT_SHORT, &p.wis, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 52, SQLDT_SHORT, &p.spl, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 53, SQLDT_SHORT, &p.con, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 54, SQLDT_SHORT, &p.crt, 0, NULL, NULL)
|
||||
)
|
||||
{
|
||||
SqlStmt_ShowDebug(stmt);
|
||||
@ -1040,7 +1057,8 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev
|
||||
"`status_point`,`skill_point`,`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`homun_id`,`elemental_id`,`hair`,"
|
||||
"`hair_color`,`clothes_color`,`body`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`,`last_map`,`last_x`,`last_y`,"
|
||||
"`save_map`,`save_x`,`save_y`,`partner_id`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,`robe`, `moves`,"
|
||||
"`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`"
|
||||
"`unban_time`,`font`,`uniqueitem_counter`,`sex`,`hotkey_rowshift`,`clan_id`,`title_id`,`show_equip`,`hotkey_rowshift2`,"
|
||||
"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
|
||||
" FROM `%s` WHERE `char_id`=? LIMIT 1", schema_config.char_db)
|
||||
|| SQL_ERROR == SqlStmt_BindParam(stmt, 0, SQLDT_INT, &char_id, 0)
|
||||
|| SQL_ERROR == SqlStmt_Execute(stmt)
|
||||
@ -1107,6 +1125,15 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 60, SQLDT_ULONG, &p->title_id, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 61, SQLDT_UINT16, &p->show_equip, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 62, SQLDT_UCHAR, &p->hotkey_rowshift2, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 63, SQLDT_UINT, &p->max_ap, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 64, SQLDT_UINT, &p->ap, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 65, SQLDT_UINT, &p->trait_point, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 66, SQLDT_SHORT, &p->pow, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 67, SQLDT_SHORT, &p->sta, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 68, SQLDT_SHORT, &p->wis, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 69, SQLDT_SHORT, &p->spl, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 70, SQLDT_SHORT, &p->con, 0, NULL, NULL)
|
||||
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 71, SQLDT_SHORT, &p->crt, 0, NULL, NULL)
|
||||
)
|
||||
{
|
||||
SqlStmt_ShowDebug(stmt);
|
||||
@ -2017,7 +2044,7 @@ void char_read_fame_list(void)
|
||||
memset(chemist_fame_list, 0, sizeof(chemist_fame_list));
|
||||
memset(taekwon_fame_list, 0, sizeof(taekwon_fame_list));
|
||||
// Build Blacksmith ranking list
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, JOB_MECHANIC, JOB_MECHANIC_T, JOB_BABY_MECHANIC, fame_list_size_smith) )
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_BLACKSMITH, JOB_WHITESMITH, JOB_BABY_BLACKSMITH, JOB_MECHANIC, JOB_MECHANIC_T, JOB_BABY_MECHANIC, JOB_MEISTER, fame_list_size_smith) )
|
||||
Sql_ShowDebug(sql_handle);
|
||||
for( i = 0; i < fame_list_size_smith && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
|
||||
{
|
||||
@ -2032,7 +2059,7 @@ void char_read_fame_list(void)
|
||||
memcpy(smith_fame_list[i].name, data, zmin(len, NAME_LENGTH));
|
||||
}
|
||||
// Build Alchemist ranking list
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, JOB_GENETIC, JOB_GENETIC_T, JOB_BABY_GENETIC, fame_list_size_chemist) )
|
||||
if( SQL_ERROR == Sql_Query(sql_handle, "SELECT `char_id`,`fame`,`name` FROM `%s` WHERE `fame`>0 AND (`class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d' OR `class`='%d') ORDER BY `fame` DESC LIMIT 0,%d", schema_config.char_db, JOB_ALCHEMIST, JOB_CREATOR, JOB_BABY_ALCHEMIST, JOB_GENETIC, JOB_GENETIC_T, JOB_BABY_GENETIC, JOB_BIOLO, fame_list_size_chemist) )
|
||||
Sql_ShowDebug(sql_handle);
|
||||
for( i = 0; i < fame_list_size_chemist && SQL_SUCCESS == Sql_NextRow(sql_handle); ++i )
|
||||
{
|
||||
@ -2316,7 +2343,8 @@ bool char_checkdb(void){
|
||||
"`shield`,`head_top`,`head_mid`,`head_bottom`,`robe`,`last_map`,`last_x`,`last_y`,`save_map`,"
|
||||
"`save_x`,`save_y`,`partner_id`,`online`,`father`,`mother`,`child`,`fame`,`rename`,`delete_date`,"
|
||||
"`moves`,`unban_time`,`font`,`sex`,`hotkey_rowshift`,`clan_id`,`last_login`,`title_id`,`show_equip`,"
|
||||
"`hotkey_rowshift2`"
|
||||
"`hotkey_rowshift2`,"
|
||||
"`max_ap`,`ap`,`trait_point`,`pow`,`sta`,`wis`,`spl`,`con`,`crt`"
|
||||
" FROM `%s` LIMIT 1;", schema_config.char_db) ){
|
||||
Sql_ShowDebug(sql_handle);
|
||||
return false;
|
||||
|
@ -414,6 +414,10 @@ void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int
|
||||
class_ = (sex == SEX_MALE ? JOB_KAGEROU : JOB_OBORO);
|
||||
else if (class_ == JOB_BABY_KAGEROU || class_ == JOB_BABY_OBORO)
|
||||
class_ = (sex == SEX_MALE ? JOB_BABY_KAGEROU : JOB_BABY_OBORO);
|
||||
else if (class_ == JOB_TROUBADOUR || class_ == JOB_TROUVERE)
|
||||
class_ = (sex == SEX_MALE ? JOB_TROUBADOUR : JOB_TROUVERE);
|
||||
else if (class_ == JOB_SHINKIRO || class_ == JOB_SHIRANUI)
|
||||
class_ = (sex == SEX_MALE ? JOB_SHINKIRO : JOB_SHIRANUI);
|
||||
|
||||
if (SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'", schema_config.inventory_db, char_id))
|
||||
Sql_ShowDebug(sql_handle);
|
||||
|
@ -356,7 +356,10 @@ const char* job_name(int class_) {
|
||||
case JOB_NIGHT_WATCH:
|
||||
case JOB_HYPER_NOVICE:
|
||||
case JOB_SPIRIT_HANDLER:
|
||||
return msg_txt( 143 - JOB_SKY_EMPEROR + class_ );
|
||||
return msg_txt( 135 - JOB_SKY_EMPEROR + class_ );
|
||||
|
||||
case JOB_SKY_EMPEROR2:
|
||||
return msg_txt( 135 );
|
||||
|
||||
default:
|
||||
return msg_txt(199);
|
||||
|
@ -63,7 +63,7 @@ typedef uint32 t_itemid;
|
||||
#define MAX_BANK_ZENY SINT32_MAX ///Max zeny in Bank
|
||||
#define MAX_FAME 1000000000 ///Max fame points
|
||||
#define MAX_CART 100 ///Maximum item in cart
|
||||
#define MAX_SKILL 1250 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit
|
||||
#define MAX_SKILL 1450 ///Maximum skill can be hold by Player, Homunculus, & Mercenary (skill list) AND skill_db limit
|
||||
#define DEFAULT_WALK_SPEED 150 ///Default walk speed
|
||||
#define MIN_WALK_SPEED 20 ///Min walk speed
|
||||
#define MAX_WALK_SPEED 1000 ///Max walk speed
|
||||
@ -165,9 +165,13 @@ const t_itemid WEDDING_RING_F = 2635;
|
||||
#define MAX_MERCSKILL 41
|
||||
|
||||
//Elemental System
|
||||
#define MAX_ELEMENTALSKILL 42
|
||||
#define MAX_ELEMENTALSKILL 57
|
||||
#define EL_SKILLBASE 8401
|
||||
|
||||
//Automated Battle Robot System
|
||||
#define ABR_SKILLBASE 8601
|
||||
#define MAX_ABRSKILL 5
|
||||
|
||||
//Achievement System
|
||||
#define MAX_ACHIEVEMENT_OBJECTIVES 10 /// Maximum different objectives in achievement_db.yml
|
||||
#define MAX_ACHIEVEMENT_DEPENDENTS 20 /// Maximum different dependents in achievement_db.yml
|
||||
@ -516,8 +520,8 @@ struct mmo_charstatus {
|
||||
int zeny;
|
||||
|
||||
short class_; ///< Player's JobID
|
||||
unsigned int status_point,skill_point;
|
||||
int hp,max_hp,sp,max_sp;
|
||||
unsigned int status_point,skill_point,trait_point;
|
||||
int hp,max_hp,sp,max_sp,ap,max_ap;
|
||||
unsigned int option;
|
||||
short manner; // Defines how many minutes a char will be muted, each negative point is equivalent to a minute.
|
||||
unsigned char karma;
|
||||
@ -1022,6 +1026,8 @@ enum e_job {
|
||||
JOB_HYPER_NOVICE,
|
||||
JOB_SPIRIT_HANDLER,
|
||||
|
||||
JOB_SKY_EMPEROR2 = 4316,
|
||||
|
||||
JOB_MAX,
|
||||
};
|
||||
|
||||
|
@ -13,13 +13,13 @@
|
||||
/// Do NOT edit this line! To set your client version, please do this instead:
|
||||
/// In Windows: Add this line in your src\custom\defines_pre.hpp file: #define PACKETVER YYYYMMDD
|
||||
/// In Linux: The same as above or run the following command: ./configure --enable-packetver=YYYYMMDD
|
||||
#define PACKETVER 20200401
|
||||
#define PACKETVER 20200902
|
||||
#endif
|
||||
|
||||
#ifndef PACKETVER_RE
|
||||
/// From November 2015 only RagexeRE are supported.
|
||||
/// After July 2018 only Ragexe are supported.
|
||||
#if PACKETVER > 20151104 && PACKETVER < 20180704
|
||||
#if ( PACKETVER > 20151104 && PACKETVER < 20180704 ) || PACKETVER >= 20200902
|
||||
#define PACKETVER_RE
|
||||
#endif
|
||||
#endif
|
||||
|
@ -1170,7 +1170,7 @@ ACMD_FUNC(jobchange)
|
||||
}
|
||||
}
|
||||
|
||||
// High Jobs, Babys and Third
|
||||
// High Jobs, Babys, Third, and Fourth
|
||||
for( i = JOB_NOVICE_HIGH; i < JOB_MAX && !found; i++ ) {
|
||||
if (strncmpi(message, job_name(i), 16) == 0) {
|
||||
job = i;
|
||||
@ -1189,7 +1189,8 @@ ACMD_FUNC(jobchange)
|
||||
if (job == JOB_KNIGHT2 || job == JOB_CRUSADER2 || job == JOB_WEDDING || job == JOB_XMAS || job == JOB_SUMMER || job == JOB_HANBOK || job == JOB_OKTOBERFEST
|
||||
|| job == JOB_LORD_KNIGHT2 || job == JOB_PALADIN2 || job == JOB_BABY_KNIGHT2 || job == JOB_BABY_CRUSADER2 || job == JOB_STAR_GLADIATOR2
|
||||
|| (job >= JOB_RUNE_KNIGHT2 && job <= JOB_MECHANIC_T2) || (job >= JOB_BABY_RUNE_KNIGHT2 && job <= JOB_BABY_MECHANIC2) || job == JOB_BABY_STAR_GLADIATOR2
|
||||
|| job == JOB_STAR_EMPEROR2 || job == JOB_BABY_STAR_EMPEROR2 || job == JOB_SUMMER2)
|
||||
|| job == JOB_STAR_EMPEROR2 || job == JOB_BABY_STAR_EMPEROR2 || job == JOB_SUMMER2
|
||||
|| (job >= JOB_WINDHAWK2 && job <= JOB_IMPERIAL_GUARD2) || job == JOB_SKY_EMPEROR2)
|
||||
{ // Deny direct transformation into dummy jobs
|
||||
clif_displaymessage(fd, msg_txt(sd,923)); //"You can not change to this job by command."
|
||||
return 0;
|
||||
@ -1336,6 +1337,38 @@ ACMD_FUNC(heal)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Recover's AP and allows exact adjustments. [Rytech]
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(healap)
|
||||
{
|
||||
int ap = 0;
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
sscanf(message, "%11d", &ap);
|
||||
|
||||
// Overflow check.
|
||||
if (ap == INT_MIN) ap++;
|
||||
|
||||
if (ap == 0) {
|
||||
if (!status_percent_heal(&sd->bl, 0, 0, 100))
|
||||
clif_displaymessage(fd, msg_txt(sd, 823));// AP have already been recovered.
|
||||
else
|
||||
clif_displaymessage(fd, msg_txt(sd, 821));// AP recovered.
|
||||
return 0;
|
||||
}else if (ap > 0) {
|
||||
if (!status_heal(&sd->bl, 0, 0, ap, 0))
|
||||
clif_displaymessage(fd, msg_txt(sd, 823));// AP have already been recovered.
|
||||
else
|
||||
clif_displaymessage(fd, msg_txt(sd, 821));// AP recovered.
|
||||
return 0;
|
||||
}else{
|
||||
status_damage(NULL, &sd->bl, 0, 0, -ap, 0, 0, 0);
|
||||
clif_displaymessage(fd, msg_txt(sd, 822));// AP modified.
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* @item command (usage: @item <itemdid1:itemid2:itemname:..> <quantity>) (modified by [Yor] for pet_egg)
|
||||
* @itembound command (usage: @itembound <name/id_of_item> <quantity> <bound_type>)
|
||||
@ -1544,7 +1577,7 @@ ACMD_FUNC(itemreset)
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(baselevelup)
|
||||
{
|
||||
int level=0, i=0, status_point=0;
|
||||
int level=0, i=0, status_point=0, trait_point=0;
|
||||
nullpo_retr(-1, sd);
|
||||
level = atoi(message);
|
||||
|
||||
@ -1561,9 +1594,12 @@ ACMD_FUNC(baselevelup)
|
||||
if ((unsigned int)level > pc_maxbaselv(sd) || (unsigned int)level > pc_maxbaselv(sd) - sd->status.base_level) // fix positive overflow
|
||||
level = pc_maxbaselv(sd) - sd->status.base_level;
|
||||
for (i = 0; i < level; i++)
|
||||
{
|
||||
status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i);
|
||||
|
||||
trait_point += statpoint_db.pc_gets_trait_point(sd->status.base_level + i);
|
||||
}
|
||||
sd->status.status_point += status_point;
|
||||
sd->status.trait_point += trait_point;
|
||||
sd->status.base_level += (unsigned int)level;
|
||||
status_calc_pc(sd, SCO_FORCE);
|
||||
status_percent_heal(&sd->bl, 100, 100);
|
||||
@ -1582,13 +1618,20 @@ ACMD_FUNC(baselevelup)
|
||||
if ((unsigned int)level >= sd->status.base_level)
|
||||
level = sd->status.base_level-1;
|
||||
for (i = 0; i > -level; i--)
|
||||
{
|
||||
status_point += statpoint_db.pc_gets_status_point(sd->status.base_level + i - 1);
|
||||
if (sd->status.status_point < status_point)
|
||||
trait_point += statpoint_db.pc_gets_trait_point(sd->status.base_level + i - 1);
|
||||
}
|
||||
if (sd->status.status_point < status_point || sd->status.trait_point < trait_point)
|
||||
pc_resetstate(sd);
|
||||
if (sd->status.status_point < status_point)
|
||||
sd->status.status_point = 0;
|
||||
else
|
||||
sd->status.status_point -= status_point;
|
||||
if (sd->status.trait_point < trait_point)
|
||||
sd->status.trait_point = 0;
|
||||
else
|
||||
sd->status.trait_point -= trait_point;
|
||||
sd->status.base_level -= (unsigned int)level;
|
||||
clif_displaymessage(fd, msg_txt(sd,22)); // Base level lowered.
|
||||
status_calc_pc(sd, SCO_FORCE);
|
||||
@ -1596,6 +1639,7 @@ ACMD_FUNC(baselevelup)
|
||||
}
|
||||
sd->status.base_exp = 0;
|
||||
clif_updatestatus(sd, SP_STATUSPOINT);
|
||||
clif_updatestatus(sd, SP_TRAITPOINT);
|
||||
clif_updatestatus(sd, SP_BASELEVEL);
|
||||
clif_updatestatus(sd, SP_BASEEXP);
|
||||
clif_updatestatus(sd, SP_NEXTBASEEXP);
|
||||
@ -1842,7 +1886,7 @@ ACMD_FUNC(bodystyle)
|
||||
|
||||
memset(atcmd_output, '\0', sizeof(atcmd_output));
|
||||
|
||||
if (!(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) {
|
||||
if ( (sd->class_ & JOBL_FOURTH) || !(sd->class_ & JOBL_THIRD) || (sd->class_ & MAPID_THIRDMASK) == MAPID_SUPER_NOVICE_E || (sd->class_ & MAPID_THIRDMASK) == MAPID_STAR_EMPEROR || (sd->class_ & MAPID_THIRDMASK) == MAPID_SOUL_REAPER) {
|
||||
clif_displaymessage(fd, msg_txt(sd,740)); // This job has no alternate body styles.
|
||||
return -1;
|
||||
}
|
||||
@ -2574,6 +2618,55 @@ ACMD_FUNC(statuspoint)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* @trpoint
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(traitpoint)
|
||||
{
|
||||
int point;
|
||||
unsigned int new_trait_point;
|
||||
|
||||
if (!message || !*message || (point = atoi(message)) == 0) {
|
||||
clif_displaymessage(fd, msg_txt(sd, 820)); // Please enter a number (usage: @trpoint <number of points>).
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (point < 0)
|
||||
{
|
||||
if (sd->status.trait_point < (unsigned int)(-point))
|
||||
{
|
||||
new_trait_point = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_trait_point = sd->status.trait_point + point;
|
||||
}
|
||||
}
|
||||
else if (UINT_MAX - sd->status.trait_point < (unsigned int)point)
|
||||
{
|
||||
new_trait_point = UINT_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_trait_point = sd->status.trait_point + point;
|
||||
}
|
||||
|
||||
if (new_trait_point != sd->status.trait_point) {
|
||||
sd->status.trait_point = new_trait_point;
|
||||
clif_updatestatus(sd, SP_TRAITPOINT);
|
||||
clif_displaymessage(fd, msg_txt(sd, 174)); // Number of status points changed.
|
||||
}
|
||||
else {
|
||||
if (point < 0)
|
||||
clif_displaymessage(fd, msg_txt(sd, 41)); // Unable to decrease the number/value.
|
||||
else
|
||||
clif_displaymessage(fd, msg_txt(sd, 149)); // Unable to increase the number/value.
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* @skpoint (Rewritten by [Yor])
|
||||
*------------------------------------------*/
|
||||
@ -2757,7 +2850,7 @@ ACMD_FUNC(stat_all)
|
||||
}
|
||||
|
||||
count = 0;
|
||||
for (i = PARAM_STR; i <= PARAM_LUK; i++) {
|
||||
for (i = PARAM_STR; i < PARAM_POW; i++) {
|
||||
short new_value;
|
||||
|
||||
if (value > 0 && status[i] + value >= max_status[i])
|
||||
@ -2842,7 +2935,7 @@ ACMD_FUNC(trait_all) {
|
||||
new_value = status[i] + value;
|
||||
|
||||
if (new_value != status[i]) {
|
||||
pc_setstat( sd, SP_POW + i, new_value );
|
||||
pc_setstat( sd, SP_POW + i - PARAM_POW, new_value );
|
||||
clif_updatestatus(sd, SP_POW + i - PARAM_POW);
|
||||
clif_updatestatus(sd, SP_UPOW + i - PARAM_POW);
|
||||
count++;
|
||||
@ -4536,7 +4629,7 @@ ACMD_FUNC(mount_peco)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if( (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER && pc_checkskill(sd,RA_WUGRIDER) > 0 && (!pc_isfalcon(sd) || battle_config.warg_can_falcon) ) {
|
||||
if( (sd->class_&MAPID_THIRDMASK) == MAPID_RANGER && pc_checkskill(sd,RA_WUGRIDER) > 0 && (!pc_isfalcon(sd) || (pc_checkskill(sd, WH_HAWK_M) || battle_config.warg_can_falcon)) ) {
|
||||
if( !pc_isridingwug(sd) ) {
|
||||
clif_displaymessage(sd->fd,msg_txt(sd,1121)); // You have mounted your Warg.
|
||||
pc_setoption(sd, sd->sc.option|OPTION_WUGRIDER);
|
||||
@ -6035,18 +6128,76 @@ ACMD_FUNC(displayskill)
|
||||
t_tick tick;
|
||||
uint16 skill_id;
|
||||
uint16 skill_lv = 1;
|
||||
uint16 type = 0;
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if (!message || !*message || sscanf(message, "%6hu %6hu", &skill_id, &skill_lv) < 1)
|
||||
if (!message || !*message || sscanf(message, "%6hu %6hu %6hu", &skill_id, &skill_lv, &type) < 1)
|
||||
{
|
||||
clif_displaymessage(fd, msg_txt(sd,1166)); // Usage: @displayskill <skill ID> {<skill level>}
|
||||
clif_displaymessage(fd, msg_txt(sd,1166));// Usage: @displayskill <skill ID> {<skill level> <type>}
|
||||
clif_displaymessage(fd, msg_txt(sd,825));// Effect Types: 0: All, 1: Damage, 2: Splash Dmg, 3: No Damage, 4: Ground
|
||||
return -1;
|
||||
}
|
||||
status = status_get_status_data(&sd->bl);
|
||||
tick = gettick();
|
||||
clif_skill_damage(&sd->bl,&sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
||||
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
|
||||
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
||||
if (type == 0 || type == 1)
|
||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SINGLE);
|
||||
if (type == 0 || type == 2)
|
||||
clif_skill_damage(&sd->bl, &sd->bl, tick, status->amotion, status->dmotion, 1, 1, skill_id, skill_lv, DMG_SPLASH);
|
||||
if (type == 0 || type == 3)
|
||||
clif_skill_nodamage(&sd->bl, &sd->bl, skill_id, skill_lv, 1);
|
||||
if (type == 0 || type == 4)
|
||||
clif_skill_poseffect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y, tick);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* @displayskillcast by [Rytech]
|
||||
* Debug command to view casting animations for skills.
|
||||
* Can target self or the ground. Ground target can be
|
||||
* useful for seeing casting circle size.
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(displayskillcast)
|
||||
{
|
||||
uint16 skill_id;
|
||||
uint16 skill_lv = 1;
|
||||
uint16 cast_time = 5000;
|
||||
uint16 target_type = 0;
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if (!message || !*message || sscanf(message, "%6hu %6hu %6hu %6hu", &skill_id, &skill_lv, &target_type, &cast_time) < 1)
|
||||
{
|
||||
clif_displaymessage(fd, msg_txt(sd, 824));// Usage: @displayskillcast <skill ID> {<skill level> <ground target flag> <cast time>}
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ( target_type == 1)
|
||||
clif_skillcasting(&sd->bl, sd->bl.id, 0, sd->bl.x, sd->bl.y, skill_id, skill_lv, 0, cast_time);
|
||||
else
|
||||
clif_skillcasting(&sd->bl, sd->bl.id, sd->bl.id, 0, 0, skill_id, skill_lv, 0, cast_time);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* @displayskillunit by [Rytech]
|
||||
* Debug command to view unit animations for skills.
|
||||
*------------------------------------------*/
|
||||
ACMD_FUNC(displayskillunit)
|
||||
{
|
||||
uint16 unit_id;
|
||||
uint16 range = 0;
|
||||
uint16 skill_lv = 1;
|
||||
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
if (!message || !*message || sscanf(message, "%6hu %6hu %6hu", &unit_id, &skill_lv, &range) < 1)
|
||||
{
|
||||
clif_displaymessage(fd, msg_txt(sd, 826));// Usage: @displayskillunit <unit ID> {<skill level> <range>}
|
||||
return -1;
|
||||
}
|
||||
|
||||
clif_skill_unit_test(&sd->bl, sd->bl.x, sd->bl.y, unit_id, range, skill_lv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -7538,6 +7689,10 @@ ACMD_FUNC(mobinfo)
|
||||
mob->range2 , mob->range3, msize[mob->status.size],
|
||||
mrace[mob->status.race], melement[mob->status.def_ele], mob->status.ele_lv);
|
||||
clif_displaymessage(fd, atcmd_output);
|
||||
#ifdef RENEWAL
|
||||
sprintf(atcmd_output, msg_txt(sd, 827), mob->status.res, mob->status.mres);// MDEF:%d RES:%d MRES:%d
|
||||
clif_displaymessage(fd, atcmd_output);
|
||||
#endif
|
||||
// drops
|
||||
clif_displaymessage(fd, msg_txt(sd,1245)); // Drops:
|
||||
strcpy(atcmd_output, " ");
|
||||
@ -9209,16 +9364,27 @@ ACMD_FUNC(stats)
|
||||
{ "MaxHp - %d", 0 },
|
||||
{ "Sp - %d", 0 },
|
||||
{ "MaxSp - %d", 0 },
|
||||
{ "Ap - %d", 0 },
|
||||
{ "MaxAp - %d", 0 },
|
||||
{ "Str - %3d", 0 },
|
||||
{ "Agi - %3d", 0 },
|
||||
{ "Vit - %3d", 0 },
|
||||
{ "Int - %3d", 0 },
|
||||
{ "Dex - %3d", 0 },
|
||||
{ "Luk - %3d", 0 },
|
||||
{ "Pow - %3d", 0 },
|
||||
{ "Sta - %3d", 0 },
|
||||
{ "Wis - %3d", 0 },
|
||||
{ "Spl - %3d", 0 },
|
||||
{ "Con - %3d", 0 },
|
||||
{ "Crt - %3d", 0 },
|
||||
{ "Zeny - %d", 0 },
|
||||
{ "Free SK Points - %d", 0 },
|
||||
{ "Free Status Points - %d", 0 },
|
||||
{ "Free Trait Points - %d", 0 },
|
||||
{ "Free Skill Points - %d", 0 },
|
||||
{ "JobChangeLvl (2nd) - %d", 0 },
|
||||
{ "JobChangeLvl (3rd) - %d", 0 },
|
||||
{ "JobChangeLvl (4th) - %d", 0 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
@ -9233,16 +9399,27 @@ ACMD_FUNC(stats)
|
||||
output_table[3].value = sd->status.max_hp;
|
||||
output_table[4].value = sd->status.sp;
|
||||
output_table[5].value = sd->status.max_sp;
|
||||
output_table[6].value = sd->status.str;
|
||||
output_table[7].value = sd->status.agi;
|
||||
output_table[8].value = sd->status.vit;
|
||||
output_table[9].value = sd->status.int_;
|
||||
output_table[10].value = sd->status.dex;
|
||||
output_table[11].value = sd->status.luk;
|
||||
output_table[12].value = sd->status.zeny;
|
||||
output_table[13].value = sd->status.skill_point;
|
||||
output_table[14].value = sd->change_level_2nd;
|
||||
output_table[15].value = sd->change_level_3rd;
|
||||
output_table[6].value = sd->status.ap;
|
||||
output_table[7].value = sd->status.max_ap;
|
||||
output_table[8].value = sd->status.str;
|
||||
output_table[9].value = sd->status.agi;
|
||||
output_table[10].value = sd->status.vit;
|
||||
output_table[11].value = sd->status.int_;
|
||||
output_table[12].value = sd->status.dex;
|
||||
output_table[13].value = sd->status.luk;
|
||||
output_table[14].value = sd->status.pow;
|
||||
output_table[15].value = sd->status.sta;
|
||||
output_table[16].value = sd->status.wis;
|
||||
output_table[17].value = sd->status.spl;
|
||||
output_table[18].value = sd->status.con;
|
||||
output_table[19].value = sd->status.crt;
|
||||
output_table[20].value = sd->status.zeny;
|
||||
output_table[21].value = sd->status.status_point;
|
||||
output_table[22].value = sd->status.trait_point;
|
||||
output_table[23].value = sd->status.skill_point;
|
||||
output_table[24].value = sd->change_level_2nd;
|
||||
output_table[25].value = sd->change_level_3rd;
|
||||
output_table[26].value = sd->change_level_4th;
|
||||
|
||||
sprintf(job_jobname, "Job - %s %s", job_name(sd->status.class_), "(level %d)");
|
||||
sprintf(output, msg_txt(sd,53), sd->status.name); // '%s' stats:
|
||||
@ -10521,6 +10698,7 @@ void atcommand_basecommands(void) {
|
||||
ACMD_DEF2("kamic", kami),
|
||||
ACMD_DEF2("lkami", kami),
|
||||
ACMD_DEF(heal),
|
||||
ACMD_DEF(healap),
|
||||
ACMD_DEF(item),
|
||||
ACMD_DEF(item2),
|
||||
ACMD_DEF2("itembound",item),
|
||||
@ -10549,6 +10727,7 @@ void atcommand_basecommands(void) {
|
||||
ACMD_DEF(gat),
|
||||
ACMD_DEF(displaystatus),
|
||||
ACMD_DEF2("stpoint", statuspoint),
|
||||
ACMD_DEF2("trpoint", traitpoint),
|
||||
ACMD_DEF2("skpoint", skillpoint),
|
||||
ACMD_DEF(zeny),
|
||||
ACMD_DEF2("str", param),
|
||||
@ -10655,6 +10834,8 @@ void atcommand_basecommands(void) {
|
||||
ACMD_DEF(skillid),
|
||||
ACMD_DEF(useskill),
|
||||
ACMD_DEF(displayskill),
|
||||
ACMD_DEF(displayskillcast),
|
||||
ACMD_DEF(displayskillunit),
|
||||
ACMD_DEF(snow),
|
||||
ACMD_DEF(sakura),
|
||||
ACMD_DEF(clouds),
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -525,7 +525,6 @@ struct Battle_Config
|
||||
int max_extended_parameter;
|
||||
int max_summoner_parameter;
|
||||
int max_fourth_parameter;
|
||||
int max_fourth_trait;
|
||||
int max_third_aspd;
|
||||
int max_summoner_aspd;
|
||||
int vcast_stat_scale;
|
||||
@ -693,6 +692,19 @@ struct Battle_Config
|
||||
int feature_refineui;
|
||||
int rndopt_drop_pillar;
|
||||
|
||||
// 4th Jobs Stuff
|
||||
int trait_points_job_change;
|
||||
int use_traitpoint_table;
|
||||
int max_trait_parameter;
|
||||
int max_res_mres_reduction;
|
||||
int max_ap;
|
||||
int ap_rate;
|
||||
int restart_ap_rate;
|
||||
int loose_ap_on_death;
|
||||
int loose_ap_on_map;
|
||||
int keep_ap_on_logout;
|
||||
int attack_machine_level_difference;
|
||||
|
||||
#include "../custom/battle_config_struct.inc"
|
||||
};
|
||||
|
||||
|
@ -1000,34 +1000,45 @@ int chrif_changedsex(int fd) {
|
||||
return 0; //Do nothing? Likely safe.
|
||||
sd->status.sex = !sd->status.sex;
|
||||
|
||||
// reset skill of some job
|
||||
if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER) {
|
||||
int i;
|
||||
// remove specifical skills of Bard classes
|
||||
for(i = BA_MUSICALLESSON; i <= BA_APPLEIDUN; i++) {
|
||||
uint16 sk_idx = skill_get_index(i);
|
||||
if (sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT) {
|
||||
sd->status.skill_point += sd->status.skill[sk_idx].lv;
|
||||
sd->status.skill[sk_idx].id = 0;
|
||||
sd->status.skill[sk_idx].lv = 0;
|
||||
}
|
||||
}
|
||||
// remove specifical skills of Dancer classes
|
||||
for(i = DC_DANCINGLESSON; i <= DC_SERVICEFORYOU; i++) {
|
||||
uint16 sk_idx = skill_get_index(i);
|
||||
if (sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT) {
|
||||
sd->status.skill_point += sd->status.skill[sk_idx].lv;
|
||||
sd->status.skill[sk_idx].id = 0;
|
||||
sd->status.skill[sk_idx].lv = 0;
|
||||
// Reset skills of gender split jobs.
|
||||
if ((sd->class_&MAPID_UPPERMASK) == MAPID_BARDDANCER || (sd->class_&MAPID_UPPERMASK) == MAPID_KAGEROUOBORO) {
|
||||
const static struct {
|
||||
e_skill start;
|
||||
e_skill end;
|
||||
} ranges[] = {
|
||||
// Bard class exclusive skills
|
||||
{ BA_MUSICALLESSON, BA_APPLEIDUN },
|
||||
// Dancer class exclusive skills
|
||||
{ DC_DANCINGLESSON, DC_SERVICEFORYOU },
|
||||
// Minstrel class exclusive skills
|
||||
{ MI_RUSH_WINDMILL, MI_HARMONIZE },
|
||||
// Wanderer class exclusive skills
|
||||
{ WA_SWING_DANCE, WA_MOONLIT_SERENADE },
|
||||
// Kagerou class exclusive skills
|
||||
{ KG_KAGEHUMI, KG_KAGEMUSYA },
|
||||
// Oboro class exclusive skills
|
||||
{ OB_ZANGETSU, OB_AKAITSUKI },
|
||||
};
|
||||
|
||||
for( const auto& range : ranges ){
|
||||
for( uint16 skill_id = range.start; skill_id <= range.end; skill_id++ ){
|
||||
uint16 sk_idx = skill_get_index( skill_id );
|
||||
|
||||
if( sd->status.skill[sk_idx].id > 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PERMANENT ){
|
||||
sd->status.skill_point += sd->status.skill[sk_idx].lv;
|
||||
sd->status.skill[sk_idx].id = 0;
|
||||
sd->status.skill[sk_idx].lv = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clif_updatestatus(sd, SP_SKILLPOINT);
|
||||
// change job if necessary
|
||||
if (sd->status.sex) //Changed from Dancer
|
||||
// Change to other gender version of the job if needed.
|
||||
if (sd->status.sex)// Changed from female version of job.
|
||||
sd->status.class_ -= 1;
|
||||
else //Changed from Bard
|
||||
else// Changed from male version of job.
|
||||
sd->status.class_ += 1;
|
||||
//sd->class_ needs not be updated as both Dancer/Bard are the same.
|
||||
//sd->class_ Does not need to be updated as both versions of the job are the same.
|
||||
}
|
||||
// save character
|
||||
sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters
|
||||
|
250
src/map/clif.cpp
250
src/map/clif.cpp
@ -358,7 +358,19 @@ static inline unsigned char clif_bl_type(struct block_list *bl, bool walking) {
|
||||
case BL_ITEM: return 0x2; //ITEM_TYPE
|
||||
case BL_SKILL: return 0x3; //SKILL_TYPE
|
||||
case BL_CHAT: return 0x4; //UNKNOWN_TYPE
|
||||
case BL_MOB: return pcdb_checkid(status_get_viewdata(bl)->class_)?0x0:0x5; //NPC_MOB_TYPE
|
||||
case BL_MOB:
|
||||
if( pcdb_checkid( status_get_viewdata( bl )->class_ ) ){
|
||||
return 0x0; //PC_TYPE
|
||||
}else{
|
||||
switch( ( (mob_data*)bl )->special_state.ai ){
|
||||
case AI_ABR:
|
||||
return 0xd; //NPC_ABR_TYPE
|
||||
case AI_BIONIC:
|
||||
return 0xe; //NPC_BIONIC_TYPE
|
||||
default:
|
||||
return 0x5; //NPC_MOB_TYPE
|
||||
}
|
||||
}
|
||||
case BL_NPC:
|
||||
// From 2017-07-26 on NPC type units can also use player sprites.
|
||||
// There is one exception and this is if they are walking.
|
||||
@ -1511,6 +1523,34 @@ void clif_class_change_target(struct block_list *bl,int class_,int type, enum se
|
||||
}
|
||||
}
|
||||
|
||||
void clif_servantball( struct map_session_data& sd, struct block_list* target, enum send_target send_target ){
|
||||
struct PACKET_ZC_SPIRITS p = {};
|
||||
|
||||
p.packetType = HEADER_ZC_SPIRITS;
|
||||
p.GID = sd.bl.id;
|
||||
p.amount = sd.servantball;
|
||||
|
||||
if( target == nullptr ){
|
||||
target = &sd.bl;
|
||||
}
|
||||
|
||||
clif_send( &p, sizeof( p ), target, send_target );
|
||||
}
|
||||
|
||||
void clif_abyssball( struct map_session_data& sd, struct block_list* target, enum send_target send_target ){
|
||||
struct PACKET_ZC_SPIRITS p = {};
|
||||
|
||||
p.packetType = HEADER_ZC_SPIRITS;
|
||||
p.GID = sd.bl.id;
|
||||
p.amount = sd.abyssball;
|
||||
|
||||
if( target == nullptr ){
|
||||
target = &sd.bl;
|
||||
}
|
||||
|
||||
clif_send( &p, sizeof( p ), target, send_target );
|
||||
}
|
||||
|
||||
/// Notifies the client of an object's Millenium Shields.
|
||||
static void clif_millenniumshield_single(int fd, map_session_data *sd)
|
||||
{
|
||||
@ -1649,6 +1689,10 @@ int clif_spawn( struct block_list *bl, bool walking ){
|
||||
clif_millenniumshield(&sd->bl, sd->sc.data[SC_MILLENNIUMSHIELD]->val2);
|
||||
if (sd->soulball > 0)
|
||||
clif_soulball(sd);
|
||||
if (sd->servantball > 0)
|
||||
clif_servantball( *sd );
|
||||
if (sd->abyssball > 0)
|
||||
clif_abyssball( *sd );
|
||||
if(sd->state.size==SZ_BIG) // tiny/big players [Valaris]
|
||||
clif_specialeffect(bl,EF_GIANTBODY2,AREA);
|
||||
else if(sd->state.size==SZ_MEDIUM)
|
||||
@ -3522,6 +3566,115 @@ void clif_updatestatus(struct map_session_data *sd,int type)
|
||||
len=14;
|
||||
break;
|
||||
|
||||
#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
|
||||
case SP_AP:
|
||||
WFIFOL(fd, 4) = sd->battle_status.ap;
|
||||
break;
|
||||
case SP_TRAITPOINT:
|
||||
WFIFOL(fd, 4) = sd->status.trait_point;
|
||||
break;
|
||||
case SP_MAXAP:
|
||||
WFIFOL(fd, 4) = sd->battle_status.max_ap;
|
||||
break;
|
||||
|
||||
case SP_POW:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.pow;
|
||||
WFIFOL(fd, 10) = sd->battle_status.pow - sd->status.pow;
|
||||
len = 14;
|
||||
break;
|
||||
case SP_STA:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.sta;
|
||||
WFIFOL(fd, 10) = sd->battle_status.sta - sd->status.sta;
|
||||
len = 14;
|
||||
break;
|
||||
case SP_WIS:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.wis;
|
||||
WFIFOL(fd, 10) = sd->battle_status.wis - sd->status.wis;
|
||||
len = 14;
|
||||
break;
|
||||
case SP_SPL:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.spl;
|
||||
WFIFOL(fd, 10) = sd->battle_status.spl - sd->status.spl;
|
||||
len = 14;
|
||||
break;
|
||||
case SP_CON:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.con;
|
||||
WFIFOL(fd, 10) = sd->battle_status.con - sd->status.con;
|
||||
len = 14;
|
||||
break;
|
||||
case SP_CRT:
|
||||
WFIFOW(fd, 0) = 0x141;
|
||||
WFIFOL(fd, 2) = type;
|
||||
WFIFOL(fd, 6) = sd->status.crt;
|
||||
WFIFOL(fd, 10) = sd->battle_status.crt - sd->status.crt;
|
||||
len = 14;
|
||||
break;
|
||||
|
||||
case SP_UPOW:
|
||||
case SP_USTA:
|
||||
case SP_UWIS:
|
||||
case SP_USPL:
|
||||
case SP_UCON:
|
||||
case SP_UCRT:
|
||||
WFIFOW(fd, 0) = 0xbe;
|
||||
WFIFOB(fd, 4) = pc_need_trait_point(sd,type-SP_UPOW+SP_POW, 1);
|
||||
len = 5;
|
||||
break;
|
||||
|
||||
case SP_PATK:
|
||||
WFIFOL(fd, 4) = sd->battle_status.patk;
|
||||
break;
|
||||
case SP_SMATK:
|
||||
WFIFOL(fd, 4) = sd->battle_status.smatk;
|
||||
break;
|
||||
case SP_RES:
|
||||
WFIFOL(fd, 4) = sd->battle_status.res;
|
||||
break;
|
||||
case SP_MRES:
|
||||
WFIFOL(fd, 4) = sd->battle_status.mres;
|
||||
break;
|
||||
case SP_HPLUS:
|
||||
WFIFOL(fd, 4) = sd->battle_status.hplus;
|
||||
break;
|
||||
case SP_CRATE:
|
||||
WFIFOL(fd, 4) = sd->battle_status.crate;
|
||||
break;
|
||||
#else
|
||||
case SP_AP:
|
||||
case SP_TRAITPOINT:
|
||||
case SP_MAXAP:
|
||||
case SP_POW:
|
||||
case SP_STA:
|
||||
case SP_WIS:
|
||||
case SP_SPL:
|
||||
case SP_CON:
|
||||
case SP_CRT:
|
||||
case SP_UPOW:
|
||||
case SP_USTA:
|
||||
case SP_UWIS:
|
||||
case SP_USPL:
|
||||
case SP_UCON:
|
||||
case SP_UCRT:
|
||||
case SP_PATK:
|
||||
case SP_SMATK:
|
||||
case SP_RES:
|
||||
case SP_MRES:
|
||||
case SP_HPLUS:
|
||||
case SP_CRATE:
|
||||
// 4th job status are not supported by older clients
|
||||
return;
|
||||
#endif
|
||||
|
||||
default:
|
||||
ShowError("clif_updatestatus : unrecognized type %d\n",type);
|
||||
return;
|
||||
@ -3824,6 +3977,30 @@ void clif_initialstatus(struct map_session_data *sd) {
|
||||
|
||||
clif_updatestatus(sd, SP_ATTACKRANGE);
|
||||
clif_updatestatus(sd, SP_ASPD);
|
||||
|
||||
#ifdef RENEWAL
|
||||
clif_updatestatus(sd, SP_POW);
|
||||
clif_updatestatus(sd, SP_STA);
|
||||
clif_updatestatus(sd, SP_WIS);
|
||||
clif_updatestatus(sd, SP_SPL);
|
||||
clif_updatestatus(sd, SP_CON);
|
||||
clif_updatestatus(sd, SP_CRT);
|
||||
clif_updatestatus(sd, SP_PATK);
|
||||
clif_updatestatus(sd, SP_SMATK);
|
||||
clif_updatestatus(sd, SP_RES);
|
||||
clif_updatestatus(sd, SP_MRES);
|
||||
clif_updatestatus(sd, SP_HPLUS);
|
||||
clif_updatestatus(sd, SP_CRATE);
|
||||
clif_updatestatus(sd, SP_TRAITPOINT);
|
||||
clif_updatestatus(sd, SP_AP);
|
||||
clif_updatestatus(sd, SP_MAXAP);
|
||||
clif_updatestatus(sd, SP_UPOW);
|
||||
clif_updatestatus(sd, SP_USTA);
|
||||
clif_updatestatus(sd, SP_UWIS);
|
||||
clif_updatestatus(sd, SP_USPL);
|
||||
clif_updatestatus(sd, SP_UCON);
|
||||
clif_updatestatus(sd, SP_UCRT);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -3916,7 +4093,7 @@ void clif_arrow_create_list( struct map_session_data *sd ){
|
||||
/// Notifies the client, about the result of an status change request (ZC_STATUS_CHANGE_ACK).
|
||||
/// 00bc <status id>.W <result>.B <value>.B
|
||||
/// status id:
|
||||
/// SP_STR ~ SP_LUK
|
||||
/// SP_STR ~ SP_LUK and SP_POW ~ SP_CRT
|
||||
/// result:
|
||||
/// 0 = failure
|
||||
/// 1 = success
|
||||
@ -4732,6 +4909,10 @@ static void clif_getareachar_pc(struct map_session_data* sd,struct map_session_d
|
||||
clif_spiritcharm_single(sd->fd, dstsd);
|
||||
if (dstsd->soulball > 0)
|
||||
clif_soulball( dstsd, &sd->bl, SELF );
|
||||
if (dstsd->servantball > 0)
|
||||
clif_servantball( *dstsd, &sd->bl, SELF );
|
||||
if (dstsd->abyssball > 0)
|
||||
clif_abyssball( *dstsd, &sd->bl, SELF );
|
||||
if( (sd->status.party_id && dstsd->status.party_id == sd->status.party_id) || //Party-mate, or hpdisp setting.
|
||||
(sd->bg_id && sd->bg_id == dstsd->bg_id) || //BattleGround
|
||||
pc_has_permission(sd, PC_PERM_VIEW_HPMETER)
|
||||
@ -5209,6 +5390,25 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit,
|
||||
clif_changemapcell(fd, unit->bl.m, unit->bl.x, unit->bl.y, 5, SELF);
|
||||
}
|
||||
|
||||
/// 09ca <lenght>.W <id> L <creator id>.L <x>.W <y>.W <unit id>.L <range>.B <visible>.B <skill level>.B (ZC_SKILL_ENTRY5)
|
||||
void clif_skill_unit_test(struct block_list *bl, short x, short y, int unit_id, short range, short skill_lv) {
|
||||
unsigned char buf[128];
|
||||
|
||||
nullpo_retv(bl);
|
||||
|
||||
WBUFW(buf, 0) = 0x09ca;
|
||||
WBUFW(buf, 2) = packet_len(0x09ca);
|
||||
WBUFL(buf, 4) = 1000;
|
||||
WBUFL(buf, 8) = 2000;
|
||||
WBUFW(buf, 12) = x;
|
||||
WBUFW(buf, 14) = y;
|
||||
WBUFL(buf, 16) = unit_id;
|
||||
WBUFB(buf, 20) = (unsigned char)range;
|
||||
WBUFB(buf, 21) = 1;
|
||||
WBUFB(buf, 22) = (unsigned char)skill_lv;
|
||||
|
||||
clif_send(buf, packet_len(0x09ca), bl, AREA);
|
||||
}
|
||||
|
||||
/*==========================================
|
||||
* Server tells client to remove unit of id 'unit->bl.id'
|
||||
@ -6096,6 +6296,8 @@ void clif_skill_produce_mix_list( struct map_session_data *sd, int skill_id, int
|
||||
/// 4 = GN_MIX_COOKING
|
||||
/// 5 = GN_MAKEBOMB
|
||||
/// 6 = GN_S_PHARMACY
|
||||
/// 7 = MT_M_MACHINE - Unconfirmed
|
||||
/// 8 = BO_BIONIC_PHARMACY - Unconfirmed
|
||||
void clif_cooking_list( struct map_session_data *sd, int trigger, uint16 skill_id, int qty, int list_type ){
|
||||
nullpo_retv( sd );
|
||||
|
||||
@ -8368,7 +8570,6 @@ void clif_spiritball( struct block_list *bl, struct block_list* target, enum sen
|
||||
clif_send( &p, sizeof( p ), target == nullptr ? bl : target, send_target );
|
||||
}
|
||||
|
||||
|
||||
/// Notifies clients in area of a character's combo delay (ZC_COMBODELAY).
|
||||
/// 01d2 <account id>.L <delay>.L
|
||||
void clif_combo_delay(struct block_list *bl,t_tick wait)
|
||||
@ -9714,6 +9915,14 @@ void clif_refresh(struct map_session_data *sd)
|
||||
clif_updatestatus(sd,SP_INT);
|
||||
clif_updatestatus(sd,SP_DEX);
|
||||
clif_updatestatus(sd,SP_LUK);
|
||||
#ifdef RENEWAL
|
||||
clif_updatestatus(sd,SP_POW);
|
||||
clif_updatestatus(sd,SP_STA);
|
||||
clif_updatestatus(sd,SP_WIS);
|
||||
clif_updatestatus(sd,SP_SPL);
|
||||
clif_updatestatus(sd,SP_CON);
|
||||
clif_updatestatus(sd,SP_CRT);
|
||||
#endif
|
||||
if (sd->spiritball)
|
||||
clif_spiritball( &sd->bl, &sd->bl, SELF );
|
||||
if (sd->sc.data[SC_MILLENNIUMSHIELD])
|
||||
@ -9722,6 +9931,10 @@ void clif_refresh(struct map_session_data *sd)
|
||||
clif_spiritcharm_single(sd->fd, sd);
|
||||
if (sd->soulball)
|
||||
clif_soulball( sd, &sd->bl, SELF );
|
||||
if (sd->servantball)
|
||||
clif_servantball( *sd, &sd->bl, SELF );
|
||||
if (sd->abyssball)
|
||||
clif_abyssball( *sd, &sd->bl, SELF );
|
||||
if (sd->vd.cloth_color)
|
||||
clif_refreshlook(&sd->bl,sd->bl.id,LOOK_CLOTHES_COLOR,sd->vd.cloth_color,SELF);
|
||||
if (sd->vd.body_style)
|
||||
@ -10810,6 +11023,14 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
|
||||
clif_updatestatus(sd,SP_INT);
|
||||
clif_updatestatus(sd,SP_DEX);
|
||||
clif_updatestatus(sd,SP_LUK);
|
||||
#ifdef RENEWAL
|
||||
clif_updatestatus(sd,SP_POW);
|
||||
clif_updatestatus(sd,SP_STA);
|
||||
clif_updatestatus(sd,SP_WIS);
|
||||
clif_updatestatus(sd,SP_SPL);
|
||||
clif_updatestatus(sd,SP_CON);
|
||||
clif_updatestatus(sd,SP_CRT);
|
||||
#endif
|
||||
|
||||
// abort currently running script
|
||||
sd->state.using_fake_npc = 0;
|
||||
@ -11208,6 +11429,7 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd)
|
||||
if (sd->sc.data[SC_CLOAKING])
|
||||
skill_check_cloaking(&sd->bl, sd->sc.data[SC_CLOAKING]);
|
||||
status_change_end(&sd->bl, SC_ROLLINGCUTTER, INVALID_TIMER); // If you move, you lose your counters. [malufett]
|
||||
status_change_end(&sd->bl, SC_CRESCIVEBOLT, INVALID_TIMER);
|
||||
|
||||
pc_delinvincibletimer(sd);
|
||||
|
||||
@ -12488,6 +12710,26 @@ void clif_parse_StatusUp(int fd,struct map_session_data *sd)
|
||||
}
|
||||
|
||||
|
||||
/// Request to increase trait status.
|
||||
/// 0b24 <status id>.W <amount>.W
|
||||
/// status id:
|
||||
/// SP_POW ~ SP_CON
|
||||
/// amount:
|
||||
/// The amount to increase the trait status
|
||||
void clif_parse_traitstatus_up( int fd, struct map_session_data *sd ){
|
||||
#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
|
||||
struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP* p = (struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP*)RFIFOP( fd, 0 );
|
||||
|
||||
if( p->amount < 0 ){
|
||||
ShowDebug( "clif_parse_traitstatus_up: Negative 'increase' value sent by client! %s (AID: %d, CID: %d, value: %d)\n", sd->status.name, sd->status.account_id, sd->status.char_id, p->amount );
|
||||
return;
|
||||
}
|
||||
|
||||
pc_traitstatusup( sd, p->type, p->amount );
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/// Request to increase level of a skill (CZ_UPGRADE_SKILLLEVEL).
|
||||
/// 0112 <skill id>.W
|
||||
void clif_parse_SkillUp(int fd,struct map_session_data *sd)
|
||||
@ -12947,6 +13189,8 @@ void clif_parse_ProduceMix(int fd,struct map_session_data *sd){
|
||||
/// 4 = GN_MIX_COOKING
|
||||
/// 5 = GN_MAKEBOMB
|
||||
/// 6 = GN_S_PHARMACY
|
||||
/// 7 = MT_M_MACHINE - Unconfirmed
|
||||
/// 8 = BO_BIONIC_PHARMACY - Unconfirmed
|
||||
void clif_parse_Cooking(int fd,struct map_session_data *sd) {
|
||||
const struct PACKET_CZ_REQ_MAKINGITEM *p = (struct PACKET_CZ_REQ_MAKINGITEM *)RFIFOP( fd, 0 );
|
||||
|
||||
|
@ -478,7 +478,8 @@ enum useskill_fail_cause : uint8_t
|
||||
USESKILL_FAIL_THERE_ARE_NPC_AROUND = 83,
|
||||
USESKILL_FAIL_NEED_MORE_BULLET = 84,
|
||||
USESKILL_FAIL_COINS = 85,
|
||||
|
||||
// 86-99 unknown
|
||||
USESKILL_FAIL_AP_INSUFFICIENT = 100,
|
||||
USESKILL_FAIL_MAX
|
||||
};
|
||||
|
||||
@ -719,10 +720,14 @@ void clif_getareachar_skillunit(struct block_list *bl, struct skill_unit *unit,
|
||||
void clif_skill_delunit(struct skill_unit *unit);
|
||||
void clif_skillunit_update(struct block_list* bl);
|
||||
|
||||
void clif_skill_unit_test(struct block_list *bl, short x, short y, int unit_id, short range, short skill_lv);
|
||||
|
||||
void clif_autospell(struct map_session_data *sd,uint16 skill_lv);
|
||||
void clif_devotion(struct block_list *src, struct map_session_data *tsd);
|
||||
void clif_spiritball( struct block_list *bl, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
void clif_soulball( struct map_session_data *sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
void clif_servantball( struct map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
void clif_abyssball( struct map_session_data& sd, struct block_list* target = nullptr, enum send_target send_target = AREA );
|
||||
void clif_combo_delay(struct block_list *bl,t_tick wait);
|
||||
void clif_bladestop(struct block_list *src, int dst_id, int active);
|
||||
void clif_changemapcell(int fd, int16 m, int x, int y, int type, enum send_target target);
|
||||
|
@ -2431,4 +2431,8 @@
|
||||
parseable_packet( HEADER_CZ_SE_CASHSHOP_OPEN2, sizeof( struct PACKET_CZ_SE_CASHSHOP_OPEN2 ), clif_parse_cashshop_open_request, 0 );
|
||||
#endif
|
||||
|
||||
#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724
|
||||
parseable_packet( HEADER_CZ_UNCONFIRMED_TSTATUS_UP, sizeof( PACKET_CZ_UNCONFIRMED_TSTATUS_UP ), clif_parse_traitstatus_up, 0 );
|
||||
#endif
|
||||
|
||||
#endif /* CLIF_PACKETDB_HPP */
|
||||
|
@ -79,24 +79,33 @@ int elemental_create(map_session_data *sd, int class_, unsigned int lifetime) {
|
||||
|
||||
//per individual bonuses
|
||||
switch(db->class_){
|
||||
case ELEMENTALID_AGNI_S: case ELEMENTALID_AGNI_M:
|
||||
case ELEMENTALID_AGNI_L: //ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
|
||||
case ELEMENTALID_AGNI_S:
|
||||
case ELEMENTALID_AGNI_M:
|
||||
case ELEMENTALID_AGNI_L:
|
||||
case ELEMENTALID_ARDOR://ATK + (Summon Agni Skill Level x 20) / HIT + (Summon Agni Skill Level x 10)
|
||||
ele.atk += i * 20;
|
||||
ele.atk2 += i * 20;
|
||||
ele.hit += i * 10;
|
||||
break;
|
||||
case ELEMENTALID_AQUA_S: case ELEMENTALID_AQUA_M:
|
||||
case ELEMENTALID_AQUA_L: //MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
|
||||
case ELEMENTALID_AQUA_S:
|
||||
case ELEMENTALID_AQUA_M:
|
||||
case ELEMENTALID_AQUA_L:
|
||||
case ELEMENTALID_DILUVIO://MDEF + (Summon Aqua Skill Level x 10) / MATK + (Summon Aqua Skill Level x 20)
|
||||
ele.mdef += i * 10;
|
||||
ele.matk += i * 20;
|
||||
break;
|
||||
case ELEMENTALID_VENTUS_S: case ELEMENTALID_VENTUS_M:
|
||||
case ELEMENTALID_VENTUS_L: //FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
|
||||
case ELEMENTALID_VENTUS_S:
|
||||
case ELEMENTALID_VENTUS_M:
|
||||
case ELEMENTALID_VENTUS_L:
|
||||
case ELEMENTALID_PROCELLA://FLEE + (Summon Ventus Skill Level x 20) / MATK + (Summon Ventus Skill Level x 10)
|
||||
ele.flee += i * 20;
|
||||
ele.matk += i * 10;
|
||||
break;
|
||||
case ELEMENTALID_TERA_S: case ELEMENTALID_TERA_M:
|
||||
case ELEMENTALID_TERA_L: //DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
|
||||
case ELEMENTALID_TERA_S:
|
||||
case ELEMENTALID_TERA_M:
|
||||
case ELEMENTALID_TERA_L:
|
||||
case ELEMENTALID_TERREMOTUS:
|
||||
case ELEMENTALID_SERPENS://DEF + (Summon Tera Skill Level x 25) / ATK + (Summon Tera Skill Level x 5)
|
||||
ele.def += i * 25;
|
||||
ele.atk += i * 5;
|
||||
ele.atk2 += i * 5;
|
||||
@ -111,6 +120,17 @@ int elemental_create(map_session_data *sd, int class_, unsigned int lifetime) {
|
||||
ele.matk += 25 * i;
|
||||
}
|
||||
|
||||
if ((i = pc_checkskill(sd, EM_ELEMENTAL_SPIRIT_M)) > 0 && db->class_ >= ELEMENTALID_DILUVIO && db->class_ <= ELEMENTALID_SERPENS) {
|
||||
ele.hp = ele.max_hp += 10000 + 3000 * i;
|
||||
ele.sp = ele.max_sp += 100 * i;
|
||||
ele.atk += 100 + 20 * i;
|
||||
ele.atk2 += 100 + 20 * i;
|
||||
ele.matk += 20 * i;
|
||||
ele.def += 20 * i;
|
||||
ele.mdef += 4 * i;
|
||||
ele.flee += 10 * i;
|
||||
}
|
||||
|
||||
ele.life_time = lifetime;
|
||||
|
||||
// Request Char Server to create this elemental
|
||||
@ -296,6 +316,16 @@ int elemental_clean_single_effect(s_elemental_data *ed, uint16 skill_id) {
|
||||
case SC_UPHEAVAL_OPTION:
|
||||
case SC_CIRCLE_OF_FIRE_OPTION:
|
||||
case SC_TIDAL_WEAPON_OPTION:
|
||||
case SC_FLAMETECHNIC_OPTION:
|
||||
case SC_FLAMEARMOR_OPTION:
|
||||
case SC_COLD_FORCE_OPTION:
|
||||
case SC_CRYSTAL_ARMOR_OPTION:
|
||||
case SC_GRACE_BREEZE_OPTION:
|
||||
case SC_EYES_OF_STORM_OPTION:
|
||||
case SC_EARTH_CARE_OPTION:
|
||||
case SC_STRONG_PROTECTION_OPTION:
|
||||
case SC_DEEP_POISONING_OPTION:
|
||||
case SC_POISON_SHIELD_OPTION:
|
||||
if( bl ) status_change_end(bl,type,INVALID_TIMER); // Master
|
||||
status_change_end(&ed->bl,static_cast<sc_type>(type-1),INVALID_TIMER); // Elemental Spirit
|
||||
break;
|
||||
@ -338,6 +368,16 @@ int elemental_clean_effect(s_elemental_data *ed) {
|
||||
status_change_end(&ed->bl, SC_UPHEAVAL, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_CIRCLE_OF_FIRE, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_TIDAL_WEAPON, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_FLAMETECHNIC, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_FLAMEARMOR, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_COLD_FORCE, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_CRYSTAL_ARMOR, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_GRACE_BREEZE, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_EYES_OF_STORM, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_EARTH_CARE, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_STRONG_PROTECTION, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_DEEP_POISONING, INVALID_TIMER);
|
||||
status_change_end(&ed->bl, SC_POISON_SHIELD, INVALID_TIMER);
|
||||
|
||||
if( (sd = ed->master) == NULL )
|
||||
return 0;
|
||||
@ -367,6 +407,16 @@ int elemental_clean_effect(s_elemental_data *ed) {
|
||||
status_change_end(&sd->bl, SC_UPHEAVAL_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_CIRCLE_OF_FIRE_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_TIDAL_WEAPON_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_FLAMETECHNIC_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_FLAMEARMOR_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_COLD_FORCE_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_CRYSTAL_ARMOR_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_GRACE_BREEZE_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_EYES_OF_STORM_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_EARTH_CARE_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_STRONG_PROTECTION_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_DEEP_POISONING_OPTION, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_POISON_SHIELD_OPTION, INVALID_TIMER);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -745,8 +795,8 @@ uint64 ElementalDatabase::parseBodyNode(const YAML::Node &node) {
|
||||
if (!this->asInt32(node, "Id", id))
|
||||
return 0;
|
||||
|
||||
if (id < ELEMENTALID_AGNI_S || id > ELEMENTALID_TERA_L) {
|
||||
this->invalidWarning(node["Id"], "Invalid Id %d (valid range: %d-%d).\n", id, ELEMENTALID_AGNI_S, ELEMENTALID_TERA_L);
|
||||
if( !( ( id >= ELEMENTALID_AGNI_S && id <= ELEMENTALID_TERA_L ) || ( id >= ELEMENTALID_DILUVIO && id <= ELEMENTALID_SERPENS ) ) ) {
|
||||
this->invalidWarning( node["Id"], "Invalid Id %d (valid ranges: %d-%d and %d-%d).\n", id, ELEMENTALID_AGNI_S, ELEMENTALID_TERA_L, ELEMENTALID_DILUVIO, ELEMENTALID_SERPENS );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,7 @@ enum e_elemental_skillmode : uint8 {
|
||||
|
||||
///Enum of Elemental ID
|
||||
enum elemental_elementalid : uint16 {
|
||||
// Sorcerer's Elementals
|
||||
ELEMENTALID_AGNI_S = 2114,
|
||||
ELEMENTALID_AGNI_M,
|
||||
ELEMENTALID_AGNI_L,
|
||||
@ -40,6 +41,13 @@ enum elemental_elementalid : uint16 {
|
||||
ELEMENTALID_TERA_S,
|
||||
ELEMENTALID_TERA_M,
|
||||
ELEMENTALID_TERA_L,
|
||||
|
||||
// Elemental Master's Elementals
|
||||
ELEMENTALID_DILUVIO = 20816,
|
||||
ELEMENTALID_ARDOR,
|
||||
ELEMENTALID_PROCELLA,
|
||||
ELEMENTALID_TERREMOTUS,
|
||||
ELEMENTALID_SERPENS,
|
||||
};
|
||||
|
||||
struct s_elemental_skill {
|
||||
|
@ -230,7 +230,7 @@ enum e_item_job : uint16
|
||||
ITEMJ_FOURTH = 0x40,
|
||||
ITEMJ_MAX = 0xFF,
|
||||
|
||||
ITEMJ_ALL_UPPER = ITEMJ_UPPER | ITEMJ_THIRD_UPPER,
|
||||
ITEMJ_ALL_UPPER = ITEMJ_UPPER | ITEMJ_THIRD_UPPER | ITEMJ_FOURTH,
|
||||
ITEMJ_ALL_BABY = ITEMJ_BABY | ITEMJ_THIRD_BABY,
|
||||
ITEMJ_ALL_THIRD = ITEMJ_THIRD | ITEMJ_THIRD_UPPER | ITEMJ_THIRD_BABY,
|
||||
|
||||
|
@ -2112,6 +2112,8 @@ int map_quit(struct map_session_data *sd) {
|
||||
status_change_end(&sd->bl, SC_EQC, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SPRITEMABLE, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SV_ROOTTWIST, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_GUARD_STANCE, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_ATTACK_STANCE, INVALID_TIMER);
|
||||
// Remove visuals effect from headgear
|
||||
status_change_end(&sd->bl, SC_MOONSTAR, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SUPER_STAR, INVALID_TIMER);
|
||||
@ -2135,6 +2137,7 @@ int map_quit(struct map_session_data *sd) {
|
||||
status_change_end(&sd->bl, SC_H_MINE, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_ANTI_M_BLAST, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_B_TRAP, INVALID_TIMER);
|
||||
status_change_end(&sd->bl, SC_SHADOW_STRIP, INVALID_TIMER);
|
||||
}
|
||||
if (battle_config.debuff_on_logout&2) { //Remove positive buffs
|
||||
status_change_end(&sd->bl, SC_MAXIMIZEPOWER, INVALID_TIMER);
|
||||
|
@ -75,6 +75,7 @@ void map_msg_reload(void);
|
||||
#define MAPID_BASEMASK 0x00ff
|
||||
#define MAPID_UPPERMASK 0x0fff
|
||||
#define MAPID_THIRDMASK (JOBL_THIRD|MAPID_UPPERMASK)
|
||||
#define MAPID_FOURTHMASK (JOBL_FOURTH|MAPID_THIRDMASK|JOBL_UPPER)
|
||||
|
||||
//First Jobs
|
||||
//Note the oddity of the novice:
|
||||
@ -403,6 +404,8 @@ enum mob_ai {
|
||||
AI_FAW,
|
||||
AI_GUILD,
|
||||
AI_WAVEMODE,
|
||||
AI_ABR,
|
||||
AI_BIONIC,
|
||||
AI_MAX
|
||||
};
|
||||
|
||||
@ -517,6 +520,7 @@ enum _sp {
|
||||
SP_DELAYRATE,SP_HP_DRAIN_VALUE_RACE, SP_SP_DRAIN_VALUE_RACE, // 1083-1085
|
||||
SP_IGNORE_MDEF_RACE_RATE,SP_IGNORE_DEF_RACE_RATE,SP_SKILL_HEAL2,SP_ADDEFF_ONSKILL, //1086-1089
|
||||
SP_ADD_HEAL_RATE,SP_ADD_HEAL2_RATE, SP_EQUIP_ATK, //1090-1092
|
||||
SP_PATK_RATE,SP_SMATK_RATE,SP_RES_RATE,SP_MRES_RATE,SP_HPLUS_RATE,SP_CRATE_RATE,SP_ALL_TRAIT_STATS,SP_MAXAPRATE,// 1093-1100
|
||||
|
||||
SP_RESTART_FULL_RECOVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005
|
||||
SP_NO_CASTCANCEL2,SP_NO_MISC_DAMAGE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR, SP_UNBREAKABLE_HELM, // 2006-2010
|
||||
@ -544,6 +548,7 @@ enum _sp {
|
||||
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
|
||||
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
|
||||
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN, SP_ADD_ITEM_SPHEAL_RATE, SP_ADD_ITEMGROUP_SPHEAL_RATE, // 2098-2101
|
||||
SP_WEAPON_SUBSIZE // 2102
|
||||
};
|
||||
|
||||
enum _look {
|
||||
|
@ -1437,7 +1437,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,t_tick tick)
|
||||
// Distance with between slave and master is measured.
|
||||
md->master_dist = distance_bl(&md->bl, bl);
|
||||
|
||||
if (battle_config.slave_stick_with_master) {
|
||||
if (battle_config.slave_stick_with_master || md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC) {
|
||||
// Since the master was in near immediately before, teleport is carried out and it pursues.
|
||||
if (bl->m != md->bl.m || (old_dist < 10 && md->master_dist > 18) || md->master_dist > MAX_MINCHASE) {
|
||||
md->master_dist = 0;
|
||||
@ -3056,7 +3056,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
|
||||
//Emperium destroyed by script. Discard mvp character. [Skotlex]
|
||||
mvp_sd = NULL;
|
||||
|
||||
rebirth = ( md->sc.data[SC_KAIZEL] || (md->sc.data[SC_REBIRTH] && !md->state.rebirth) );
|
||||
rebirth = ( md->sc.data[SC_KAIZEL] || md->sc.data[SC_ULTIMATE_S] || (md->sc.data[SC_REBIRTH] && !md->state.rebirth) );
|
||||
if( !rebirth ) { // Only trigger event on final kill
|
||||
if( src ) {
|
||||
switch( src->type ) { //allowed type
|
||||
@ -4509,6 +4509,32 @@ uint64 MobDatabase::parseBodyNode(const YAML::Node &node) {
|
||||
mob->status.mdef = 0;
|
||||
}
|
||||
|
||||
if (this->nodeExists(node, "Resistance")) {
|
||||
uint16 res;
|
||||
|
||||
if (!this->asUInt16(node, "Resistance", res))
|
||||
return 0;
|
||||
|
||||
mob->status.res = res;
|
||||
}
|
||||
else {
|
||||
if (!exists)
|
||||
mob->status.res = 0;
|
||||
}
|
||||
|
||||
if (this->nodeExists(node, "MagicResistance")) {
|
||||
uint16 mres;
|
||||
|
||||
if (!this->asUInt16(node, "MagicResistance", mres))
|
||||
return 0;
|
||||
|
||||
mob->status.mres = mres;
|
||||
}
|
||||
else {
|
||||
if (!exists)
|
||||
mob->status.mres = 0;
|
||||
}
|
||||
|
||||
if (this->nodeExists(node, "Str")) {
|
||||
uint16 stat;
|
||||
|
||||
@ -5140,6 +5166,13 @@ static bool mob_read_sqldb_sub(std::vector<std::string> str) {
|
||||
node["Drops"][i] = drops;
|
||||
}
|
||||
|
||||
#ifdef RENEWAL
|
||||
if (!str[++index].empty())
|
||||
node["Resistance"] = std::stoi(str[index]);
|
||||
if (!str[++index].empty())
|
||||
node["MagicResistance"] = std::stoi(str[index]);
|
||||
#endif
|
||||
|
||||
return mob_db.parseBodyNode(node) > 0;
|
||||
}
|
||||
|
||||
@ -5161,6 +5194,9 @@ static int mob_read_sqldb(void)
|
||||
"`mode_canmove`,`mode_looter`,`mode_aggressive`,`mode_assist`,`mode_castsensoridle`,`mode_norandomwalk`,`mode_nocast`,`mode_canattack`,`mode_castsensorchase`,`mode_changechase`,`mode_angry`,`mode_changetargetmelee`,`mode_changetargetchase`,`mode_targetweak`,`mode_randomtarget`,`mode_ignoremelee`,`mode_ignoremagic`,`mode_ignoreranged`,`mode_mvp`,`mode_ignoremisc`,`mode_knockbackimmune`,`mode_teleportblock`,`mode_fixeditemdrop`,`mode_detector`,`mode_statusimmune`,`mode_skillimmune`,"
|
||||
"`mvpdrop1_item`,`mvpdrop1_rate`,`mvpdrop1_option`,`mvpdrop1_index`,`mvpdrop2_item`,`mvpdrop2_rate`,`mvpdrop2_option`,`mvpdrop2_index`,`mvpdrop3_item`,`mvpdrop3_rate`,`mvpdrop3_option`,`mvpdrop3_index`,"
|
||||
"`drop1_item`,`drop1_rate`,`drop1_nosteal`,`drop1_option`,`drop1_index`,`drop2_item`,`drop2_rate`,`drop2_nosteal`,`drop2_option`,`drop2_index`,`drop3_item`,`drop3_rate`,`drop3_nosteal`,`drop3_option`,`drop3_index`,`drop4_item`,`drop4_rate`,`drop4_nosteal`,`drop4_option`,`drop4_index`,`drop5_item`,`drop5_rate`,`drop5_nosteal`,`drop5_option`,`drop5_index`,`drop6_item`,`drop6_rate`,`drop6_nosteal`,`drop6_option`,`drop6_index`,`drop7_item`,`drop7_rate`,`drop7_nosteal`,`drop7_option`,`drop7_index`,`drop8_item`,`drop8_rate`,`drop8_nosteal`,`drop8_option`,`drop8_index`,`drop9_item`,`drop9_rate`,`drop9_nosteal`,`drop9_option`,`drop9_index`,`drop10_item`,`drop10_rate`,`drop10_nosteal`,`drop10_option`,`drop10_index`"
|
||||
#ifdef RENEWAL
|
||||
",`resistance`,`magic_resistance`"
|
||||
#endif
|
||||
" FROM `%s`", mob_db_name[fi]) ) {
|
||||
Sql_ShowDebug(mmysql_handle);
|
||||
continue;
|
||||
|
@ -74,6 +74,14 @@ enum MOBID {
|
||||
MOBID_S_GIANT_HORNET,
|
||||
MOBID_S_LUCIOLA_VESPA,
|
||||
MOBID_GUILD_SKILL_FLAG = 20269,
|
||||
MOBID_ABR_BATTLE_WARIOR = 20834,
|
||||
MOBID_ABR_DUAL_CANNON,
|
||||
MOBID_ABR_MOTHER_NET,
|
||||
MOBID_ABR_INFINITY,
|
||||
MOBID_BIONIC_WOODENWARRIOR = 20848,
|
||||
MOBID_BIONIC_WOODEN_FAIRY,
|
||||
MOBID_BIONIC_CREEPER,
|
||||
MOBID_BIONIC_HELLTREE,
|
||||
};
|
||||
|
||||
///Mob skill states.
|
||||
@ -265,7 +273,7 @@ private:
|
||||
bool parseDropNode(std::string nodeName, YAML::Node node, uint8 max, s_mob_drop *drops);
|
||||
|
||||
public:
|
||||
MobDatabase() : TypesafeCachedYamlDatabase("MOB_DB", 2, 1) {
|
||||
MobDatabase() : TypesafeCachedYamlDatabase("MOB_DB", 3, 1) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -159,6 +159,12 @@ struct PACKET_ZC_ACK_GUILDSTORAGE_LOG{
|
||||
struct PACKET_ZC_ACK_GUILDSTORAGE_LOG_sub items[];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct PACKET_CZ_UNCONFIRMED_TSTATUS_UP{
|
||||
int16 packetType;
|
||||
int16 type;
|
||||
int16 amount;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct PACKET_CZ_GUILD_EMBLEM_CHANGE2 {
|
||||
int16 packetType;
|
||||
uint32 guild_id;
|
||||
@ -265,6 +271,7 @@ DEFINE_PACKET_HEADER(ZC_ACK_GUILDSTORAGE_LOG, 0x9da)
|
||||
DEFINE_PACKET_HEADER(CZ_NPC_MARKET_PURCHASE, 0x9d6)
|
||||
DEFINE_PACKET_HEADER(CZ_REQ_APPLY_BARGAIN_SALE_ITEM2, 0xa3d)
|
||||
DEFINE_PACKET_HEADER(ZC_REMOVE_EFFECT, 0x0b0d)
|
||||
DEFINE_PACKET_HEADER(CZ_UNCONFIRMED_TSTATUS_UP, 0x0b24)
|
||||
DEFINE_PACKET_HEADER(CZ_GUILD_EMBLEM_CHANGE2, 0x0b46)
|
||||
DEFINE_PACKET_HEADER(ZC_UNCONFIRMED_SPIRITS3, 0xb73)
|
||||
|
||||
|
@ -242,18 +242,21 @@ static void party_check_state(struct party_data *p)
|
||||
case JOB_SURA:
|
||||
case JOB_SURA_T:
|
||||
case JOB_BABY_SURA:
|
||||
case JOB_INQUISITOR:
|
||||
p->state.monk = 1;
|
||||
break;
|
||||
case JOB_STAR_GLADIATOR:
|
||||
case JOB_BABY_STAR_GLADIATOR:
|
||||
case JOB_STAR_EMPEROR:
|
||||
case JOB_BABY_STAR_EMPEROR:
|
||||
case JOB_SKY_EMPEROR:
|
||||
p->state.sg = 1;
|
||||
break;
|
||||
case JOB_SUPER_NOVICE:
|
||||
case JOB_SUPER_BABY:
|
||||
case JOB_SUPER_NOVICE_E:
|
||||
case JOB_SUPER_BABY_E:
|
||||
case JOB_HYPER_NOVICE:
|
||||
p->state.snovice = 1;
|
||||
break;
|
||||
case JOB_TAEKWON:
|
||||
|
776
src/map/pc.cpp
776
src/map/pc.cpp
File diff suppressed because it is too large
Load Diff
@ -40,6 +40,9 @@ enum sc_type : int16;
|
||||
#define MAX_SOUL_BALL 20 /// Max soul ball
|
||||
#define MAX_STELLAR_MARKS 5 /// Max stellar marks
|
||||
#define MAX_UNITED_SOULS 12 /// Max united souls
|
||||
#define MAX_SERVANTBALL 5 /// Max servant weapons
|
||||
#define MAX_SERVANT_SIGN 5 /// Max servant signs
|
||||
#define MAX_ABYSSBALL 5 /// Max abyss spheres
|
||||
|
||||
#define LANGTYPE_VAR "#langtype"
|
||||
#define CASHPOINT_VAR "#CASHPOINTS"
|
||||
@ -52,6 +55,7 @@ enum sc_type : int16;
|
||||
#define PCDIECOUNTER_VAR "PC_DIE_COUNTER"
|
||||
#define JOBCHANGE2ND_VAR "jobchange_level"
|
||||
#define JOBCHANGE3RD_VAR "jobchange_level_3rd"
|
||||
#define JOBCHANGE4TH_VAR "jobchange_level_4th"
|
||||
#define TKMISSIONID_VAR "TK_MISSION_ID"
|
||||
#define TKMISSIONCOUNT_VAR "TK_MISSION_COUNT"
|
||||
#define ATTENDANCE_DATE_VAR "#AttendanceDate"
|
||||
@ -449,6 +453,7 @@ struct map_session_data {
|
||||
bool skillitem_keep_requirement;
|
||||
uint16 skill_id_old,skill_lv_old;
|
||||
uint16 skill_id_dance,skill_lv_dance;
|
||||
uint16 skill_id_song, skill_lv_song;
|
||||
short cook_mastery; // range: [0,1999] [Inkfish]
|
||||
struct skill_cooldown_entry * scd[MAX_SKILLCOOLDOWN]; // Skill Cooldown
|
||||
uint16 cloneskill_idx, ///Stores index of copied skill by Intimidate/Plagiarism
|
||||
@ -503,6 +508,7 @@ struct map_session_data {
|
||||
int magic_addclass[CLASS_MAX];
|
||||
int magic_addsize[SZ_MAX];
|
||||
int magic_atk_ele[ELE_MAX];
|
||||
int weapon_subsize[SZ_MAX];
|
||||
int magic_subsize[SZ_MAX];
|
||||
int critaddrace[RC_MAX];
|
||||
int expaddrace[RC_MAX];
|
||||
@ -549,7 +555,7 @@ struct map_session_data {
|
||||
|
||||
// zeroed vars start here.
|
||||
struct s_bonus {
|
||||
int hp, sp;
|
||||
int hp, sp, ap;
|
||||
int atk_rate;
|
||||
int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
|
||||
int nsshealhp,nsshealsp;
|
||||
@ -594,10 +600,11 @@ struct map_session_data {
|
||||
} bonus;
|
||||
// zeroed vars end here.
|
||||
|
||||
int castrate,hprate,sprate,dsprate;
|
||||
int castrate,hprate,sprate,aprate,dsprate;
|
||||
int hprecov_rate,sprecov_rate;
|
||||
int matk_rate;
|
||||
int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
|
||||
int patk_rate,smatk_rate,res_rate,mres_rate,hplus_rate,crate_rate;
|
||||
|
||||
t_itemid itemid;
|
||||
short itemindex; //Used item's index in sd->inventory [Skotlex]
|
||||
@ -610,6 +617,8 @@ struct map_session_data {
|
||||
int spiritcharm_type; //Spirit type
|
||||
int spiritcharm_timer[MAX_SPIRITCHARM];
|
||||
int8 soulball, soulball_old;
|
||||
int8 servantball, servantball_old;
|
||||
int8 abyssball, abyssball_old;
|
||||
|
||||
unsigned char potion_success_counter; //Potion successes in row counter
|
||||
unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
|
||||
@ -618,6 +627,7 @@ struct map_session_data {
|
||||
int devotion[MAX_DEVOTION]; //Stores the account IDs of chars devoted to.
|
||||
int stellar_mark[MAX_STELLAR_MARKS]; // Stores the account ID's of character's with a stellar mark.
|
||||
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
|
||||
int servant_sign[MAX_SERVANT_SIGN]; // Stores the account ID's of character's with a servant sign.
|
||||
|
||||
int trade_partner;
|
||||
struct s_deal {
|
||||
@ -676,6 +686,7 @@ struct map_session_data {
|
||||
|
||||
uint16 change_level_2nd; // job level when changing from 1st to 2nd class [jobchange_level in global_reg_value]
|
||||
uint16 change_level_3rd; // job level when changing from 2nd to 3rd class [jobchange_level_3rd in global_reg_value]
|
||||
uint16 change_level_4th; // job level when changing from 3rd to 4th class [jobchange_level_4rd in global_reg_value]
|
||||
|
||||
char fakename[NAME_LENGTH]; // fake names [Valaris]
|
||||
|
||||
@ -1110,7 +1121,8 @@ enum e_mado_type : uint16 {
|
||||
( (class_) >= JOB_BABY_STAR_GLADIATOR2 && (class_) <= JOB_BABY_STAR_EMPEROR2 ) || \
|
||||
( (class_) >= JOB_DRAGON_KNIGHT && (class_) <= JOB_TROUVERE ) || \
|
||||
( (class_) >= JOB_WINDHAWK2 && (class_) <= JOB_IMPERIAL_GUARD2 ) || \
|
||||
( (class_) >= JOB_SKY_EMPEROR && (class_) <= JOB_SPIRIT_HANDLER ) \
|
||||
( (class_) >= JOB_SKY_EMPEROR && (class_) <= JOB_SPIRIT_HANDLER ) || \
|
||||
(class_) == JOB_SKY_EMPEROR2 \
|
||||
)
|
||||
#define pcdb_checkid(class_) pcdb_checkid_sub((unsigned int)class_)
|
||||
|
||||
@ -1168,24 +1180,26 @@ public:
|
||||
|
||||
extern AttendanceDatabase attendance_db;
|
||||
|
||||
class PlayerStatPointDatabase : public YamlDatabase {
|
||||
private:
|
||||
std::unordered_map<uint16, uint32> statpoint_table;
|
||||
struct s_statpoint_entry{
|
||||
uint16 level;
|
||||
uint32 statpoints;
|
||||
uint32 traitpoints;
|
||||
};
|
||||
|
||||
class PlayerStatPointDatabase : public TypesafeCachedYamlDatabase<uint16, s_statpoint_entry>{
|
||||
public:
|
||||
PlayerStatPointDatabase() : YamlDatabase("STATPOINT_DB", 1) {
|
||||
PlayerStatPointDatabase() : TypesafeCachedYamlDatabase("STATPOINT_DB", 2, 1) {
|
||||
|
||||
}
|
||||
|
||||
void clear(){
|
||||
statpoint_table.clear();
|
||||
}
|
||||
const std::string getDefaultLocation();
|
||||
uint64 parseBodyNode(const YAML::Node& node);
|
||||
void loadingFinished();
|
||||
|
||||
uint32 pc_gets_status_point(uint16 level);
|
||||
uint32 get_table_point(uint16 level);
|
||||
uint32 pc_gets_trait_point(uint16 level);
|
||||
uint32 get_trait_table_point(uint16 level);
|
||||
};
|
||||
|
||||
extern PlayerStatPointDatabase statpoint_db;
|
||||
@ -1229,6 +1243,7 @@ void pc_setinventorydata(struct map_session_data *sd);
|
||||
int pc_get_skillcooldown(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
|
||||
uint8 pc_checkskill(struct map_session_data *sd,uint16 skill_id);
|
||||
uint8 pc_checkskill_summoner(map_session_data *sd, e_summoner_power_type type);
|
||||
uint8 pc_checkskill_imperial_guard(struct map_session_data *sd, short flag);
|
||||
short pc_checkequip(struct map_session_data *sd,int pos,bool checkall=false);
|
||||
bool pc_checkequip2(struct map_session_data *sd, t_itemid nameid, int min, int max);
|
||||
|
||||
@ -1339,6 +1354,10 @@ bool pc_statusup(struct map_session_data*,int,int);
|
||||
int pc_statusup2(struct map_session_data*,int,int);
|
||||
int pc_getstat(map_session_data *sd, int type);
|
||||
int pc_setstat(struct map_session_data* sd, int type, int val);
|
||||
int pc_need_trait_point(struct map_session_data *, int, int);
|
||||
int pc_maxtraitparameterincrease(struct map_session_data*, int);
|
||||
bool pc_traitstatusup(struct map_session_data*, int, int);
|
||||
int pc_traitstatusup2(struct map_session_data*, int, int);
|
||||
void pc_skillup(struct map_session_data*,uint16 skill_id);
|
||||
int pc_allskillup(struct map_session_data*);
|
||||
int pc_resetlvl(struct map_session_data*,int type);
|
||||
@ -1359,11 +1378,11 @@ int pc_sub_skillatk_bonus(struct map_session_data *sd, uint16 skill_id);
|
||||
int pc_skillheal_bonus(struct map_session_data *sd, uint16 skill_id);
|
||||
int pc_skillheal2_bonus(struct map_session_data *sd, uint16 skill_id);
|
||||
|
||||
void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp);
|
||||
void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp, unsigned int ap);
|
||||
int pc_dead(struct map_session_data *sd,struct block_list *src);
|
||||
void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp);
|
||||
void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp, unsigned int ap = 0);
|
||||
bool pc_revive_item(struct map_session_data *sd);
|
||||
void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, int type);
|
||||
void pc_heal(struct map_session_data *sd,unsigned int hp,unsigned int sp, unsigned int ap, int type);
|
||||
int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp,int sp);
|
||||
int pc_percentheal(struct map_session_data *sd,int,int);
|
||||
bool pc_jobchange(struct map_session_data *sd, int job, char upper);
|
||||
@ -1479,6 +1498,10 @@ void pc_addspiritball(struct map_session_data *sd,int interval,int max);
|
||||
void pc_delspiritball(struct map_session_data *sd,int count,int type);
|
||||
int pc_addsoulball(map_session_data *sd, int max);
|
||||
int pc_delsoulball(map_session_data *sd, int count, bool type);
|
||||
void pc_addservantball( struct map_session_data& sd, int count = 1 );
|
||||
void pc_delservantball( struct map_session_data& sd, int count = 1 );
|
||||
void pc_addabyssball( struct map_session_data& sd, int count = 1 );
|
||||
void pc_delabyssball( struct map_session_data& sd, int count = 1 );
|
||||
|
||||
void pc_addfame(struct map_session_data *sd,int count);
|
||||
unsigned char pc_famerank(uint32 char_id, int job);
|
||||
|
@ -9583,6 +9583,50 @@ BUILDIN_FUNC(statusup2)
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* traitstatusup <stat>{,<char_id>};
|
||||
**/
|
||||
BUILDIN_FUNC(traitstatusup)
|
||||
{
|
||||
struct map_session_data *sd;
|
||||
|
||||
if (!script_charid2sd(3, sd))
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
|
||||
int type = script_getnum( st, 2 );
|
||||
|
||||
if( type < SP_POW || type > SP_CRT ){
|
||||
ShowError( "buildin_traitstatusup: Unknown trait type %d\n", type );
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
|
||||
pc_traitstatusup( sd, type, 1 );
|
||||
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* traitstatusup2 <stat>,<amount>{,<char_id>};
|
||||
**/
|
||||
BUILDIN_FUNC(traitstatusup2)
|
||||
{
|
||||
struct map_session_data *sd;
|
||||
|
||||
if (!script_charid2sd(4, sd))
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
|
||||
int type = script_getnum( st, 2 );
|
||||
|
||||
if( type < SP_POW || type > SP_CRT ){
|
||||
ShowError( "buildin_traitstatusup2: Unknown trait type %d\n", type );
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
|
||||
pc_traitstatusup2( sd, type, script_getnum( st, 3 ) );
|
||||
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/// See 'doc/item_bonus.txt'
|
||||
///
|
||||
/// bonus <bonus type>,<val1>;
|
||||
@ -17842,6 +17886,8 @@ BUILDIN_FUNC(getmonsterinfo)
|
||||
case MOB_ATK2: script_pushint(st,mob->status.rhw.atk2); break;
|
||||
case MOB_DEF: script_pushint(st,mob->status.def); break;
|
||||
case MOB_MDEF: script_pushint(st,mob->status.mdef); break;
|
||||
case MOB_RES: script_pushint(st, mob->status.res); break;
|
||||
case MOB_MRES: script_pushint(st, mob->status.mres); break;
|
||||
case MOB_STR: script_pushint(st,mob->status.str); break;
|
||||
case MOB_AGI: script_pushint(st,mob->status.agi); break;
|
||||
case MOB_VIT: script_pushint(st,mob->status.vit); break;
|
||||
@ -18267,6 +18313,8 @@ BUILDIN_FUNC(getunitdata)
|
||||
getunitdata_sub(UMOB_BODY2, md->vd->body_style);
|
||||
getunitdata_sub(UMOB_GROUP_ID, md->ud.group_id);
|
||||
getunitdata_sub(UMOB_IGNORE_CELL_STACK_LIMIT, md->ud.state.ignore_cell_stack_limit);
|
||||
getunitdata_sub(UMOB_RES, md->status.res);
|
||||
getunitdata_sub(UMOB_MRES, md->status.mres);
|
||||
break;
|
||||
|
||||
case BL_HOM:
|
||||
@ -18672,6 +18720,8 @@ BUILDIN_FUNC(setunitdata)
|
||||
case UMOB_BODY2: clif_changelook(bl, LOOK_BODY2, (unsigned short)value); break;
|
||||
case UMOB_GROUP_ID: md->ud.group_id = value; unit_refresh(bl); break;
|
||||
case UMOB_IGNORE_CELL_STACK_LIMIT: md->ud.state.ignore_cell_stack_limit = value > 0; break;
|
||||
case UMOB_RES: md->base_status->res = (short)value; calc_status = true; break;
|
||||
case UMOB_MRES: md->base_status->mres = (short)value; calc_status = true; break;
|
||||
default:
|
||||
ShowError("buildin_setunitdata: Unknown data identifier %d for BL_MOB.\n", type);
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
@ -23863,6 +23913,28 @@ BUILDIN_FUNC(needed_status_point) {
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/// Returns the number of trait stat points needed to change the specified trait stat by val.
|
||||
/// If val is negative, returns the number of trait stat points that would be needed to
|
||||
/// raise the specified trait stat from (current value - val) to current value.
|
||||
/// *needed_trait_point(<type>,<val>{,<char id>});
|
||||
BUILDIN_FUNC(needed_trait_point) {
|
||||
struct map_session_data *sd;
|
||||
|
||||
if (!script_charid2sd(4, sd))
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
|
||||
int type = script_getnum( st, 2 );
|
||||
|
||||
if( type < SP_POW || type > SP_CRT ){
|
||||
ShowError( "buildin_needed_trait_point: Unknown trait type %d\n", type );
|
||||
return SCRIPT_CMD_FAILURE;
|
||||
}
|
||||
|
||||
script_pushint( st, pc_need_trait_point( sd, type, script_getnum( st, 3 ) ) );
|
||||
|
||||
return SCRIPT_CMD_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* jobcanentermap("<mapname>"{,<JobID>});
|
||||
* Check if (player with) JobID can enter the map.
|
||||
@ -25664,6 +25736,8 @@ struct script_function buildin_func[] = {
|
||||
BUILDIN_DEF(downrefitem,"i??"),
|
||||
BUILDIN_DEF(statusup,"i?"),
|
||||
BUILDIN_DEF(statusup2,"ii?"),
|
||||
BUILDIN_DEF(traitstatusup,"i?"),
|
||||
BUILDIN_DEF(traitstatusup2,"ii?"),
|
||||
BUILDIN_DEF(bonus,"i?"),
|
||||
BUILDIN_DEF2(bonus,"bonus2","ivi"),
|
||||
BUILDIN_DEF2(bonus,"bonus3","ivii"),
|
||||
@ -26146,6 +26220,7 @@ struct script_function buildin_func[] = {
|
||||
BUILDIN_DEF(getequiprandomoption, "iii?"),
|
||||
BUILDIN_DEF(setrandomoption,"iiiii?"),
|
||||
BUILDIN_DEF(needed_status_point,"ii?"),
|
||||
BUILDIN_DEF(needed_trait_point, "ii?"),
|
||||
BUILDIN_DEF(jobcanentermap,"s?"),
|
||||
BUILDIN_DEF(openstorage2,"ii?"),
|
||||
BUILDIN_DEF(unloadnpc, "s"),
|
||||
|
@ -356,6 +356,8 @@ enum monsterinfo_types {
|
||||
MOB_ATK2,
|
||||
MOB_DEF,
|
||||
MOB_MDEF,
|
||||
MOB_RES,
|
||||
MOB_MRES,
|
||||
MOB_STR,
|
||||
MOB_AGI,
|
||||
MOB_VIT,
|
||||
@ -481,6 +483,8 @@ enum unitdata_mobtypes {
|
||||
UMOB_BODY2,
|
||||
UMOB_GROUP_ID,
|
||||
UMOB_IGNORE_CELL_STACK_LIMIT,
|
||||
UMOB_RES,
|
||||
UMOB_MRES,
|
||||
};
|
||||
|
||||
enum unitdata_homuntypes {
|
||||
|
@ -256,6 +256,8 @@
|
||||
export_constant(JOB_HYPER_NOVICE);
|
||||
export_constant(JOB_SPIRIT_HANDLER);
|
||||
|
||||
export_constant(JOB_SKY_EMPEROR2);
|
||||
|
||||
/* EA jobs */
|
||||
export_constant2("EAJL_2_1",JOBL_2_1);
|
||||
export_constant2("EAJL_2_2",JOBL_2_2);
|
||||
@ -263,10 +265,12 @@
|
||||
export_constant2("EAJL_UPPER",JOBL_UPPER);
|
||||
export_constant2("EAJL_BABY",JOBL_BABY);
|
||||
export_constant2("EAJL_THIRD",JOBL_THIRD);
|
||||
export_constant2("EAJL_FOURTH",JOBL_FOURTH);
|
||||
|
||||
export_constant2("EAJ_BASEMASK",MAPID_BASEMASK);
|
||||
export_constant2("EAJ_UPPERMASK",MAPID_UPPERMASK);
|
||||
export_constant2("EAJ_THIRDMASK",MAPID_THIRDMASK);
|
||||
export_constant2("EAJ_FOURTHMASK",MAPID_FOURTHMASK);
|
||||
|
||||
export_constant2("EAJ_NOVICE",MAPID_NOVICE);
|
||||
export_constant2("EAJ_SWORDMAN",MAPID_SWORDMAN);
|
||||
@ -603,6 +607,7 @@
|
||||
|
||||
export_constant2("bMaxHP",SP_MAXHP);
|
||||
export_constant2("bMaxSP",SP_MAXSP);
|
||||
export_constant2("bMaxAP",SP_MAXAP);
|
||||
export_constant2("bStr",SP_STR);
|
||||
export_constant2("bAgi",SP_AGI);
|
||||
export_constant2("bVit",SP_VIT);
|
||||
@ -696,6 +701,12 @@
|
||||
export_constant2("bDef2Rate",SP_DEF2_RATE);
|
||||
export_constant2("bMdefRate",SP_MDEF_RATE);
|
||||
export_constant2("bMdef2Rate",SP_MDEF2_RATE);
|
||||
export_constant2("bPAtkRate", SP_PATK_RATE);
|
||||
export_constant2("bSMatkRate", SP_SMATK_RATE);
|
||||
export_constant2("bResRate", SP_RES_RATE);
|
||||
export_constant2("bMResRate", SP_MRES_RATE);
|
||||
export_constant2("bHPlusRate", SP_HPLUS_RATE);
|
||||
export_constant2("bCRateRate", SP_CRATE_RATE);
|
||||
export_constant2("bSplashRange",SP_SPLASH_RANGE);
|
||||
export_constant2("bSplashAddRange",SP_SPLASH_ADD_RANGE);
|
||||
export_constant2("bAutoSpell",SP_AUTOSPELL);
|
||||
@ -711,6 +722,7 @@
|
||||
export_constant2("bAddStealRate",SP_ADD_STEAL_RATE);
|
||||
export_constant2("bMagicDamageReturn",SP_MAGIC_DAMAGE_RETURN);
|
||||
export_constant2("bAllStats",SP_ALL_STATS);
|
||||
export_constant2("bAllTraitStats", SP_ALL_TRAIT_STATS);
|
||||
export_constant2("bAgiVit",SP_AGI_VIT);
|
||||
export_constant2("bAgiDexStr",SP_AGI_DEX_STR);
|
||||
export_constant2("bPerfectHide",SP_PERFECT_HIDE);
|
||||
@ -1698,6 +1710,119 @@
|
||||
export_constant(SC_WIDEWEB);
|
||||
export_constant(SC_BURNT);
|
||||
export_constant(SC_CHILL);
|
||||
export_constant(SC_HANDICAPSTATE_DEEPBLIND);
|
||||
export_constant(SC_HANDICAPSTATE_DEEPSILENCE);
|
||||
export_constant(SC_HANDICAPSTATE_LASSITUDE);
|
||||
export_constant(SC_HANDICAPSTATE_FROSTBITE);
|
||||
export_constant(SC_HANDICAPSTATE_SWOONING);
|
||||
export_constant(SC_HANDICAPSTATE_LIGHTNINGSTRIKE);
|
||||
export_constant(SC_HANDICAPSTATE_CRYSTALLIZATION);
|
||||
export_constant(SC_HANDICAPSTATE_CONFLAGRATION);
|
||||
export_constant(SC_HANDICAPSTATE_MISFORTUNE);
|
||||
export_constant(SC_HANDICAPSTATE_DEADLYPOISON);
|
||||
export_constant(SC_HANDICAPSTATE_DEPRESSION);
|
||||
export_constant(SC_HANDICAPSTATE_HOLYFLAME);
|
||||
export_constant(SC_SERVANTWEAPON);
|
||||
export_constant(SC_SERVANT_SIGN);
|
||||
export_constant(SC_CHARGINGPIERCE);
|
||||
export_constant(SC_CHARGINGPIERCE_COUNT);
|
||||
export_constant(SC_DRAGONIC_AURA);
|
||||
export_constant(SC_VIGOR);
|
||||
export_constant(SC_DEADLY_DEFEASANCE);
|
||||
export_constant(SC_CLIMAX_DES_HU);
|
||||
export_constant(SC_CLIMAX);
|
||||
export_constant(SC_CLIMAX_EARTH);
|
||||
export_constant(SC_CLIMAX_BLOOM);
|
||||
export_constant(SC_CLIMAX_CRYIMP);
|
||||
export_constant(SC_WINDSIGN);
|
||||
export_constant(SC_CRESCIVEBOLT);
|
||||
export_constant(SC_CALAMITYGALE);
|
||||
export_constant(SC_MEDIALE);
|
||||
export_constant(SC_A_VITA);
|
||||
export_constant(SC_A_TELUM);
|
||||
export_constant(SC_PRE_ACIES);
|
||||
export_constant(SC_COMPETENTIA);
|
||||
export_constant(SC_RELIGIO);
|
||||
export_constant(SC_BENEDICTUM);
|
||||
export_constant(SC_AXE_STOMP);
|
||||
export_constant(SC_A_MACHINE);
|
||||
export_constant(SC_D_MACHINE);
|
||||
export_constant(SC_ABR_BATTLE_WARIOR);
|
||||
export_constant(SC_ABR_DUAL_CANNON);
|
||||
export_constant(SC_ABR_MOTHER_NET);
|
||||
export_constant(SC_ABR_INFINITY);
|
||||
export_constant(SC_SHADOW_EXCEED);
|
||||
export_constant(SC_DANCING_KNIFE);
|
||||
export_constant(SC_POTENT_VENOM);
|
||||
export_constant(SC_SHADOW_SCAR);
|
||||
export_constant(SC_E_SLASH_COUNT);
|
||||
export_constant(SC_SHADOW_WEAPON);
|
||||
export_constant(SC_GUARD_STANCE);
|
||||
export_constant(SC_ATTACK_STANCE);
|
||||
export_constant(SC_GUARDIAN_S);
|
||||
export_constant(SC_REBOUND_S);
|
||||
export_constant(SC_HOLY_S);
|
||||
export_constant(SC_ULTIMATE_S);
|
||||
export_constant(SC_SPEAR_SCAR);
|
||||
export_constant(SC_SHIELD_POWER);
|
||||
export_constant(SC_SPELL_ENCHANTING);
|
||||
export_constant(SC_SUMMON_ELEMENTAL_ARDOR);
|
||||
export_constant(SC_SUMMON_ELEMENTAL_DILUVIO);
|
||||
export_constant(SC_SUMMON_ELEMENTAL_PROCELLA);
|
||||
export_constant(SC_SUMMON_ELEMENTAL_TERREMOTUS);
|
||||
export_constant(SC_SUMMON_ELEMENTAL_SERPENS);
|
||||
export_constant(SC_ELEMENTAL_VEIL);
|
||||
export_constant(SC_MYSTIC_SYMPHONY);
|
||||
export_constant(SC_KVASIR_SONATA);
|
||||
export_constant(SC_SOUNDBLEND);
|
||||
export_constant(SC_GEF_NOCTURN);
|
||||
export_constant(SC_AIN_RHAPSODY);
|
||||
export_constant(SC_MUSICAL_INTERLUDE);
|
||||
export_constant(SC_JAWAII_SERENADE);
|
||||
export_constant(SC_PRON_MARCH);
|
||||
export_constant(SC_ROSEBLOSSOM);
|
||||
export_constant(SC_POWERFUL_FAITH);
|
||||
export_constant(SC_SINCERE_FAITH);
|
||||
export_constant(SC_FIRM_FAITH);
|
||||
export_constant(SC_HOLY_OIL);
|
||||
export_constant(SC_FIRST_BRAND);
|
||||
export_constant(SC_SECOND_BRAND);
|
||||
export_constant(SC_SECOND_JUDGE);
|
||||
export_constant(SC_THIRD_EXOR_FLAME);
|
||||
export_constant(SC_FIRST_FAITH_POWER);
|
||||
export_constant(SC_MASSIVE_F_BLASTER);
|
||||
export_constant(SC_PROTECTSHADOWEQUIP);
|
||||
export_constant(SC_RESEARCHREPORT);
|
||||
export_constant(SC_BO_HELL_DUSTY);
|
||||
export_constant(SC_BIONIC_WOODENWARRIOR);
|
||||
export_constant(SC_BIONIC_WOODEN_FAIRY);
|
||||
export_constant(SC_BIONIC_CREEPER);
|
||||
export_constant(SC_BIONIC_HELLTREE);
|
||||
export_constant(SC_SHADOW_STRIP);
|
||||
export_constant(SC_ABYSS_DAGGER);
|
||||
export_constant(SC_ABYSSFORCEWEAPON);
|
||||
export_constant(SC_ABYSS_SLAYER);
|
||||
export_constant(SC_FLAMETECHNIC);
|
||||
export_constant(SC_FLAMETECHNIC_OPTION);
|
||||
export_constant(SC_FLAMEARMOR);
|
||||
export_constant(SC_FLAMEARMOR_OPTION);
|
||||
export_constant(SC_COLD_FORCE);
|
||||
export_constant(SC_COLD_FORCE_OPTION);
|
||||
export_constant(SC_CRYSTAL_ARMOR);
|
||||
export_constant(SC_CRYSTAL_ARMOR_OPTION);
|
||||
export_constant(SC_GRACE_BREEZE);
|
||||
export_constant(SC_GRACE_BREEZE_OPTION);
|
||||
export_constant(SC_EYES_OF_STORM);
|
||||
export_constant(SC_EYES_OF_STORM_OPTION);
|
||||
export_constant(SC_EARTH_CARE);
|
||||
export_constant(SC_EARTH_CARE_OPTION);
|
||||
export_constant(SC_STRONG_PROTECTION);
|
||||
export_constant(SC_STRONG_PROTECTION_OPTION);
|
||||
export_constant(SC_DEEP_POISONING);
|
||||
export_constant(SC_DEEP_POISONING_OPTION);
|
||||
export_constant(SC_POISON_SHIELD);
|
||||
export_constant(SC_POISON_SHIELD_OPTION);
|
||||
|
||||
#ifdef RENEWAL
|
||||
export_constant(SC_EXTREMITYFIST2);
|
||||
#endif
|
||||
@ -3967,6 +4092,8 @@
|
||||
export_constant(AI_FAW);
|
||||
export_constant(AI_GUILD);
|
||||
export_constant(AI_WAVEMODE);
|
||||
export_constant(AI_ABR);
|
||||
export_constant(AI_BIONIC);
|
||||
|
||||
/* battle flags */
|
||||
export_constant(BF_NONE);
|
||||
@ -4294,6 +4421,8 @@
|
||||
export_constant(MOB_ATK2);
|
||||
export_constant(MOB_DEF);
|
||||
export_constant(MOB_MDEF);
|
||||
export_constant(MOB_RES);
|
||||
export_constant(MOB_MRES);
|
||||
export_constant(MOB_STR);
|
||||
export_constant(MOB_AGI);
|
||||
export_constant(MOB_VIT);
|
||||
@ -4506,6 +4635,8 @@
|
||||
export_constant(UMOB_BODY2);
|
||||
export_constant(UMOB_GROUP_ID);
|
||||
export_constant(UMOB_IGNORE_CELL_STACK_LIMIT);
|
||||
export_constant(UMOB_RES);
|
||||
export_constant(UMOB_MRES);
|
||||
|
||||
/* unit control - homunculus */
|
||||
export_constant(UHOM_SIZE);
|
||||
@ -8113,6 +8244,8 @@
|
||||
export_constant(SKILL_REQ_SPIRITSPHERECOST);
|
||||
export_constant(SKILL_REQ_ITEMCOST);
|
||||
export_constant(SKILL_REQ_EQUIPMENT);
|
||||
export_constant(SKILL_REQ_APCOST);
|
||||
export_constant(SKILL_REQ_APRATECOST);
|
||||
|
||||
/* skill require state */
|
||||
export_constant(ST_NONE);
|
||||
@ -8302,6 +8435,32 @@
|
||||
export_constant(UNT_CATNIPPOWDER);
|
||||
export_constant(UNT_NYANGGRASS);
|
||||
export_constant(UNT_CREATINGSTAR);
|
||||
export_constant(UNT_DUMMY_0);
|
||||
export_constant(UNT_RAIN_OF_CRYSTAL);
|
||||
export_constant(UNT_MYSTERY_ILLUSION);
|
||||
export_constant(UNT_UNKNOWN_1);
|
||||
export_constant(UNT_STRANTUM_TREMOR);
|
||||
export_constant(UNT_VIOLENT_QUAKE);
|
||||
export_constant(UNT_ALL_BLOOM);
|
||||
export_constant(UNT_TORNADO_STORM);
|
||||
export_constant(UNT_FLORAL_FLARE_ROAD);
|
||||
export_constant(UNT_ASTRAL_STRIKE);
|
||||
export_constant(UNT_CROSS_RAIN);
|
||||
export_constant(UNT_PNEUMATICUS_PROCELLA);
|
||||
export_constant(UNT_ABYSS_SQUARE);
|
||||
export_constant(UNT_ACIDIFIED_ZONE_WATER);
|
||||
export_constant(UNT_ACIDIFIED_ZONE_GROUND);
|
||||
export_constant(UNT_ACIDIFIED_ZONE_WIND);
|
||||
export_constant(UNT_ACIDIFIED_ZONE_FIRE);
|
||||
export_constant(UNT_LIGHTNING_LAND);
|
||||
export_constant(UNT_VENOM_SWAMP);
|
||||
export_constant(UNT_CONFLAGRATION);
|
||||
|
||||
export_constant(UNT_DEEPBLINDTRAP);
|
||||
export_constant(UNT_SOLIDTRAP);
|
||||
export_constant(UNT_SWIFTTRAP);
|
||||
export_constant(UNT_FLAMETRAP);
|
||||
|
||||
export_constant(UNT_GD_LEADERSHIP);
|
||||
export_constant(UNT_GD_GLORYWOUNDS);
|
||||
export_constant(UNT_GD_SOULCOLD);
|
||||
@ -8323,10 +8482,10 @@
|
||||
export_constant(ITEMJ_THIRD);
|
||||
export_constant(ITEMJ_THIRD_UPPER);
|
||||
export_constant(ITEMJ_THIRD_BABY);
|
||||
export_constant(ITEMJ_FOURTH);
|
||||
export_constant(ITEMJ_ALL_UPPER);
|
||||
export_constant(ITEMJ_ALL_BABY);
|
||||
export_constant(ITEMJ_ALL_THIRD);
|
||||
export_constant(ITEMJ_FOURTH);
|
||||
|
||||
/* item drop effects */
|
||||
export_constant(DROPEFFECT_NONE);
|
||||
|
1589
src/map/skill.cpp
1589
src/map/skill.cpp
File diff suppressed because it is too large
Load Diff
@ -27,7 +27,7 @@ struct skill_unit;
|
||||
struct s_skill_unit_group;
|
||||
struct status_change_entry;
|
||||
|
||||
#define MAX_SKILL_PRODUCE_DB 282 /// Max Produce DB
|
||||
#define MAX_SKILL_PRODUCE_DB 300 /// Max Produce DB
|
||||
#define MAX_PRODUCE_RESOURCE 12 /// Max Produce requirements
|
||||
#define MAX_SKILL_LEVEL 13 /// Max Skill Level (for skill_db storage)
|
||||
#define MAX_MOBSKILL_LEVEL 100 /// Max monster skill level (on skill usage)
|
||||
@ -125,6 +125,8 @@ enum e_skill_require : uint16 {
|
||||
SKILL_REQ_SPIRITSPHERECOST = 0x400,
|
||||
SKILL_REQ_ITEMCOST = 0x800,
|
||||
SKILL_REQ_EQUIPMENT = 0x1000,
|
||||
SKILL_REQ_APCOST = 0x2000,
|
||||
SKILL_REQ_APRATECOST = 0x4000,
|
||||
};
|
||||
|
||||
/// Constants for skill cast near NPC.
|
||||
@ -197,8 +199,10 @@ struct s_skill_condition {
|
||||
int32 hp; ///< HP cost
|
||||
int32 mhp; ///< Max HP to trigger
|
||||
int32 sp; /// SP cost
|
||||
int32 ap; /// AP cost
|
||||
int32 hp_rate; /// HP cost (%)
|
||||
int32 sp_rate; /// SP cost (%)
|
||||
int32 ap_rate; /// AP cost (%)
|
||||
int32 zeny; /// Zeny cost
|
||||
int32 weapon; /// Weapon type. Combined bitmask of enum weapon_type (1<<weapon)
|
||||
int32 ammo; /// Ammo type. Combine bitmask of enum ammo_type (1<<ammo)
|
||||
@ -216,8 +220,10 @@ struct s_skill_require {
|
||||
int32 hp[MAX_SKILL_LEVEL]; ///< HP cost
|
||||
int32 mhp[MAX_SKILL_LEVEL]; ///< Max HP to trigger
|
||||
int32 sp[MAX_SKILL_LEVEL]; /// SP cost
|
||||
int32 ap[MAX_SKILL_LEVEL]; /// AP cost
|
||||
int32 hp_rate[MAX_SKILL_LEVEL]; /// HP cost (%)
|
||||
int32 sp_rate[MAX_SKILL_LEVEL]; /// SP cost (%)
|
||||
int32 ap_rate[MAX_SKILL_LEVEL]; /// AP cost (%)
|
||||
int32 zeny[MAX_SKILL_LEVEL]; /// Zeny cost
|
||||
int32 weapon; /// Weapon type. Combined bitmask of enum weapon_type (1<<weapon)
|
||||
int32 ammo; /// Ammo type. Combine bitmask of enum ammo_type (1<<ammo)
|
||||
@ -268,6 +274,8 @@ struct s_skill_db {
|
||||
// skill_nocast_db.txt
|
||||
uint32 nocast; ///< Skill cannot be casted at this zone
|
||||
|
||||
int32 giveap[MAX_SKILL_LEVEL]; ///< AP Given On Use
|
||||
|
||||
uint16 unit_id; ///< Unit ID. @see enum e_skill_unit_id
|
||||
uint16 unit_id2; ///< Alternate unit ID. @see enum e_skill_unit_id
|
||||
int32 unit_layout_type[MAX_SKILL_LEVEL]; ///< Layout type. -1 is special layout, others are square with lenght*width: (val*2+1)^2
|
||||
@ -301,7 +309,7 @@ struct s_skill_db {
|
||||
|
||||
class SkillDatabase : public TypesafeCachedYamlDatabase <uint16, s_skill_db> {
|
||||
public:
|
||||
SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 2, 1) {
|
||||
SkillDatabase() : TypesafeCachedYamlDatabase("SKILL_DB", 3, 1) {
|
||||
|
||||
}
|
||||
|
||||
@ -517,6 +525,7 @@ int skill_get_castcancel( uint16 skill_id );
|
||||
int skill_get_maxcount( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_blewcount( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_cooldown( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_giveap( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_unit_target( uint16 skill_id );
|
||||
#define skill_get_nk(skill_id, nk) skill_get_nk_(skill_id, { nk })
|
||||
bool skill_get_nk_(uint16 skill_id, std::vector<e_skill_nk> nk);
|
||||
@ -529,9 +538,11 @@ int skill_get_unit_range(uint16 skill_id, uint16 skill_lv);
|
||||
int skill_get_hp( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_mhp( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_sp( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_ap( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_status_count( uint16 skill_id );
|
||||
int skill_get_hp_rate( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_sp_rate( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_ap_rate( uint16 skill_id, uint16 skill_lv );
|
||||
int skill_get_zeny( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_weapontype( uint16 skill_id );
|
||||
int skill_get_ammotype( uint16 skill_id );
|
||||
@ -1983,6 +1994,213 @@ enum e_skill {
|
||||
NV_TRANSCENDENCE,
|
||||
WL_READING_SB_READING,
|
||||
|
||||
DK_SERVANTWEAPON = 5201,
|
||||
DK_SERVANTWEAPON_ATK,
|
||||
DK_SERVANT_W_SIGN,
|
||||
DK_SERVANT_W_PHANTOM,
|
||||
DK_SERVANT_W_DEMOL,
|
||||
DK_CHARGINGPIERCE,
|
||||
DK_TWOHANDDEF,
|
||||
DK_HACKANDSLASHER,
|
||||
DK_HACKANDSLASHER_ATK,
|
||||
DK_DRAGONIC_AURA,
|
||||
DK_MADNESS_CRUSHER,
|
||||
DK_VIGOR,
|
||||
DK_STORMSLASH,
|
||||
|
||||
AG_DEADLY_PROJECTION,
|
||||
AG_DESTRUCTIVE_HURRICANE,
|
||||
AG_RAIN_OF_CRYSTAL,
|
||||
AG_MYSTERY_ILLUSION,
|
||||
AG_VIOLENT_QUAKE,
|
||||
AG_VIOLENT_QUAKE_ATK,
|
||||
AG_SOUL_VC_STRIKE,
|
||||
AG_STRANTUM_TREMOR,
|
||||
AG_ALL_BLOOM,
|
||||
AG_ALL_BLOOM_ATK,
|
||||
AG_ALL_BLOOM_ATK2,
|
||||
AG_CRYSTAL_IMPACT,
|
||||
AG_CRYSTAL_IMPACT_ATK,
|
||||
AG_TORNADO_STORM,
|
||||
AG_TWOHANDSTAFF,
|
||||
AG_FLORAL_FLARE_ROAD,
|
||||
AG_ASTRAL_STRIKE,
|
||||
AG_ASTRAL_STRIKE_ATK,
|
||||
AG_CLIMAX,
|
||||
AG_ROCK_DOWN,
|
||||
AG_STORM_CANNON,
|
||||
AG_CRIMSON_ARROW,
|
||||
AG_CRIMSON_ARROW_ATK,
|
||||
AG_FROZEN_SLASH,
|
||||
|
||||
IQ_POWERFUL_FAITH,
|
||||
IQ_FIRM_FAITH,
|
||||
IQ_WILL_OF_FAITH,
|
||||
IQ_OLEUM_SANCTUM,
|
||||
IQ_SINCERE_FAITH,
|
||||
IQ_MASSIVE_F_BLASTER,
|
||||
IQ_EXPOSION_BLASTER,
|
||||
IQ_FIRST_BRAND,
|
||||
IQ_FIRST_FAITH_POWER,
|
||||
IQ_JUDGE,
|
||||
IQ_SECOND_FLAME,
|
||||
IQ_SECOND_FAITH,
|
||||
IQ_SECOND_JUDGEMENT,
|
||||
IQ_THIRD_PUNISH,
|
||||
IQ_THIRD_FLAME_BOMB,
|
||||
IQ_THIRD_CONSECRATION,
|
||||
IQ_THIRD_EXOR_FLAME,
|
||||
|
||||
IG_GUARD_STANCE,
|
||||
IG_GUARDIAN_SHIELD,
|
||||
IG_REBOUND_SHIELD,
|
||||
IG_SHIELD_MASTERY,
|
||||
IG_SPEAR_SWORD_M,
|
||||
IG_ATTACK_STANCE,
|
||||
IG_ULTIMATE_SACRIFICE,
|
||||
IG_HOLY_SHIELD,
|
||||
IG_GRAND_JUDGEMENT,
|
||||
IG_JUDGEMENT_CROSS,
|
||||
IG_SHIELD_SHOOTING,
|
||||
IG_OVERSLASH,
|
||||
IG_CROSS_RAIN,
|
||||
|
||||
CD_REPARATIO,
|
||||
CD_MEDIALE_VOTUM,
|
||||
CD_MACE_BOOK_M,
|
||||
CD_ARGUTUS_VITA,
|
||||
CD_ARGUTUS_TELUM,
|
||||
CD_ARBITRIUM,
|
||||
CD_ARBITRIUM_ATK,
|
||||
CD_PRESENS_ACIES,
|
||||
CD_FIDUS_ANIMUS,
|
||||
CD_EFFLIGO,
|
||||
CD_COMPETENTIA,
|
||||
CD_PNEUMATICUS_PROCELLA,
|
||||
CD_DILECTIO_HEAL,
|
||||
CD_RELIGIO,
|
||||
CD_BENEDICTUM,
|
||||
CD_PETITIO,
|
||||
CD_FRAMEN,
|
||||
|
||||
SHC_SHADOW_EXCEED,
|
||||
SHC_DANCING_KNIFE,
|
||||
SHC_SAVAGE_IMPACT,
|
||||
SHC_SHADOW_SENSE,
|
||||
SHC_ETERNAL_SLASH,
|
||||
SHC_POTENT_VENOM,
|
||||
SHC_SHADOW_STAB,
|
||||
SHC_IMPACT_CRATER,
|
||||
SHC_ENCHANTING_SHADOW,
|
||||
SHC_FATAL_SHADOW_CROW,
|
||||
|
||||
MT_AXE_STOMP,
|
||||
MT_RUSH_QUAKE,
|
||||
MT_M_MACHINE,
|
||||
MT_A_MACHINE,
|
||||
MT_D_MACHINE,
|
||||
MT_TWOAXEDEF,
|
||||
MT_ABR_M,
|
||||
MT_SUMMON_ABR_BATTLE_WARIOR,
|
||||
MT_SUMMON_ABR_DUAL_CANNON,
|
||||
MT_SUMMON_ABR_MOTHER_NET,
|
||||
MT_SUMMON_ABR_INFINITY,
|
||||
|
||||
AG_DESTRUCTIVE_HURRICANE_CLIMAX,
|
||||
BO_ACIDIFIED_ZONE_WATER_ATK,
|
||||
BO_ACIDIFIED_ZONE_GROUND_ATK,
|
||||
BO_ACIDIFIED_ZONE_WIND_ATK,
|
||||
BO_ACIDIFIED_ZONE_FIRE_ATK,
|
||||
|
||||
ABC_DAGGER_AND_BOW_M,
|
||||
ABC_MAGIC_SWORD_M,
|
||||
ABC_STRIP_SHADOW,
|
||||
ABC_ABYSS_DAGGER,
|
||||
ABC_UNLUCKY_RUSH,
|
||||
ABC_CHAIN_REACTION_SHOT,
|
||||
ABC_FROM_THE_ABYSS,
|
||||
ABC_ABYSS_SLAYER,
|
||||
ABC_ABYSS_STRIKE,
|
||||
ABC_DEFT_STAB,
|
||||
ABC_ABYSS_SQUARE,
|
||||
ABC_FRENZY_SHOT,
|
||||
|
||||
WH_ADVANCED_TRAP,
|
||||
WH_WIND_SIGN,
|
||||
WH_NATUREFRIENDLY,
|
||||
WH_HAWKRUSH,
|
||||
WH_HAWK_M,
|
||||
WH_CALAMITYGALE,
|
||||
WH_HAWKBOOMERANG,
|
||||
WH_GALESTORM,
|
||||
WH_DEEPBLINDTRAP,
|
||||
WH_SOLIDTRAP,
|
||||
WH_SWIFTTRAP,
|
||||
WH_CRESCIVE_BOLT,
|
||||
WH_FLAMETRAP,
|
||||
|
||||
BO_BIONIC_PHARMACY,
|
||||
BO_BIONICS_M,
|
||||
BO_THE_WHOLE_PROTECTION,
|
||||
BO_ADVANCE_PROTECTION,
|
||||
BO_ACIDIFIED_ZONE_WATER,
|
||||
BO_ACIDIFIED_ZONE_GROUND,
|
||||
BO_ACIDIFIED_ZONE_WIND,
|
||||
BO_ACIDIFIED_ZONE_FIRE,
|
||||
BO_WOODENWARRIOR,
|
||||
BO_WOODEN_FAIRY,
|
||||
BO_CREEPER,
|
||||
BO_RESEARCHREPORT,
|
||||
BO_HELLTREE,
|
||||
|
||||
TR_STAGE_MANNER,
|
||||
TR_RETROSPECTION,
|
||||
TR_MYSTIC_SYMPHONY,
|
||||
TR_KVASIR_SONATA,
|
||||
TR_ROSEBLOSSOM,
|
||||
TR_ROSEBLOSSOM_ATK,
|
||||
TR_RHYTHMSHOOTING,
|
||||
TR_METALIC_FURY,
|
||||
TR_SOUNDBLEND,
|
||||
TR_GEF_NOCTURN,
|
||||
TR_ROKI_CAPRICCIO,
|
||||
TR_AIN_RHAPSODY,
|
||||
TR_MUSICAL_INTERLUDE,
|
||||
TR_JAWAII_SERENADE,
|
||||
TR_NIPELHEIM_REQUIEM,
|
||||
TR_PRON_MARCH,
|
||||
|
||||
EM_MAGIC_BOOK_M,
|
||||
EM_SPELL_ENCHANTING,
|
||||
EM_ACTIVITY_BURN,
|
||||
EM_INCREASING_ACTIVITY,
|
||||
EM_DIAMOND_STORM,
|
||||
EM_LIGHTNING_LAND,
|
||||
EM_VENOM_SWAMP,
|
||||
EM_CONFLAGRATION,
|
||||
EM_TERRA_DRIVE,
|
||||
EM_ELEMENTAL_SPIRIT_M,
|
||||
EM_SUMMON_ELEMENTAL_ARDOR,
|
||||
EM_SUMMON_ELEMENTAL_DILUVIO,
|
||||
EM_SUMMON_ELEMENTAL_PROCELLA,
|
||||
EM_SUMMON_ELEMENTAL_TERREMOTUS,
|
||||
EM_SUMMON_ELEMENTAL_SERPENS,
|
||||
EM_ELEMENTAL_BUSTER,
|
||||
EM_ELEMENTAL_VEIL,
|
||||
|
||||
ABC_CHAIN_REACTION_SHOT_ATK,
|
||||
ABC_FROM_THE_ABYSS_ATK,
|
||||
BO_WOODEN_THROWROCK,
|
||||
BO_WOODEN_ATTACK,
|
||||
BO_HELL_HOWLING,
|
||||
BO_HELL_DUSTY,
|
||||
BO_FAIRY_DUSTY,
|
||||
EM_ELEMENTAL_BUSTER_FIRE,
|
||||
EM_ELEMENTAL_BUSTER_WATER,
|
||||
EM_ELEMENTAL_BUSTER_WIND,
|
||||
EM_ELEMENTAL_BUSTER_GROUND,
|
||||
EM_ELEMENTAL_BUSTER_POISON,
|
||||
|
||||
HLIF_HEAL = 8001,
|
||||
HLIF_AVOID,
|
||||
HLIF_BRAIN,
|
||||
@ -2111,6 +2329,27 @@ enum e_skill {
|
||||
EL_ROCK_CRUSHER,
|
||||
EL_ROCK_CRUSHER_ATK,
|
||||
EL_STONE_RAIN,
|
||||
EM_EL_FLAMETECHNIC,
|
||||
EM_EL_FLAMEARMOR,
|
||||
EM_EL_FLAMEROCK,
|
||||
EM_EL_COLD_FORCE,
|
||||
EM_EL_CRYSTAL_ARMOR,
|
||||
EM_EL_AGE_OF_ICE,
|
||||
EM_EL_GRACE_BREEZE,
|
||||
EM_EL_EYES_OF_STORM,
|
||||
EM_EL_STORM_WIND,
|
||||
EM_EL_EARTH_CARE,
|
||||
EM_EL_STRONG_PROTECTION,
|
||||
EM_EL_AVALANCHE,
|
||||
EM_EL_DEEP_POISONING,
|
||||
EM_EL_POISON_SHIELD,
|
||||
EM_EL_DEADLY_POISON,
|
||||
|
||||
ABR_BATTLE_BUSTER = 8601,
|
||||
ABR_DUAL_CANNON_FIRE,
|
||||
ABR_NET_REPAIR,
|
||||
ABR_NET_SUPPORT,
|
||||
ABR_INFINITY_BUSTER,
|
||||
};
|
||||
|
||||
/// The client view ids for land skills.
|
||||
@ -2256,7 +2495,34 @@ enum e_skill_unit_id : uint16 {
|
||||
UNT_CATNIPPOWDER,
|
||||
UNT_NYANGGRASS,
|
||||
|
||||
UNT_CREATINGSTAR,
|
||||
UNT_CREATINGSTAR,// Should be GROUNDDRIFT_NEUTRAL
|
||||
UNT_DUMMY_0,// CREATINGSTAR
|
||||
|
||||
UNT_RAIN_OF_CRYSTAL,
|
||||
UNT_MYSTERY_ILLUSION,
|
||||
UNT_UNKNOWN_1,// No idea. Makes a old style plant appear for a second.
|
||||
UNT_STRANTUM_TREMOR,
|
||||
UNT_VIOLENT_QUAKE,
|
||||
UNT_ALL_BLOOM,
|
||||
UNT_TORNADO_STORM,
|
||||
UNT_FLORAL_FLARE_ROAD,
|
||||
UNT_ASTRAL_STRIKE,
|
||||
UNT_CROSS_RAIN,
|
||||
UNT_PNEUMATICUS_PROCELLA,
|
||||
UNT_ABYSS_SQUARE,
|
||||
UNT_ACIDIFIED_ZONE_WATER,
|
||||
UNT_ACIDIFIED_ZONE_GROUND,
|
||||
UNT_ACIDIFIED_ZONE_WIND,
|
||||
UNT_ACIDIFIED_ZONE_FIRE,
|
||||
UNT_LIGHTNING_LAND,
|
||||
UNT_VENOM_SWAMP,
|
||||
UNT_CONFLAGRATION,
|
||||
|
||||
// Skill units outside the normal unit range.
|
||||
UNT_DEEPBLINDTRAP = 20852,
|
||||
UNT_SOLIDTRAP,
|
||||
UNT_SWIFTTRAP,
|
||||
UNT_FLAMETRAP,
|
||||
|
||||
/**
|
||||
* Guild Auras
|
||||
@ -2373,6 +2639,7 @@ int skill_get_time3(struct map_data *mapdata, uint16 skill_id, uint16 skill_lv);
|
||||
#define SKILL_CHK_HOMUN(skill_id) ( (skill_id) >= HM_SKILLBASE && (skill_id) < HM_SKILLBASE+MAX_HOMUNSKILL )
|
||||
#define SKILL_CHK_MERC(skill_id) ( (skill_id) >= MC_SKILLBASE && (skill_id) < MC_SKILLBASE+MAX_MERCSKILL )
|
||||
#define SKILL_CHK_ELEM(skill_id) ( (skill_id) >= EL_SKILLBASE && (skill_id) < EL_SKILLBASE+MAX_ELEMENTALSKILL )
|
||||
#define SKILL_CHK_ABR(skill_id) ( (skill_id) >= ABR_SKILLBASE && (skill_id) < ABR_SKILLBASE+MAX_ABRSKILL )
|
||||
#define SKILL_CHK_GUILD(skill_id) ( (skill_id) >= GD_SKILLBASE && (skill_id) < GD_SKILLBASE+MAX_GUILDSKILL )
|
||||
|
||||
#endif /* SKILL_HPP */
|
||||
|
1636
src/map/status.cpp
1636
src/map/status.cpp
File diff suppressed because it is too large
Load Diff
@ -1027,6 +1027,146 @@ enum sc_type : int16 {
|
||||
SC_BURNT,
|
||||
SC_CHILL,
|
||||
|
||||
// 4th Job Common Status
|
||||
SC_HANDICAPSTATE_DEEPBLIND,
|
||||
SC_HANDICAPSTATE_DEEPSILENCE,
|
||||
SC_HANDICAPSTATE_LASSITUDE,
|
||||
SC_HANDICAPSTATE_FROSTBITE,
|
||||
SC_HANDICAPSTATE_SWOONING,
|
||||
SC_HANDICAPSTATE_LIGHTNINGSTRIKE,
|
||||
SC_HANDICAPSTATE_CRYSTALLIZATION,
|
||||
SC_HANDICAPSTATE_CONFLAGRATION,
|
||||
SC_HANDICAPSTATE_MISFORTUNE,
|
||||
SC_HANDICAPSTATE_DEADLYPOISON,
|
||||
SC_HANDICAPSTATE_DEPRESSION,
|
||||
SC_HANDICAPSTATE_HOLYFLAME,
|
||||
|
||||
// Dragon Knight
|
||||
SC_SERVANTWEAPON,
|
||||
SC_SERVANT_SIGN,
|
||||
SC_CHARGINGPIERCE,
|
||||
SC_CHARGINGPIERCE_COUNT,
|
||||
SC_DRAGONIC_AURA,
|
||||
SC_VIGOR,
|
||||
|
||||
// Arch Mage
|
||||
SC_DEADLY_DEFEASANCE,
|
||||
SC_CLIMAX_DES_HU,
|
||||
SC_CLIMAX,
|
||||
SC_CLIMAX_EARTH,
|
||||
SC_CLIMAX_BLOOM,
|
||||
SC_CLIMAX_CRYIMP,
|
||||
|
||||
// Windhawk
|
||||
SC_WINDSIGN,
|
||||
SC_CRESCIVEBOLT,
|
||||
SC_CALAMITYGALE,
|
||||
|
||||
// Cardinal
|
||||
SC_MEDIALE,
|
||||
SC_A_VITA,
|
||||
SC_A_TELUM,
|
||||
SC_PRE_ACIES,
|
||||
SC_COMPETENTIA,
|
||||
SC_RELIGIO,
|
||||
SC_BENEDICTUM,
|
||||
|
||||
// Meister
|
||||
SC_AXE_STOMP,
|
||||
SC_A_MACHINE,
|
||||
SC_D_MACHINE,
|
||||
SC_ABR_BATTLE_WARIOR,
|
||||
SC_ABR_DUAL_CANNON,
|
||||
SC_ABR_MOTHER_NET,
|
||||
SC_ABR_INFINITY,
|
||||
|
||||
// Shadow Cross
|
||||
SC_SHADOW_EXCEED,
|
||||
SC_DANCING_KNIFE,
|
||||
SC_POTENT_VENOM,
|
||||
SC_SHADOW_SCAR,
|
||||
SC_E_SLASH_COUNT,
|
||||
SC_SHADOW_WEAPON,
|
||||
|
||||
// Imperial Guard
|
||||
SC_GUARD_STANCE,
|
||||
SC_ATTACK_STANCE,
|
||||
SC_GUARDIAN_S,
|
||||
SC_REBOUND_S,
|
||||
SC_HOLY_S,
|
||||
SC_ULTIMATE_S,
|
||||
SC_SPEAR_SCAR,
|
||||
SC_SHIELD_POWER,
|
||||
|
||||
// Elemental Master
|
||||
SC_SPELL_ENCHANTING,
|
||||
SC_SUMMON_ELEMENTAL_ARDOR,
|
||||
SC_SUMMON_ELEMENTAL_DILUVIO,
|
||||
SC_SUMMON_ELEMENTAL_PROCELLA,
|
||||
SC_SUMMON_ELEMENTAL_TERREMOTUS,
|
||||
SC_SUMMON_ELEMENTAL_SERPENS,
|
||||
SC_ELEMENTAL_VEIL,
|
||||
|
||||
// Troubadour/Trouvere
|
||||
SC_MYSTIC_SYMPHONY,
|
||||
SC_KVASIR_SONATA,
|
||||
SC_SOUNDBLEND,
|
||||
SC_GEF_NOCTURN,
|
||||
SC_AIN_RHAPSODY,
|
||||
SC_MUSICAL_INTERLUDE,
|
||||
SC_JAWAII_SERENADE,
|
||||
SC_PRON_MARCH,
|
||||
SC_ROSEBLOSSOM,
|
||||
|
||||
// Inquisitor
|
||||
SC_POWERFUL_FAITH,
|
||||
SC_SINCERE_FAITH,
|
||||
SC_FIRM_FAITH,
|
||||
SC_HOLY_OIL,
|
||||
SC_FIRST_BRAND,
|
||||
SC_SECOND_BRAND,
|
||||
SC_SECOND_JUDGE,
|
||||
SC_THIRD_EXOR_FLAME,
|
||||
SC_FIRST_FAITH_POWER,
|
||||
SC_MASSIVE_F_BLASTER,
|
||||
|
||||
// Biolo
|
||||
SC_PROTECTSHADOWEQUIP,
|
||||
SC_RESEARCHREPORT,
|
||||
SC_BO_HELL_DUSTY,
|
||||
SC_BIONIC_WOODENWARRIOR,
|
||||
SC_BIONIC_WOODEN_FAIRY,
|
||||
SC_BIONIC_CREEPER,
|
||||
SC_BIONIC_HELLTREE,
|
||||
|
||||
// Abyss Chaser
|
||||
SC_SHADOW_STRIP,
|
||||
SC_ABYSS_DAGGER,
|
||||
SC_ABYSSFORCEWEAPON,
|
||||
SC_ABYSS_SLAYER,
|
||||
|
||||
// Super Elementals
|
||||
SC_FLAMETECHNIC,
|
||||
SC_FLAMETECHNIC_OPTION,
|
||||
SC_FLAMEARMOR,
|
||||
SC_FLAMEARMOR_OPTION,
|
||||
SC_COLD_FORCE,
|
||||
SC_COLD_FORCE_OPTION,
|
||||
SC_CRYSTAL_ARMOR,
|
||||
SC_CRYSTAL_ARMOR_OPTION,
|
||||
SC_GRACE_BREEZE,
|
||||
SC_GRACE_BREEZE_OPTION,
|
||||
SC_EYES_OF_STORM,
|
||||
SC_EYES_OF_STORM_OPTION,
|
||||
SC_EARTH_CARE,
|
||||
SC_EARTH_CARE_OPTION,
|
||||
SC_STRONG_PROTECTION,
|
||||
SC_STRONG_PROTECTION_OPTION,
|
||||
SC_DEEP_POISONING,
|
||||
SC_DEEP_POISONING_OPTION,
|
||||
SC_POISON_SHIELD,
|
||||
SC_POISON_SHIELD_OPTION,
|
||||
|
||||
#ifdef RENEWAL
|
||||
SC_EXTREMITYFIST2, //! NOTE: This SC should be right before SC_MAX, so it doesn't disturb if RENEWAL is disabled
|
||||
#endif
|
||||
@ -2532,8 +2672,8 @@ enum scs_flag {
|
||||
};
|
||||
|
||||
///Define flags for the status_calc_bl function. [Skotlex]
|
||||
enum scb_flag
|
||||
{
|
||||
enum scb_flag : uint64
|
||||
{ // Main Flags
|
||||
SCB_NONE = 0x00000000,
|
||||
SCB_BASE = 0x00000001,
|
||||
SCB_MAXHP = 0x00000002,
|
||||
@ -2565,10 +2705,29 @@ enum scb_flag
|
||||
SCB_RACE = 0x08000000,
|
||||
SCB_RANGE = 0x10000000,
|
||||
SCB_REGEN = 0x20000000,
|
||||
SCB_DYE = 0x40000000, // force cloth-dye change to 0 to avoid client crashes.
|
||||
|
||||
SCB_BATTLE = 0x3FFFFFFE,
|
||||
SCB_ALL = 0x3FFFFFFF
|
||||
// 4th Job T.Stat/T.Sub-Stat Flags
|
||||
SCB_MAXAP = 0x40000000,
|
||||
SCB_POW = 0x80000000,
|
||||
SCB_STA = 0x000100000000,
|
||||
SCB_WIS = 0x000200000000,
|
||||
SCB_SPL = 0x000400000000,
|
||||
SCB_CON = 0x000800000000,
|
||||
SCB_CRT = 0x001000000000,
|
||||
SCB_PATK = 0x002000000000,
|
||||
SCB_SMATK = 0x004000000000,
|
||||
SCB_RES = 0x008000000000,
|
||||
SCB_MRES = 0x010000000000,
|
||||
SCB_HPLUS = 0x020000000000,
|
||||
SCB_CRATE = 0x040000000000,
|
||||
|
||||
// Extra Flags
|
||||
// These are flags not sent through battle/all flags. Always keep these last.
|
||||
SCB_DYE = 0x080000000000, // force cloth-dye change to 0 to avoid client crashes.
|
||||
|
||||
// Special flags for updating all stat/sub-stat stuff on request.
|
||||
SCB_BATTLE = 0x07FFFFFFFFFE,// All except BASE and extra flags.
|
||||
SCB_ALL = 0x07FFFFFFFFFF// All except extra flags.
|
||||
};
|
||||
|
||||
enum e_status_calc_opt {
|
||||
@ -2664,7 +2823,7 @@ struct weapon_atk {
|
||||
|
||||
extern sc_type SkillStatusChangeTable[MAX_SKILL]; /// skill -> status
|
||||
extern int StatusIconChangeTable[SC_MAX]; /// status -> "icon" (icon is a bit of a misnomer, since there exist values with no icon associated)
|
||||
extern unsigned int StatusChangeFlagTable[SC_MAX]; /// status -> flags
|
||||
extern uint64 StatusChangeFlagTable[SC_MAX]; /// status -> flags
|
||||
extern int StatusSkillChangeTable[SC_MAX]; /// status -> skill
|
||||
extern int StatusRelevantBLTypes[EFST_MAX]; /// "icon" -> enum bl_type (for clif->status_change to identify for which bl types to send packets)
|
||||
extern unsigned int StatusChangeStateTable[SC_MAX]; /// status -> flags
|
||||
@ -2673,10 +2832,11 @@ extern unsigned int StatusDisplayType[SC_MAX];
|
||||
///For holding basic status (which can be modified by status changes)
|
||||
struct status_data {
|
||||
unsigned int
|
||||
hp, sp, // see status_cpy before adding members before hp and sp
|
||||
max_hp, max_sp;
|
||||
hp, sp, ap, // see status_cpy before adding members before hp and sp
|
||||
max_hp, max_sp, max_ap;
|
||||
short
|
||||
str, agi, vit, int_, dex, luk,
|
||||
pow, sta, wis, spl, con, crt,
|
||||
eatk;
|
||||
unsigned short
|
||||
batk,
|
||||
@ -2694,7 +2854,10 @@ struct status_data {
|
||||
#ifdef RENEWAL_ASPD
|
||||
aspd_rate2,
|
||||
#endif
|
||||
aspd_rate;
|
||||
aspd_rate,
|
||||
patk, smatk,
|
||||
res, mres,
|
||||
hplus, crate;
|
||||
/**
|
||||
* defType is RENEWAL dependent and defined in src/config/const.hpp
|
||||
**/
|
||||
@ -2707,8 +2870,6 @@ struct status_data {
|
||||
class_; /// see enum e_classAE
|
||||
|
||||
struct weapon_atk rhw, lhw; //Right Hand/Left Hand Weapon.
|
||||
|
||||
uint16 pow, sta, wis, spl, con, crt;
|
||||
};
|
||||
|
||||
///Additional regen data that only players have.
|
||||
@ -2807,32 +2968,59 @@ static const std::vector<sc_type> mado_statuses = {
|
||||
// for looking up associated data
|
||||
sc_type status_skill2sc(int skill);
|
||||
int status_sc2skill(sc_type sc);
|
||||
unsigned int status_sc2scb_flag(sc_type sc);
|
||||
uint64 status_sc2scb_flag(sc_type sc);
|
||||
int status_type2relevant_bl_types(int type);
|
||||
|
||||
int status_damage(struct block_list *src,struct block_list *target,int64 dhp,int64 dsp, t_tick walkdelay, int flag, uint16 skill_id);
|
||||
int status_damage( struct block_list *src, struct block_list *target, int64 dhp, int64 dsp, int64 dap, t_tick walkdelay, int flag, uint16 skill_id );
|
||||
static int status_damage( struct block_list *src, struct block_list *target, int64 dhp, int64 dsp, t_tick walkdelay, int flag, uint16 skill_id ){
|
||||
return status_damage( src, target, dhp, dsp, 0, walkdelay, flag, skill_id );
|
||||
}
|
||||
//Define for standard HP damage attacks.
|
||||
#define status_fix_damage(src, target, hp, walkdelay, skill) status_damage(src, target, hp, 0, walkdelay, 0, skill)
|
||||
static int status_fix_damage( struct block_list *src, struct block_list *target, int64 hp, t_tick walkdelay, uint16 skill_id ){
|
||||
return status_damage( src, target, hp, 0, walkdelay, 0, skill_id );
|
||||
}
|
||||
//Define for standard SP damage attacks.
|
||||
#define status_fix_spdamage(src, target, sp, walkdelay, skill) status_damage(src, target, 0, sp, walkdelay, 0, skill)
|
||||
//Define for standard HP/SP damage triggers.
|
||||
#define status_zap(bl, hp, sp) status_damage(NULL, bl, hp, sp, 0, 1, 0)
|
||||
//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP to use skills)
|
||||
static int status_fix_spdamage( struct block_list *src, struct block_list *target, int64 sp, t_tick walkdelay, uint16 skill_id ){
|
||||
return status_damage( src, target, 0, sp, walkdelay, 0, skill_id );
|
||||
}
|
||||
//Define for standard AP damage attacks.
|
||||
static int status_fix_apdamage( struct block_list *src, struct block_list *target, int64 ap, t_tick walkdelay, uint16 skill_id ){
|
||||
return status_damage( src, target, 0, 0, ap, walkdelay, 0, skill_id );
|
||||
}
|
||||
//Define for standard HP/SP/AP damage triggers.
|
||||
static int status_zap( struct block_list* bl, int64 hp, int64 sp, int64 ap = 0 ){
|
||||
return status_damage( nullptr, bl, hp, sp, ap, 0, 1, 0 );
|
||||
}
|
||||
//Define for standard HP/SP skill-related cost triggers (mobs require no HP/SP/AP to use skills)
|
||||
int64 status_charge(struct block_list* bl, int64 hp, int64 sp);
|
||||
int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, uint8 flag);
|
||||
int status_percent_change(struct block_list *src, struct block_list *target, int8 hp_rate, int8 sp_rate, int8 ap_rate, uint8 flag);
|
||||
//Easier handling of status_percent_change
|
||||
#define status_percent_heal(bl, hp_rate, sp_rate) status_percent_change(NULL, bl, -(hp_rate), -(sp_rate), 0)
|
||||
/// Deals % damage from 'src' to 'target'. If rate is > 0 is % of current HP/SP, < 0 % of MaxHP/MaxSP
|
||||
#define status_percent_damage(src, target, hp_rate, sp_rate, kill) status_percent_change(src, target, hp_rate, sp_rate, (kill)?1:2)
|
||||
static int status_percent_heal( struct block_list* bl, int8 hp_rate, int8 sp_rate, int8 ap_rate = 0 ){
|
||||
return status_percent_change( nullptr, bl, -(hp_rate), -(sp_rate), -(ap_rate), 0 );
|
||||
}
|
||||
/// Deals % damage from 'src' to 'target'. If rate is > 0 is % of current HP/SP/AP, < 0 % of MaxHP/MaxSP/MaxAP
|
||||
static int status_percent_damage( struct block_list* src, struct block_list* target, int8 hp_rate, int8 sp_rate, bool kill ){
|
||||
return status_percent_change( src, target, hp_rate, sp_rate, 0, kill ? 1 : 2 );
|
||||
}
|
||||
static int status_percent_damage( struct block_list* src, struct block_list* target, int8 hp_rate, int8 sp_rate, int8 ap_rate, bool kill ){
|
||||
return status_percent_change( src, target, hp_rate, sp_rate, ap_rate, kill ? 1 : 2 );
|
||||
}
|
||||
//Instant kill with no drops/exp/etc
|
||||
#define status_kill(bl) status_percent_damage(NULL, bl, 100, 0, true)
|
||||
//Used to set the hp/sp of an object to an absolute value (can't kill)
|
||||
static int status_kill( struct block_list* bl ){
|
||||
return status_percent_damage( nullptr, bl, 100, 0, 0, true );
|
||||
}
|
||||
//Used to set the hp/sp/ap of an object to an absolute value (can't kill)
|
||||
int status_set_hp(struct block_list *bl, unsigned int hp, int flag);
|
||||
int status_set_maxhp(struct block_list *bl, unsigned int hp, int flag);
|
||||
int status_set_sp(struct block_list *bl, unsigned int sp, int flag);
|
||||
int status_set_maxsp(struct block_list *bl, unsigned int hp, int flag);
|
||||
int status_heal(struct block_list *bl,int64 hhp,int64 hsp, int flag);
|
||||
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp);
|
||||
int status_set_ap(struct block_list *bl, unsigned int ap, int flag);
|
||||
int status_set_maxap(struct block_list *bl, unsigned int ap, int flag);
|
||||
int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int64 hap, int flag );
|
||||
static int status_heal( struct block_list *bl,int64 hhp,int64 hsp, int flag ){
|
||||
return status_heal( bl, hhp, hsp, 0, flag );
|
||||
}
|
||||
int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per_sp, unsigned char per_ap = 0);
|
||||
|
||||
struct regen_data *status_get_regen_data(struct block_list *bl);
|
||||
struct status_data *status_get_status_data(struct block_list *bl);
|
||||
@ -2845,12 +3033,20 @@ int status_get_lv(struct block_list *bl);
|
||||
#define status_get_max_hp(bl) status_get_status_data(bl)->max_hp
|
||||
#define status_get_sp(bl) status_get_status_data(bl)->sp
|
||||
#define status_get_max_sp(bl) status_get_status_data(bl)->max_sp
|
||||
#define status_get_ap(bl) status_get_status_data(bl)->ap
|
||||
#define status_get_max_ap(bl) status_get_status_data(bl)->max_ap
|
||||
#define status_get_str(bl) status_get_status_data(bl)->str
|
||||
#define status_get_agi(bl) status_get_status_data(bl)->agi
|
||||
#define status_get_vit(bl) status_get_status_data(bl)->vit
|
||||
#define status_get_int(bl) status_get_status_data(bl)->int_
|
||||
#define status_get_dex(bl) status_get_status_data(bl)->dex
|
||||
#define status_get_luk(bl) status_get_status_data(bl)->luk
|
||||
#define status_get_pow(bl) status_get_status_data(bl)->pow
|
||||
#define status_get_sta(bl) status_get_status_data(bl)->sta
|
||||
#define status_get_wis(bl) status_get_status_data(bl)->wis
|
||||
#define status_get_spl(bl) status_get_status_data(bl)->spl
|
||||
#define status_get_con(bl) status_get_status_data(bl)->con
|
||||
#define status_get_crt(bl) status_get_status_data(bl)->crt
|
||||
#define status_get_hit(bl) status_get_status_data(bl)->hit
|
||||
#define status_get_flee(bl) status_get_status_data(bl)->flee
|
||||
defType status_get_def(struct block_list *bl);
|
||||
@ -2870,6 +3066,12 @@ unsigned short status_get_speed(struct block_list *bl);
|
||||
#define status_get_adelay(bl) status_get_status_data(bl)->adelay
|
||||
#define status_get_amotion(bl) status_get_status_data(bl)->amotion
|
||||
#define status_get_dmotion(bl) status_get_status_data(bl)->dmotion
|
||||
#define status_get_patk(bl) status_get_status_data(bl)->patk
|
||||
#define status_get_smatk(bl) status_get_status_data(bl)->smatk
|
||||
#define status_get_res(bl) status_get_status_data(bl)->res
|
||||
#define status_get_mres(bl) status_get_status_data(bl)->mres
|
||||
#define status_get_hplus(bl) status_get_status_data(bl)->hplus
|
||||
#define status_get_crate(bl) status_get_status_data(bl)->crate
|
||||
#define status_get_element(bl) status_get_status_data(bl)->def_ele
|
||||
#define status_get_element_level(bl) status_get_status_data(bl)->ele_lv
|
||||
unsigned char status_calc_attack_element(struct block_list *bl, struct status_change *sc, int element);
|
||||
|
@ -1815,6 +1815,34 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DK_SERVANT_W_SIGN: {
|
||||
uint8 i = 0, count = min(skill_lv, MAX_SERVANT_SIGN);
|
||||
|
||||
ARR_FIND( 0, count, i, sd->servant_sign[i] == target_id );
|
||||
|
||||
// Already targetted
|
||||
if( i < count ){
|
||||
break;
|
||||
}
|
||||
|
||||
ARR_FIND( 0, count, i, sd->servant_sign[i] == 0 );
|
||||
|
||||
// No free slots
|
||||
if( i == count ){
|
||||
clif_skill_fail( sd, skill_id, USESKILL_FAIL_LEVEL, 0 );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TR_RETROSPECTION:
|
||||
// Prevent using the song skill if you no longer have the skill in your tree.
|
||||
if (!sd->skill_id_song || pc_checkskill(sd, sd->skill_id_song) <= 0) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sd->skill_id_old = skill_id;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!skill_check_condition_castbegin(sd, skill_id, skill_lv))
|
||||
@ -1935,6 +1963,16 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
if (sc && sc->data[SC_WUGDASH])
|
||||
casttime = -1;
|
||||
break;
|
||||
case DK_SERVANT_W_PHANTOM: { // Stops servants from being consumed on unmarked targets.
|
||||
status_change *tsc = status_get_sc(target);
|
||||
|
||||
// Only allow to attack if the enemy has a sign mark given by the caster.
|
||||
if( tsc == nullptr || tsc->data[SC_SERVANT_SIGN] == nullptr || tsc->data[SC_SERVANT_SIGN]->val1 != src->id ){
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EL_WIND_SLASH:
|
||||
case EL_HURRICANE:
|
||||
case EL_TYPOON_MIS:
|
||||
@ -2023,12 +2061,12 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
|
||||
if( sc ) {
|
||||
// These 3 status do not stack, so it's efficient to use if-else
|
||||
if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING ) {
|
||||
if( sc->data[SC_CLOAKING] && !(sc->data[SC_CLOAKING]->val4&4) && skill_id != AS_CLOAKING && skill_id != SHC_SHADOW_STAB) {
|
||||
status_change_end(src, SC_CLOAKING, INVALID_TIMER);
|
||||
|
||||
if (!src->prev)
|
||||
return 0; // Warped away!
|
||||
} else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED ) {
|
||||
} else if( sc->data[SC_CLOAKINGEXCEED] && !(sc->data[SC_CLOAKINGEXCEED]->val4&4) && skill_id != GC_CLOAKINGEXCEED && skill_id != SHC_SHADOW_STAB) {
|
||||
status_change_end(src,SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
|
||||
if (!src->prev)
|
||||
@ -3041,6 +3079,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
status_change_end(bl, SC_TINDER_BREAKER, INVALID_TIMER);
|
||||
status_change_end(bl, SC_TINDER_BREAKER2, INVALID_TIMER);
|
||||
status_change_end(bl, SC_FLASHKICK, INVALID_TIMER);
|
||||
status_change_end(bl, SC_SERVANT_SIGN, INVALID_TIMER);
|
||||
status_change_end(bl, SC_HIDING, INVALID_TIMER);
|
||||
// Ensure the bl is a PC; if so, we'll handle the removal of cloaking and cloaking exceed later
|
||||
if ( bl->type != BL_PC ) {
|
||||
|
@ -275,14 +275,14 @@ int do_init( int argc, char** argv ){
|
||||
}
|
||||
|
||||
skill_txt_data( path_db_mode, path_db );
|
||||
if (!process("SKILL_DB", 2, { path_db_mode }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
|
||||
if (!process("SKILL_DB", 3, { path_db_mode }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
|
||||
return sv_readdb(path.c_str(), name_ext.c_str(), ',', 18, 18, -1, &skill_parse_row_skilldb, false);
|
||||
})){
|
||||
return 0;
|
||||
}
|
||||
|
||||
skill_txt_data( path_db_import, path_db_import );
|
||||
if (!process("SKILL_DB", 2, { path_db_import }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
|
||||
if (!process("SKILL_DB", 3, { path_db_import }, "skill_db", [](const std::string& path, const std::string& name_ext) -> bool {
|
||||
return sv_readdb(path.c_str(), name_ext.c_str(), ',', 18, 18, -1, &skill_parse_row_skilldb, false);
|
||||
})){
|
||||
return 0;
|
||||
@ -345,14 +345,14 @@ int do_init( int argc, char** argv ){
|
||||
#endif
|
||||
|
||||
mob_txt_data(path_db_mode, path_db);
|
||||
if (!process("MOB_DB", 2, { path_db_mode }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
|
||||
if (!process("MOB_DB", 3, { path_db_mode }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
|
||||
return sv_readdb(path.c_str(), name_ext.c_str(), ',', 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, -1, &mob_readdb_sub, false);
|
||||
})) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
mob_txt_data(path_db_import, path_db_import);
|
||||
if (!process("MOB_DB", 2, { path_db_import }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
|
||||
if (!process("MOB_DB", 3, { path_db_import }, "mob_db", [](const std::string &path, const std::string &name_ext) -> bool {
|
||||
return sv_readdb(path.c_str(), name_ext.c_str(), ',', 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, 31 + 2 * MAX_MVP_DROP + 2 * MAX_MOB_DROP, -1, &mob_readdb_sub, false);
|
||||
})) {
|
||||
return 0;
|
||||
|
@ -756,6 +756,12 @@ static bool mob_db_yaml2sql(const std::string &file, const std::string &table) {
|
||||
column.append("`defense`,");
|
||||
if (appendEntry(input["MagicDefense"], value))
|
||||
column.append("`magic_defense`,");
|
||||
#ifdef RENEWAL
|
||||
if (appendEntry(input["Resistance"], value))
|
||||
column.append("`resistance`,");
|
||||
if (appendEntry(input["MagicResistance"], value))
|
||||
column.append("`magic_resistance`,");
|
||||
#endif
|
||||
if (appendEntry(input["Str"], value))
|
||||
column.append("`str`,");
|
||||
if (appendEntry(input["Agi"], value))
|
||||
|
Loading…
x
Reference in New Issue
Block a user