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) # MinRate Minimum rate after status change reduction (10000 = 100%). (Default: 0)
# MinDuration Minimum duration in milliseconds after status change reduction. (Default: 1) # 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) # 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) # 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: Header:
Type: STATUS_DB Type: STATUS_DB
Version: 2 Version: 3

View File

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

View File

@ -3,7 +3,7 @@
//===== By: ================================================== //===== By: ==================================================
//= rAthena Dev Team //= rAthena Dev Team
//===== Last Updated: ======================================== //===== Last Updated: ========================================
//= 20220421 //= 20221013
//===== Description: ========================================= //===== Description: =========================================
//= Explanation of the status.yml file and structure. //= 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: 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'. 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 * @param sc: SC type
* @return End list * @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); 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; 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 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 else
endlist = scdb->end; endlist = scdb->endonstart;
// End the SCs from the list // End the SCs from the list
if (!endlist.empty()) { if (!endlist.empty()) {
@ -12513,7 +12513,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
break; break;
default: 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...? // 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); 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; 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; ((TBL_MER*)d_bl)->devotion_flag = 0;
clif_devotion(d_bl, NULL); 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; 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) if((sce->val1&0xFFFF) == CG_MOONLIT)
clif_status_change(bl,EFST_MOON,0,0,0,0,0); 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; break;
case SC_NOCHAT: case SC_NOCHAT:
@ -13371,9 +13360,6 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
} }
} }
break; break;
case SC_TEARGAS:
status_change_end(bl,SC_TEARGAS_SOB);
break;
case SC_SITDOWN_FORCE: case SC_SITDOWN_FORCE:
case SC_BANANA_BOMB_SITDOWN: case SC_BANANA_BOMB_SITDOWN:
if( sd && pc_issit(sd) && pc_setstand(sd, false) ) 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 calc_flag = status_db.getSCB_ALL(); // Required for overlapping
break; 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: 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); 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); 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] ///< !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)); sc_start2(bl, bl, SC_VACUUM_EXTREME_POSTDELAY, 100, sce->val1, sce->val2, skill_get_time2(SO_VACUUM_EXTREME,sce->val1));
break; 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_DIMENSION1:
case SC_DIMENSION2: case SC_DIMENSION2:
if (sd) 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 ); pc_delservantball( *sd, sd->servantball );
} }
break; break;
case SC_CHARGINGPIERCE:
status_change_end(bl, SC_CHARGINGPIERCE_COUNT);
break;
case SC_ABYSSFORCEWEAPON: case SC_ABYSSFORCEWEAPON:
if( sd ){ if( sd ){
pc_delabyssball( *sd, sd->abyssball ); pc_delabyssball( *sd, sd->abyssball );
@ -13533,6 +13490,13 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
break; 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 // Reset the options as needed
std::bitset<SCF_MAX> opt_flag = scdb->flag; std::bitset<SCF_MAX> opt_flag = scdb->flag;
bool disable_opt_flag = false; bool disable_opt_flag = false;
@ -15651,8 +15615,8 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
} }
} }
if (this->nodeExists(node, "End")) { if (this->nodeExists(node, "EndOnStart")) {
const ryml::NodeRef& endNode = node["End"]; const ryml::NodeRef& endNode = node["EndOnStart"];
for (const auto &it : endNode) { for (const auto &it : endNode) {
std::string end; std::string end;
@ -15662,12 +15626,12 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
int64 constant; int64 constant;
if (!script_get_constant(end_constant.c_str(), &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; return 0;
} }
if (!this->validateStatus(static_cast<sc_type>(constant))) { 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; return 0;
} }
@ -15677,9 +15641,9 @@ uint64 StatusDatabase::parseBodyNode(const ryml::NodeRef& node) {
return 0; return 0;
if (active) if (active)
status->end.push_back(static_cast<sc_type>(constant)); status->endonstart.push_back(static_cast<sc_type>(constant));
else 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) { if (!exists) {
this->put(status_id, status); this->put(status_id, status);
} }

View File

@ -2940,27 +2940,28 @@ enum e_status_change_flag : uint16 {
/// Struct of SC configs [Cydh] /// Struct of SC configs [Cydh]
struct s_status_change_db { struct s_status_change_db {
sc_type type; ///< SC_ sc_type type; ///< SC_
efst_type icon; ///< EFST_ efst_type icon; ///< EFST_
std::bitset<SCS_MAX> state; ///< SCS_ std::bitset<SCS_MAX> state; ///< SCS_
std::bitset<SCB_MAX> calc_flag; ///< SCB_ flags std::bitset<SCB_MAX> calc_flag; ///< SCB_ flags
uint16 opt1; ///< OPT1_ uint16 opt1; ///< OPT1_
uint16 opt2; ///< OPT2_ uint16 opt2; ///< OPT2_
uint32 opt3; ///< OPT3_ uint32 opt3; ///< OPT3_
uint32 look; ///< OPTION_ Changelook uint32 look; ///< OPTION_ Changelook
std::bitset<SCF_MAX> flag; ///< SCF_ Flags, enum e_status_change_flag std::bitset<SCF_MAX> flag; ///< SCF_ Flags, enum e_status_change_flag
bool display; ///< Display status effect/icon (for certain state) bool display; ///< Display status effect/icon (for certain state)
uint16 skill_id; ///< Associated skill for (addeff) duration lookups 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> 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> 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> 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) std::vector<sc_type> endonend; ///< List of SC that will be ended when this SC ends
uint16 min_rate; ///< Minimum rate to be applied (after all status reduction) 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> { class StatusDatabase : public TypesafeCachedYamlDatabase<uint16, s_status_change_db> {
public: public:
StatusDatabase() : TypesafeCachedYamlDatabase("STATUS_DB", 2) { StatusDatabase() : TypesafeCachedYamlDatabase("STATUS_DB", 3) {
// All except BASE and extra flags. // All except BASE and extra flags.
SCB_BATTLE.set(); SCB_BATTLE.set();
SCB_BATTLE.reset(SCB_BASE); SCB_BATTLE.reset(SCB_BASE);
@ -2980,7 +2981,7 @@ public:
// Extras // Extras
efst_type getIcon(sc_type type); efst_type getIcon(sc_type type);
std::bitset<SCB_MAX> getCalcFlag(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); uint16 getSkill(sc_type type);
bool hasSCF(status_change *sc, e_status_change_flag flag); bool hasSCF(status_change *sc, e_status_change_flag flag);
void removeByStatusFlag(block_list *bl, std::vector<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_achievement_db(std::string file, const uint32 source_version);
static bool upgrade_item_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_job_stats(std::string file, const uint32 source_version);
static bool upgrade_status_db(std::string file, const uint32 source_version);
template<typename Func> template<typename Func>
bool process(const std::string &type, uint32 version, const std::vector<std::string> &paths, const std::string &name, Func lambda) { 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; 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; return 0;
} }
@ -293,3 +300,25 @@ static bool upgrade_job_stats(std::string file, const uint32 source_version) {
return true; 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;
}