[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:
newbon->IllusionPersistence = true;
newbon->IllusionPersistence = base_value;
break;
case SE_LimitToSkill: {
@ -3529,7 +3529,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
}
case SE_IllusionPersistence:
new_bonus->IllusionPersistence = true;
new_bonus->IllusionPersistence = effect_value;
break;
case SE_LimitToSkill:{
@ -5410,9 +5410,9 @@ void Mob::NegateSpellEffectBonuses(uint16 spell_id)
break;
case SE_IllusionPersistence:
if (negate_spellbonus) { spellbonuses.IllusionPersistence = false; }
if (negate_itembonus) { itembonuses.IllusionPersistence = false; }
if (negate_aabonus) { aabonuses.IllusionPersistence = false; }
if (negate_spellbonus) { spellbonuses.IllusionPersistence = effect_value; }
if (negate_itembonus) { itembonuses.IllusionPersistence = effect_value; }
if (negate_aabonus) { aabonuses.IllusionPersistence = effect_value; }
break;
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
uint8 AssassinateLevel[2]; // Max Level Assassinate will be effective at.
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
bool ShroudofStealth; // rogue improved invisiblity
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]); }
int32 GetDualWieldingSameDelayWeapons() const { return dw_same_delay; }
inline void SetDualWieldingSameDelayWeapons(int32 val) { dw_same_delay = val; }
bool HasPersistDeathIllusion(int32 spell_id);
bool TryDoubleMeleeRoundEffect();
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;
}
}
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

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