[Spells] Update SPA 238 SE_IllusionPersistence allow illusions to persist through deaths at higher AA ranks. (#1884)

* start

* working
This commit is contained in:
KayenEQ 2021-12-13 18:49:33 -05:00 committed by GitHub
parent 91c958ae63
commit 7cf66a2daa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 9 deletions

View File

@ -1454,7 +1454,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon)
} }
case SE_IllusionPersistence: case SE_IllusionPersistence:
newbon->IllusionPersistence = true; newbon->IllusionPersistence = base_value;
break; break;
case SE_LimitToSkill: { case SE_LimitToSkill: {
@ -3529,7 +3529,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
} }
case SE_IllusionPersistence: case SE_IllusionPersistence:
new_bonus->IllusionPersistence = true; new_bonus->IllusionPersistence = effect_value;
break; break;
case SE_LimitToSkill:{ case SE_LimitToSkill:{
@ -5410,9 +5410,9 @@ void Mob::NegateSpellEffectBonuses(uint16 spell_id)
break; break;
case SE_IllusionPersistence: case SE_IllusionPersistence:
if (negate_spellbonus) { spellbonuses.IllusionPersistence = false; } if (negate_spellbonus) { spellbonuses.IllusionPersistence = effect_value; }
if (negate_itembonus) { itembonuses.IllusionPersistence = false; } if (negate_itembonus) { itembonuses.IllusionPersistence = effect_value; }
if (negate_aabonus) { aabonuses.IllusionPersistence = false; } if (negate_aabonus) { aabonuses.IllusionPersistence = effect_value; }
break; break;
case SE_Attack_Accuracy_Max_Percent: case SE_Attack_Accuracy_Max_Percent:

View File

@ -617,7 +617,7 @@ struct StatBonuses {
uint32 Assassinate[2]; // Assassinate AA (Massive dmg vs humaniod w/ assassinate) 0= ? 1= Dmg uint32 Assassinate[2]; // Assassinate AA (Massive dmg vs humaniod w/ assassinate) 0= ? 1= Dmg
uint8 AssassinateLevel[2]; // Max Level Assassinate will be effective at. uint8 AssassinateLevel[2]; // Max Level Assassinate will be effective at.
int32 PetMeleeMitigation; // Add AC to owner's pet. int32 PetMeleeMitigation; // Add AC to owner's pet.
bool IllusionPersistence; // Causes illusions not to fade. int IllusionPersistence; // 1=Causes illusions not to fade when zoning 2=Allow to persist after death.
uint16 extra_xtargets; // extra xtarget entries uint16 extra_xtargets; // extra xtarget entries
bool ShroudofStealth; // rogue improved invisiblity bool ShroudofStealth; // rogue improved invisiblity
uint16 ReduceFallDamage; // reduce fall damage by percent uint16 ReduceFallDamage; // reduce fall damage by percent

View File

@ -861,6 +861,7 @@ public:
inline bool HasBaseEffectFocus() const { return (spellbonuses.FocusEffects[focusFcBaseEffects] || aabonuses.FocusEffects[focusFcBaseEffects] || itembonuses.FocusEffects[focusFcBaseEffects]); } inline bool HasBaseEffectFocus() const { return (spellbonuses.FocusEffects[focusFcBaseEffects] || aabonuses.FocusEffects[focusFcBaseEffects] || itembonuses.FocusEffects[focusFcBaseEffects]); }
int32 GetDualWieldingSameDelayWeapons() const { return dw_same_delay; } int32 GetDualWieldingSameDelayWeapons() const { return dw_same_delay; }
inline void SetDualWieldingSameDelayWeapons(int32 val) { dw_same_delay = val; } inline void SetDualWieldingSameDelayWeapons(int32 val) { dw_same_delay = val; }
bool HasPersistDeathIllusion(int32 spell_id);
bool TryDoubleMeleeRoundEffect(); bool TryDoubleMeleeRoundEffect();
bool GetUseDoubleMeleeRoundDmgBonus() const { return use_double_melee_round_dmg_bonus; } bool GetUseDoubleMeleeRoundDmgBonus() const { return use_double_melee_round_dmg_bonus; }

View File

@ -8938,3 +8938,13 @@ void Mob::ApplySpellEffectIllusion(int32 spell_id, Mob *caster, int buffslot, in
buffs[buffslot].persistant_buff = 0; buffs[buffslot].persistant_buff = 0;
} }
} }
bool Mob::HasPersistDeathIllusion(int32 spell_id) {
if (spellbonuses.IllusionPersistence > 1 || aabonuses.IllusionPersistence > 1 || itembonuses.IllusionPersistence > 1) {
if (spell_id != SPELL_MINOR_ILLUSION && spell_id != SPELL_ILLUSION_TREE && IsEffectInSpell(spell_id, SE_Illusion) && IsBeneficialSpell(spell_id)) {
return true;
}
}
return false;
}

View File

@ -2930,8 +2930,9 @@ int Mob::CalcBuffDuration(Mob *caster, Mob *target, uint16 spell_id, int32 caste
int res = CalcBuffDuration_formula(castlevel, formula, duration); int res = CalcBuffDuration_formula(castlevel, formula, duration);
if (caster == target && (target->aabonuses.IllusionPersistence || target->spellbonuses.IllusionPersistence || if (caster == target && (target->aabonuses.IllusionPersistence || target->spellbonuses.IllusionPersistence ||
target->itembonuses.IllusionPersistence) && target->itembonuses.IllusionPersistence) &&
spell_id != SPELL_MINOR_ILLUSION && spell_id != SPELL_ILLUSION_TREE && IsEffectInSpell(spell_id, SE_Illusion)) spell_id != SPELL_MINOR_ILLUSION && spell_id != SPELL_ILLUSION_TREE && IsEffectInSpell(spell_id, SE_Illusion)) {
res = 10000; // ~16h override res = 10000; // ~16h override
}
res = mod_buff_duration(res, caster, target, spell_id); res = mod_buff_duration(res, caster, target, spell_id);
@ -4373,7 +4374,8 @@ void Mob::BuffFadeNonPersistDeath()
auto current_spell_id = buffs[buff_slot].spellid; auto current_spell_id = buffs[buff_slot].spellid;
if ( if (
IsValidSpell(current_spell_id) && IsValidSpell(current_spell_id) &&
!IsPersistDeathSpell(current_spell_id) !IsPersistDeathSpell(current_spell_id) &&
!HasPersistDeathIllusion(current_spell_id)
) { ) {
BuffFadeBySlot(buff_slot, false); BuffFadeBySlot(buff_slot, false);
recalc_bonus = true; recalc_bonus = true;