Adds EndOnEnd node to status database (#7313)

* Any status defined under EndOnEnd will be removed when the status becomes inactive.
* Renames End to EndOnStart.
* Removes some hard coded statuses.
* Includes YamlUpgrade Tool update to rename End -> EndOnStart.
Thanks to @Lemongrass3110!
This commit is contained in:
Aleos 2022-10-20 10:04:00 -04:00 committed by GitHub
parent bc2afbdfc2
commit 8073d4e084
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 420 additions and 333 deletions

View File

@ -35,10 +35,11 @@
# MinRate Minimum rate after status change reduction (10000 = 100%). (Default: 0)
# MinDuration Minimum duration in milliseconds after status change reduction. (Default: 1)
# Fail: List of Status Changes that causes the status to fail to activate. (Optional)
# End: List of Status Changes that will end when the status activates. (Optional)
# EndOnStart: List of Status Changes that will end when the status activates. (Optional)
# EndReturn: List of Status Changes that will end when the status activates and won't give its effect. (Optional)
# EndOnEnd: List of Status Changes that will end when the status becomes inactive. (Optional)
###########################################################################
Header:
Type: STATUS_DB
Version: 2
Version: 3

View File

@ -35,13 +35,14 @@
# MinRate Minimum rate after status change reduction (10000 = 100%). (Default: 0)
# MinDuration Minimum duration in milliseconds after status change reduction. (Default: 1)
# Fail: List of Status Changes that causes the status to fail to activate. (Optional)
# End: List of Status Changes that will end when the status activates. (Optional)
# EndOnStart: List of Status Changes that will end when the status activates. (Optional)
# EndReturn: List of Status Changes that will end when the status activates and won't give its effect. (Optional)
# EndOnEnd: List of Status Changes that will end when the status becomes inactive. (Optional)
###########################################################################
Header:
Type: STATUS_DB
Version: 2
Version: 3
Body:
- Status: Stone
@ -70,7 +71,7 @@ Body:
Stun: true
Sleep: true
Burning: true
End:
EndOnStart:
Aeterna: true
EndReturn:
StoneWait: true
@ -121,7 +122,7 @@ Body:
Stun: true
Sleep: true
Burning: true
End:
EndOnStart:
Aeterna: true
- Status: Stun
DurationLookup: NPC_STUNATTACK
@ -272,7 +273,7 @@ Body:
BossResist: true
Debuff: true
NoSaveInfinite: true
End:
EndOnStart:
Freeze: true
Stone: true
Sleep: true
@ -327,7 +328,7 @@ Body:
NoBanishingBuster: true
NoDispell: true
NoClearance: true
End:
EndOnStart:
Closeconfine: true
Closeconfine2: true
- Status: Cloaking
@ -355,7 +356,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Aspersio: true
Fireweapon: true
Waterweapon: true
@ -381,7 +382,7 @@ Body:
Debuff: true
Fail:
Speedup1: true
End:
EndOnStart:
Loud: true
Concentrate: true
Truesight: true
@ -437,7 +438,7 @@ Body:
TaekwonAngel: true
Fail:
Quagmire: true
End:
EndOnStart:
Decreaseagi: true
Adoramus: true
- Status: Decreaseagi
@ -452,7 +453,7 @@ Body:
Debuff: true
Fail:
Speedup1: true
End:
EndOnStart:
Cartboost: true
Gn_Cartboost: true
Increaseagi: true
@ -475,7 +476,7 @@ Body:
Watk: true
Flags:
SuperNoviceAngel: true
End:
EndOnStart:
Impositio: true
- Status: Suffragium
Icon: EFST_SUFFRAGIUM
@ -489,7 +490,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Encpoison: true
Fireweapon: true
Waterweapon: true
@ -512,7 +513,7 @@ Body:
DurationLookup: PR_KYRIE
Flags:
SuperNoviceAngel: true
End:
EndOnStart:
Assumptio: true
- Status: Magnificat
Icon: EFST_MAGNIFICAT
@ -589,7 +590,7 @@ Body:
NoSave: true
NoClearance: true
RemoveOnChangeMap: true
End:
EndOnStart:
Dancing: true
- Status: Loud
Icon: EFST_SHOUT
@ -838,7 +839,7 @@ Body:
Flags:
NoClearance: true
RequireShield: true
End:
EndOnStart:
Reflectdamage: true
- Status: Splasher
Icon: EFST_SPLASHER
@ -987,7 +988,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Waterweapon: true
@ -1002,7 +1003,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Fireweapon: true
@ -1017,7 +1018,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Fireweapon: true
@ -1032,7 +1033,7 @@ Body:
Atk_Ele: true
Flags:
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Fireweapon: true
@ -1180,7 +1181,7 @@ Body:
DurationLookup: HP_ASSUMPTIO
Opt3:
Assumptio: true
End:
EndOnStart:
Kyrie: true
Kaite: true
- Status: Basilica
@ -1205,7 +1206,7 @@ Body:
Matk: true
Flags:
NoSave: true
End:
EndOnStart:
Magicpower: true
- Status: Edp
Icon: EFST_EDP
@ -1334,7 +1335,7 @@ Body:
Debuff: true
NoClearance: true
NoSave: true
End:
EndOnStart:
Blessing: true
Increaseagi: true
- Status: Jointbeat
@ -1358,7 +1359,7 @@ Body:
Flags:
NoSave: true
Debuff: true
End:
EndOnStart:
Freeze: true
Stone: true
Sleep: true
@ -1396,6 +1397,11 @@ Body:
NoSave: true
RemoveOnChangeMap: true
OverlapIgnoreLevel: true
EndOnEnd:
Autoguard: true
Defender: true
ReflectShield: true
Endure: true
- Status: Sacrifice
DurationLookup: PA_SACRIFICE
- Status: Steelbody
@ -1482,7 +1488,7 @@ Body:
Flags:
NoSave: true
NoClearance: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Fireweapon: true
@ -1510,7 +1516,7 @@ Body:
Flags:
NoSave: true
NoClearance: true
End:
EndOnStart:
Encpoison: true
Aspersio: true
Fireweapon: true
@ -1527,7 +1533,7 @@ Body:
Flags:
NoSave: true
NoClearance: true
End:
EndOnStart:
Kaahi: true
- Status: Kaupe
Icon: EFST_KAUPE
@ -1548,7 +1554,7 @@ Body:
RequireWeapon: true
Fail:
Decreaseagi: true
End:
EndOnStart:
Aspdpotion0: true
Aspdpotion1: true
Aspdpotion2: true
@ -1603,7 +1609,7 @@ Body:
Flags:
MadoCancel: true
NoSave: true
End:
EndOnStart:
Overthrust: true
- Status: Longing
Icon: EFST_LONGING
@ -1684,6 +1690,8 @@ Body:
RemoveOnChangeMap: true
RequireWeapon: true
OverlapIgnoreLevel: true
EndOnEnd:
Longing: true
- Status: Elementalchange
Icon: EFST_ARMOR_PROPERTY
DurationLookup: NPC_ATTRICHANGE
@ -1811,7 +1819,7 @@ Body:
NoClearance: true
Fail:
Speedup1: true
End:
EndOnStart:
Increaseagi: true
Adrenaline: true
Adrenaline2: true
@ -2040,7 +2048,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Str_Cash: true
- Status: Agifood
Icon: EFST_FOOD_AGI
@ -2051,7 +2059,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Agi_Cash: true
- Status: Vitfood
Icon: EFST_FOOD_VIT
@ -2062,7 +2070,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Vit_Cash: true
- Status: Intfood
Icon: EFST_FOOD_INT
@ -2073,7 +2081,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Int_Cash: true
- Status: Dexfood
Icon: EFST_FOOD_DEX
@ -2084,7 +2092,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Dex_Cash: true
- Status: Lukfood
Icon: EFST_FOOD_LUK
@ -2095,7 +2103,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Luk_Cash: true
- Status: Hitfood
Icon: EFST_FOOD_BASICHIT
@ -2194,7 +2202,7 @@ Body:
Flags:
SendOption: true
NoRemoveOnDead: true
End:
EndOnStart:
Spirit: true
- Status: Skillrate_Up
DurationLookup: SG_FRIEND
@ -2215,7 +2223,7 @@ Body:
Flags:
NoSave: true
NoClearance: true
End:
EndOnStart:
Assumptio: true
- Status: Swoo
Icon: EFST_SWOO
@ -2268,7 +2276,7 @@ Body:
Fail:
P_Alter: true
Heat_Barrel: true
End:
EndOnStart:
Adjustment: true
- Status: Adjustment
Icon: EFST_GS_ADJUSTMENT
@ -2279,8 +2287,8 @@ Body:
Flags:
NoDispell: true
NoBanishingBuster: true
End:
Madnesscancel: true
EndOnStart:
MadnessCancel: true
- Status: Increasing
Icon: EFST_GS_ACCURACY
DurationLookup: GS_INCREASING
@ -2438,7 +2446,7 @@ Body:
SendVal1: true
OverlapIgnoreLevel: true
RemoveOnUnequipWeapon: true
End:
EndOnStart:
Enchantarms: true
Aspersio: true
- Status: Magicalattack
@ -2718,7 +2726,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Invincibleoff: true
- Status: Invincibleoff
DurationLookup: NPC_INVINCIBLEOFF
@ -2728,7 +2736,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Invincible: true
- Status: Manu_Atk
Icon: EFST_MANU_ATK
@ -2782,7 +2790,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Strfood: true
- Status: Food_Agi_Cash
Icon: EFST_FOOD_AGI_CASH
@ -2794,7 +2802,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Agifood: true
- Status: Food_Vit_Cash
Icon: EFST_FOOD_VIT_CASH
@ -2806,7 +2814,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Vitfood: true
- Status: Food_Dex_Cash
Icon: EFST_FOOD_DEX_CASH
@ -2818,7 +2826,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Intfood: true
- Status: Food_Int_Cash
Icon: EFST_FOOD_INT_CASH
@ -2830,7 +2838,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Dexfood: true
- Status: Food_Luk_Cash
Icon: EFST_FOOD_LUK_CASH
@ -2842,7 +2850,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Lukfood: true
- Status: Fear
DurationLookup: RK_WINDCUTTER
@ -2858,7 +2866,7 @@ Body:
Debuff: true
Fail:
Inspiration: true
End:
EndOnStart:
Blind: true
- Status: Burning
Icon: EFST_BURNT
@ -2897,7 +2905,7 @@ Body:
Refresh: true
Inspiration: true
Warmer: true
End:
EndOnStart:
Burning: true
- Status: Enchantblade
Icon: EFST_ENCHANTBLADE
@ -2992,7 +3000,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Fightingspirit: true
- Status: Abundance
Icon: EFST_ABUNDANCE
@ -3011,7 +3019,7 @@ Body:
Flags:
BossResist: true
Debuff: true
End:
EndOnStart:
Decreaseagi: true
- Status: Epiclesis
Icon: EFST_EPICLESIS
@ -3086,7 +3094,7 @@ Body:
SetStand: true
StopWalking: true
StopAttacking: true
End:
EndOnStart:
Freezing: true
- Status: Marshofabyss
Icon: EFST_MARSHOFABYSS
@ -3105,7 +3113,7 @@ Body:
MinDuration: 5000
Fail:
Refresh: true
End:
EndOnStart:
Increaseagi: true
Windwalk: true
Aspdpotion0: true
@ -3452,7 +3460,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Venombleed
Icon: EFST_VENOMBLEED
CalcFlags:
@ -3474,7 +3482,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Magicmushroom
Icon: EFST_MAGICMUSHROOM
CalcFlags:
@ -3496,7 +3504,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Deathhurt
Icon: EFST_DEATHHURT
CalcFlags:
@ -3518,7 +3526,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Pyrexia
Icon: EFST_PYREXIA
CalcFlags:
@ -3540,7 +3548,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Oblivioncurse
Icon: EFST_OBLIVIONCURSE
States:
@ -3565,7 +3573,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Leechesend
Icon: EFST_LEECHESEND
Flags:
@ -3585,7 +3593,7 @@ Body:
Deathhurt: true
Pyrexia: true
Oblivioncurse: true
Leechesend: true
LeechesEnd: true
- Status: Reflectdamage
Icon: EFST_LG_REFLECTDAMAGE
DurationLookup: LG_REFLECTDAMAGE
@ -3593,7 +3601,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
RequireShield: true
End:
EndOnStart:
Reflectshield: true
- Status: Forceofvanguard
Icon: EFST_FORCEOFVANGUARD
@ -3607,13 +3615,13 @@ Body:
- Status: Shieldspell_Hp
Icon: EFST_SHIELDSPELL_DEF
DurationLookup: LG_SHIELDSPELL
End:
EndOnStart:
Shieldspell_Sp: true
Shieldspell_Atk: true
- Status: Shieldspell_Sp
Icon: EFST_SHIELDSPELL_MDEF
DurationLookup: LG_SHIELDSPELL
End:
EndOnStart:
Shieldspell_Hp: true
Shieldspell_Atk: true
- Status: Shieldspell_Atk
@ -3622,7 +3630,7 @@ Body:
CalcFlags:
Watk: true
Matk: true
End:
EndOnStart:
Shieldspell_Hp: true
Shieldspell_Sp: true
- Status: Exeedbreak
@ -3649,7 +3657,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Prestige: true
- Status: Banding_Defence
Icon: EFST_BANDING_DEFENCE
@ -3723,7 +3731,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Crystalize: true
Freezing: true
Freeze: true
@ -3760,7 +3768,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Symphonyoflover: true
Moonlitserenade: true
Rushwindmill: true
@ -3775,7 +3783,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Swingdance: true
Moonlitserenade: true
Rushwindmill: true
@ -3790,7 +3798,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Swingdance: true
Symphonyoflover: true
Rushwindmill: true
@ -3806,7 +3814,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Swingdance: true
Symphonyoflover: true
Moonlitserenade: true
@ -3821,7 +3829,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Swingdance: true
Symphonyoflover: true
Moonlitserenade: true
@ -3837,7 +3845,7 @@ Body:
Int: true
Dex: true
Luk: true
End:
EndOnStart:
Swingdance: true
Symphonyoflover: true
Moonlitserenade: true
@ -3851,7 +3859,7 @@ Body:
DisplayPc: true
StopAttacking: true
MinDuration: 10000
End:
EndOnStart:
Deepsleep: true
Gloomyday: true
Gloomyday_Sk: true
@ -3889,7 +3897,7 @@ Body:
Fail:
Refresh: true
Inspiration: true
End:
EndOnStart:
Dancing: true
Voiceofsiren: true
Gloomyday: true
@ -3905,7 +3913,7 @@ Body:
- Status: Sircleofnature
Icon: EFST_SIRCLEOFNATURE
DurationLookup: WM_SIRCLEOFNATURE
End:
EndOnStart:
Deepsleep: true
Gloomyday: true
Gloomyday_Sk: true
@ -3926,7 +3934,7 @@ Body:
Flee: true
Speed: true
Aspd: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Songofmana: true
@ -3941,7 +3949,7 @@ Body:
- Status: Songofmana
Icon: EFST_SONG_OF_MANA
DurationLookup: WM_SONG_OF_MANA
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -3960,7 +3968,7 @@ Body:
DurationLookup: WM_DANCE_WITH_WUG
CalcFlags:
Aspd: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -3990,7 +3998,7 @@ Body:
Fail:
Berserk: true
Inspiration: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -4011,7 +4019,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -4033,7 +4041,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -4055,7 +4063,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -4074,7 +4082,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Voiceofsiren: true
Deepsleep: true
Gloomyday: true
@ -4178,7 +4186,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Gt_Revitalize: true
- Status: Gt_Revitalize
Icon: EFST_GENTLETOUCH_REVITALIZE
@ -4190,7 +4198,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Gt_Change: true
- Status: Gn_Cartboost
Icon: EFST_GN_CARTBOOST
@ -5221,7 +5229,7 @@ Body:
MaxHp: true
Flags:
NoSave: true
End:
EndOnStart:
Tinder_Breaker2: true
- Status: Goldene_Ferse
Icon: EFST_GOLDENE_FERSE
@ -5260,7 +5268,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Overed_Boost: true
- Status: Light_Of_Regene
Icon: EFST_LIGHT_OF_REGENE
@ -5388,7 +5396,7 @@ Body:
NoConsumeItem: true
Flags:
StopAttacking: true
End:
EndOnStart:
Poison: true
Blind: true
Freeze: true
@ -5423,7 +5431,7 @@ Body:
DisplayPc: true
Fail:
Magnificat: true
End:
EndOnStart:
Magnificat: true
Blind: true
Curse: true
@ -5437,7 +5445,7 @@ Body:
Paralyse: true
Pyrexia: true
Deathhurt: true
Leechesend: true
LeechesEnd: true
Venombleed: true
Toxin: true
Magicmushroom: true
@ -5510,7 +5518,7 @@ Body:
NoClearance: true
Fail:
P_Alter: true
Madnesscancel: true
MadnessCancel: true
- Status: P_Alter
Icon: EFST_P_ALTER
DurationLookup: RL_P_ALTER
@ -5521,7 +5529,7 @@ Body:
NoClearance: true
Fail:
Heat_Barrel: true
Madnesscancel: true
MadnessCancel: true
- Status: E_Chain
Icon: EFST_E_CHAIN
DurationLookup: RL_E_CHAIN
@ -5793,7 +5801,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Food_Str_Cash: true
Food_Agi_Cash: true
Food_Vit_Cash: true
@ -6223,31 +6231,31 @@ Body:
Icon: EFST_GVG_GOLEM
- Status: Gvg_Stun
Icon: EFST_GVG_STUN
End:
EndOnStart:
Gvg_Stun: true
- Status: Gvg_Stone
Icon: EFST_GVG_STONE
End:
EndOnStart:
Stone: true
- Status: Gvg_Freez
Icon: EFST_GVG_FREEZ
End:
EndOnStart:
Freeze: true
- Status: Gvg_Sleep
Icon: EFST_GVG_SLEEP
End:
EndOnStart:
Sleep: true
- Status: Gvg_Curse
Icon: EFST_GVG_CURSE
End:
EndOnStart:
Curse: true
- Status: Gvg_Silence
Icon: EFST_GVG_SILENCE
End:
EndOnStart:
Silence: true
- Status: Gvg_Blind
Icon: EFST_GVG_BLIND
End:
EndOnStart:
Blind: true
- Status: Clan_Info
Icon: EFST_CLAN_INFO
@ -6272,6 +6280,8 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
EndOnEnd:
Clan_Info: true
- Status: Arcwandclan
Icon: EFST_ARCWANDCLAN
CalcFlags:
@ -6285,6 +6295,8 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
EndOnEnd:
Clan_Info: true
- Status: Goldenmaceclan
Icon: EFST_GOLDENMACECLAN
CalcFlags:
@ -6298,6 +6310,8 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
EndOnEnd:
Clan_Info: true
- Status: Crossbowclan
Icon: EFST_CROSSBOWCLAN
CalcFlags:
@ -6311,6 +6325,8 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
EndOnEnd:
Clan_Info: true
- Status: Jumpingclan
Icon: EFST_JUMPINGCLAN
CalcFlags:
@ -6326,6 +6342,8 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
EndOnEnd:
Clan_Info: true
- Status: Tarotcard
Icon: EFST_TAROTCARD
DurationLookup: CG_TAROTCARD
@ -6426,7 +6444,7 @@ Body:
Flee: true
Flags:
NoRemoveOnDead: true
End:
EndOnStart:
Stun: true
Freeze: true
Stone: true
@ -6620,19 +6638,19 @@ Body:
- Status: Lightofmoon
Icon: EFST_LIGHTOFMOON
DurationLookup: SJ_LIGHTOFMOON
End:
EndOnStart:
Lunarstance: true
Universestance: true
- Status: Lightofsun
Icon: EFST_LIGHTOFSUN
DurationLookup: SJ_LIGHTOFSUN
End:
EndOnStart:
Lightofsun: true
Universestance: true
- Status: Lightofstar
Icon: EFST_LIGHTOFSTAR
DurationLookup: SJ_LIGHTOFSTAR
End:
EndOnStart:
Starstance: true
Universestance: true
- Status: Lunarstance
@ -6640,7 +6658,7 @@ Body:
DurationLookup: SJ_LUNARSTANCE
CalcFlags:
MaxHp: true
End:
EndOnStart:
Sunstance: true
Starstance: true
Universestance: true
@ -6654,7 +6672,7 @@ Body:
Int: true
Dex: true
Luk: true
End:
EndOnStart:
Sunstance: true
Lunarstance: true
Starstance: true
@ -6664,7 +6682,7 @@ Body:
CalcFlags:
Batk: true
Watk: true
End:
EndOnStart:
Lunarstance: true
Starstance: true
Universestance: true
@ -6697,7 +6715,7 @@ Body:
DurationLookup: SJ_STARSTANCE
CalcFlags:
Aspd: true
End:
EndOnStart:
Sunstance: true
Lunarstance: true
Universestance: true
@ -6766,7 +6784,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Spirit: true
Soulgolem: true
Soulfalcon: true
@ -6781,7 +6799,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Spirit: true
Soulgolem: true
Soulshadow: true
@ -6797,7 +6815,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Spirit: true
Soulgolem: true
Soulshadow: true
@ -6813,7 +6831,7 @@ Body:
NoDispell: true
NoBanishingBuster: true
NoClearance: true
End:
EndOnStart:
Spirit: true
Soulshadow: true
Soulfalcon: true

File diff suppressed because it is too large Load Diff

View File

@ -35,13 +35,14 @@
# MinRate Minimum rate after status change reduction (10000 = 100%). (Default: 0)
# MinDuration Minimum duration in milliseconds after status change reduction. (Default: 1)
# Fail: List of Status Changes that causes the status to fail to activate. (Optional)
# End: List of Status Changes that will end when the status activates. (Optional)
# EndOnStart: List of Status Changes that will end when the status activates. (Optional)
# EndReturn: List of Status Changes that will end when the status activates and won't give its effect. (Optional)
# EndOnEnd: List of Status Changes that will end when the status becomes inactive. (Optional)
###########################################################################
Header:
Type: STATUS_DB
Version: 2
Version: 3
Footer:
Imports:

View File

@ -3,7 +3,7 @@
//===== By: ==================================================
//= rAthena Dev Team
//===== Last Updated: ========================================
//= 20220421
//= 20221013
//===== Description: =========================================
//= Explanation of the status.yml file and structure.
//============================================================
@ -266,7 +266,7 @@ Fail: List of status that causes the status to fail to activate.
---------------------------------------
End: List of status that will end if the status activates.
EndOnStart: List of status that will end if the status activates.
---------------------------------------
@ -276,6 +276,10 @@ EndReturn: List of status that will end if the status activates and it won't giv
---------------------------------------
EndOnEnd: List of status that will end when the status becomes inactive.
---------------------------------------
Notes:
By default, statuses are 'Buff' (those that aren't explicitely given the 'Debuff' flag) which are removable by 'map_quit' in combination with 'battle_config.debuff_on_logout'.

View File

@ -988,14 +988,14 @@ std::bitset<SCB_MAX> StatusDatabase::getCalcFlag(sc_type type) {
}
/**
* Get SC's END list
* Get SC's EndOnStart list
* @param sc: SC type
* @return End list
**/
std::vector<sc_type> StatusDatabase::getEnd(sc_type type) {
std::vector<sc_type> StatusDatabase::getEndOnStart(sc_type type) {
std::shared_ptr<s_status_change_db> status = status_db.find(type);
return status ? status->end : std::vector<sc_type> {};
return status ? status->endonstart : std::vector<sc_type> {};
}
/**
@ -10240,9 +10240,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
std::vector<sc_type> endlist;
if (type == SC_BERSERK && val3 == SC__BLOODYLUST) //There is some reasons that using SC_BERSERK first before SC__BLOODYLUST itself on Akinari's fix
endlist = status_db.getEnd(SC__BLOODYLUST);
endlist = status_db.getEndOnStart(SC__BLOODYLUST);
else
endlist = scdb->end;
endlist = scdb->endonstart;
// End the SCs from the list
if (!endlist.empty()) {
@ -12513,7 +12513,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break;
default:
if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->end.empty() && scdb->endreturn.empty() && scdb->fail.empty()) {
if (calc_flag.none() && scdb->skill_id == 0 && scdb->icon == EFST_BLANK && scdb->opt1 == OPT1_NONE && scdb->opt2 == OPT2_NONE && scdb->state.none() && scdb->flag.none() && scdb->endonstart.empty() && scdb->endreturn.empty() && scdb->fail.empty() && scdb->endonend.empty()) {
// Status change with no calc, no icon, and no skill associated...?
ShowWarning("status_change_start: Status %s (%d) is bare. Add the NoWarning flag to suppress this message.\n", script_get_constant_str("SC_", type), type);
return 0;
@ -13072,11 +13072,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
((TBL_MER*)d_bl)->devotion_flag = 0;
clif_devotion(d_bl, NULL);
}
status_change_end(bl, SC_AUTOGUARD);
status_change_end(bl, SC_DEFENDER);
status_change_end(bl, SC_REFLECTSHIELD);
status_change_end(bl, SC_ENDURE);
}
break;
@ -13138,12 +13133,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
if((sce->val1&0xFFFF) == CG_MOONLIT)
clif_status_change(bl,EFST_MOON,0,0,0,0,0);
#ifdef RENEWAL
status_change_end(bl, SC_ENSEMBLEFATIGUE);
#else
status_change_end(bl, SC_LONGING);
#endif
}
break;
case SC_NOCHAT:
@ -13371,9 +13360,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
}
}
break;
case SC_TEARGAS:
status_change_end(bl,SC_TEARGAS_SOB);
break;
case SC_SITDOWN_FORCE:
case SC_BANANA_BOMB_SITDOWN:
if( sd && pc_issit(sd) && pc_setstand(sd, false) )
@ -13387,25 +13373,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
calc_flag = status_db.getSCB_ALL(); // Required for overlapping
break;
case SC_SUNSTANCE:
status_change_end(bl, SC_LIGHTOFSUN);
break;
case SC_LUNARSTANCE:
status_change_end(bl, SC_NEWMOON);
status_change_end(bl, SC_LIGHTOFMOON);
break;
case SC_STARSTANCE:
status_change_end(bl, SC_FALLINGSTAR);
status_change_end(bl, SC_LIGHTOFSTAR);
break;
case SC_UNIVERSESTANCE:
status_change_end(bl, SC_LIGHTOFSUN);
status_change_end(bl, SC_NEWMOON);
status_change_end(bl, SC_LIGHTOFMOON);
status_change_end(bl, SC_FALLINGSTAR);
status_change_end(bl, SC_LIGHTOFSTAR);
status_change_end(bl, SC_DIMENSION);
break;
case SC_GRAVITYCONTROL:
status_fix_damage(bl, bl, sce->val2, clif_damage(bl, bl, gettick(), 0, 0, sce->val2, 0, DMG_NORMAL, 0, false), 0);
clif_specialeffect(bl, 223, AREA);
@ -13479,13 +13446,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
///< !CHECKME: Seems on official, there's delay before same target can be vacuumed in same area again [Cydh]
sc_start2(bl, bl, SC_VACUUM_EXTREME_POSTDELAY, 100, sce->val1, sce->val2, skill_get_time2(SO_VACUUM_EXTREME,sce->val1));
break;
case SC_SWORDCLAN:
case SC_ARCWANDCLAN:
case SC_GOLDENMACECLAN:
case SC_CROSSBOWCLAN:
case SC_JUMPINGCLAN:
status_change_end(bl,SC_CLAN_INFO);
break;
case SC_DIMENSION1:
case SC_DIMENSION2:
if (sd)
@ -13523,9 +13483,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
pc_delservantball( *sd, sd->servantball );
}
break;
case SC_CHARGINGPIERCE:
status_change_end(bl, SC_CHARGINGPIERCE_COUNT);
break;
case SC_ABYSSFORCEWEAPON:
if( sd ){
pc_delabyssball( *sd, sd->abyssball );
@ -13533,6 +13490,13 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break;
}
// End statuses found in the EndOnEnd list.
if (!scdb->endonend.empty()) {
for (const auto &it : scdb->endonend) {
status_change_end(bl, it);
}
}
// Reset the options as needed
std::bitset<SCF_MAX> opt_flag = scdb->flag;
bool disable_opt_flag = false;
@ -15651,8 +15615,8 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
}
}
if (this->nodeExists(node, "End")) {
const ryml::NodeRef& endNode = node["End"];
if (this->nodeExists(node, "EndOnStart")) {
const ryml::NodeRef& endNode = node["EndOnStart"];
for (const auto &it : endNode) {
std::string end;
@ -15662,12 +15626,12 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
int64 constant;
if (!script_get_constant(end_constant.c_str(), &constant)) {
this->invalidWarning(endNode, "End status %s is invalid.\n", end.c_str());
this->invalidWarning(endNode, "EndOnStart status %s is invalid.\n", end.c_str());
return 0;
}
if (!this->validateStatus(static_cast<sc_type>(constant))) {
this->invalidWarning(endNode, "End status %s is out of bounds.\n", end.c_str());
this->invalidWarning(endNode, "EndOnStart status %s is out of bounds.\n", end.c_str());
return 0;
}
@ -15677,9 +15641,9 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
return 0;
if (active)
status->end.push_back(static_cast<sc_type>(constant));
status->endonstart.push_back(static_cast<sc_type>(constant));
else
util::vector_erase_if_exists(status->end, static_cast<sc_type>(constant));
util::vector_erase_if_exists(status->endonstart, static_cast<sc_type>(constant));
}
}
@ -15715,6 +15679,38 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
}
}
if (this->nodeExists(node, "EndOnEnd")) {
const ryml::NodeRef &endNode = node["EndOnEnd"];
for (const auto &it : endNode) {
std::string end;
c4::from_chars(it.key(), &end);
std::string end_constant = "SC_" + end;
int64 constant;
if (!script_get_constant(end_constant.c_str(), &constant)) {
this->invalidWarning(endNode, "EndOnEnd status %s is invalid.\n", end.c_str());
return 0;
}
if (!this->validateStatus(static_cast<sc_type>(constant))) {
this->invalidWarning(endNode, "EndOnEnd status %s is out of bounds.\n", end.c_str());
return 0;
}
bool active;
if (!this->asBool(endNode, end, active))
return 0;
if (active)
status->endonend.push_back(static_cast<sc_type>(constant));
else
util::vector_erase_if_exists(status->endonend, static_cast<sc_type>(constant));
}
}
if (!exists) {
this->put(status_id, status);
}

View File

@ -2940,27 +2940,28 @@ enum e_status_change_flag : uint16 {
/// Struct of SC configs [Cydh]
struct s_status_change_db {
sc_type type; ///< SC_
efst_type icon; ///< EFST_
std::bitset<SCS_MAX> state; ///< SCS_
std::bitset<SCB_MAX> calc_flag; ///< SCB_ flags
uint16 opt1; ///< OPT1_
uint16 opt2; ///< OPT2_
uint32 opt3; ///< OPT3_
uint32 look; ///< OPTION_ Changelook
std::bitset<SCF_MAX> flag; ///< SCF_ Flags, enum e_status_change_flag
bool display; ///< Display status effect/icon (for certain state)
uint16 skill_id; ///< Associated skill for (addeff) duration lookups
std::vector<sc_type> end; ///< List of SC that will be ended when this SC is activated
std::vector<sc_type> fail; ///< List of SC that causing this SC cannot be activated
std::vector<sc_type> endreturn; ///< List of SC that will be ended when this SC is activated and then immediately return
t_tick min_duration; ///< Minimum duration effect (after all status reduction)
uint16 min_rate; ///< Minimum rate to be applied (after all status reduction)
sc_type type; ///< SC_
efst_type icon; ///< EFST_
std::bitset<SCS_MAX> state; ///< SCS_
std::bitset<SCB_MAX> calc_flag; ///< SCB_ flags
uint16 opt1; ///< OPT1_
uint16 opt2; ///< OPT2_
uint32 opt3; ///< OPT3_
uint32 look; ///< OPTION_ Changelook
std::bitset<SCF_MAX> flag; ///< SCF_ Flags, enum e_status_change_flag
bool display; ///< Display status effect/icon (for certain state)
uint16 skill_id; ///< Associated skill for (addeff) duration lookups
std::vector<sc_type> endonstart; ///< List of SC that will be ended when this SC is activated
std::vector<sc_type> fail; ///< List of SC that causing this SC cannot be activated
std::vector<sc_type> endreturn; ///< List of SC that will be ended when this SC is activated and then immediately return
std::vector<sc_type> endonend; ///< List of SC that will be ended when this SC ends
t_tick min_duration; ///< Minimum duration effect (after all status reduction)
uint16 min_rate; ///< Minimum rate to be applied (after all status reduction)
};
class StatusDatabase : public TypesafeCachedYamlDatabase<uint16, s_status_change_db> {
public:
StatusDatabase() : TypesafeCachedYamlDatabase("STATUS_DB", 2) {
StatusDatabase() : TypesafeCachedYamlDatabase("STATUS_DB", 3) {
// All except BASE and extra flags.
SCB_BATTLE.set();
SCB_BATTLE.reset(SCB_BASE);
@ -2980,7 +2981,7 @@ public:
// Extras
efst_type getIcon(sc_type type);
std::bitset<SCB_MAX> getCalcFlag(sc_type type);
std::vector<sc_type> getEnd(sc_type type);
std::vector<sc_type> getEndOnStart(sc_type type);
uint16 getSkill(sc_type type);
bool hasSCF(status_change *sc, e_status_change_flag flag);
void removeByStatusFlag(block_list *bl, std::vector<e_status_change_flag> flag);

View File

@ -6,6 +6,7 @@
static bool upgrade_achievement_db(std::string file, const uint32 source_version);
static bool upgrade_item_db(std::string file, const uint32 source_version);
static bool upgrade_job_stats(std::string file, const uint32 source_version);
static bool upgrade_status_db(std::string file, const uint32 source_version);
template<typename Func>
bool process(const std::string &type, uint32 version, const std::vector<std::string> &paths, const std::string &name, Func lambda) {
@ -121,6 +122,12 @@ int do_init(int argc, char** argv) {
})) {
return 0;
}
if (!process("STATUS_DB", 3, root_paths, "status", [](const std::string& path, const std::string& name_ext, uint32 source_version) -> bool {
return upgrade_status_db(path + name_ext, source_version);
})) {
return 0;
}
return 0;
}
@ -293,3 +300,25 @@ static bool upgrade_job_stats(std::string file, const uint32 source_version) {
return true;
}
static bool upgrade_status_db(std::string file, const uint32 source_version) {
size_t entries = 0;
for (auto input : inNode["Body"]) {
// If under version 3
if (source_version < 3) {
// Rename End to EndOnStart
if (input["End"].IsDefined()) {
input["EndOnStart"] = input["End"];
input.remove("End");
}
}
body << input;
entries++;
}
ShowStatus("Done converting/upgrading '" CL_WHITE "%zu" CL_RESET "' statuses in '" CL_WHITE "%s" CL_RESET "'.\n", entries, file.c_str());
return true;
}