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:
Lemongrass3110 2021-12-30 20:25:19 +01:00 committed by GitHub
parent 5105a03aec
commit 7556453dfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
78 changed files with 19190 additions and 559 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,,,,,,,

View File

@ -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
//==============================================

File diff suppressed because it is too large Load Diff

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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.
---------------------------------------

View File

@ -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.
---------------------------------------

View File

@ -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
-----

View File

@ -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.
---------------------------------------

View File

@ -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)

View File

@ -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.

View File

@ -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'.
###########################################################################

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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;
}

View File

@ -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',

View File

@ -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,

View File

@ -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,

View 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
;

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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,
};

View File

@ -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

View File

@ -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

View File

@ -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"
};

View File

@ -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

View File

@ -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 );

View File

@ -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);

View File

@ -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 */

View File

@ -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;
}

View File

@ -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 {

View File

@ -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,

View File

@ -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);

View File

@ -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 {

View File

@ -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;

View File

@ -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) {
}

View File

@ -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)

View File

@ -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:

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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"),

View File

@ -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 {

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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 */

File diff suppressed because it is too large Load Diff

View File

@ -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);

View File

@ -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 ) {

View File

@ -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;

View File

@ -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))