Core/Spells: Fixed value of aura effects for stat mod auras applied by items
Port From (https://github.com/TrinityCore/TrinityCore/commit/123858331211db6fe6745f0886c1499f8e598443)
This commit is contained in:
@@ -284,12 +284,13 @@ namespace Game.Spells
|
||||
{
|
||||
const int UPDATE_TARGET_MAP_INTERVAL = 500;
|
||||
|
||||
public Aura(SpellInfo spellproto, ObjectGuid castId, WorldObject owner, Unit caster, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, int castItemLevel)
|
||||
public Aura(SpellInfo spellproto, ObjectGuid castId, WorldObject owner, Unit caster, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint castItemId, int castItemLevel)
|
||||
{
|
||||
m_spellInfo = spellproto;
|
||||
m_castGuid = castId;
|
||||
m_casterGuid = !casterGUID.IsEmpty() ? casterGUID : caster.GetGUID();
|
||||
m_castItemGuid = castItem != null ? castItem.GetGUID() : castItemGuid;
|
||||
m_castItemId = castItem != null ? castItem.GetEntry() : castItemId;
|
||||
m_castItemLevel = castItemLevel;
|
||||
m_spellXSpellVisualId = caster ? caster.GetCastSpellXSpellVisualId(spellproto) : spellproto.GetSpellXSpellVisualId();
|
||||
m_applyTime = Time.UnixTime;
|
||||
@@ -2242,6 +2243,7 @@ namespace Game.Spells
|
||||
public ObjectGuid GetCastGUID() { return m_castGuid; }
|
||||
public ObjectGuid GetCasterGUID() { return m_casterGuid; }
|
||||
public ObjectGuid GetCastItemGUID() { return m_castItemGuid; }
|
||||
public uint GetCastItemId() { return m_castItemId; }
|
||||
public int GetCastItemLevel() { return m_castItemLevel; }
|
||||
public uint GetSpellXSpellVisualId() { return m_spellXSpellVisualId; }
|
||||
public WorldObject GetOwner() { return m_owner; }
|
||||
@@ -2261,6 +2263,11 @@ namespace Game.Spells
|
||||
m_castItemGuid = guid;
|
||||
}
|
||||
|
||||
public void SetCastItemId(uint id)
|
||||
{
|
||||
m_castItemId = id;
|
||||
}
|
||||
|
||||
public void SetCastItemLevel(int level)
|
||||
{
|
||||
m_castItemLevel = level;
|
||||
@@ -2390,12 +2397,12 @@ namespace Game.Spells
|
||||
}
|
||||
return (effMask & availableEffectMask);
|
||||
}
|
||||
public static Aura TryRefreshStackOrCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, int[] baseAmount = null, Item castItem = null, ObjectGuid casterGUID = default, bool resetPeriodicTimer = true, ObjectGuid castItemGuid = default, int castItemLevel = -1)
|
||||
public static Aura TryRefreshStackOrCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, int[] baseAmount = null, Item castItem = null, ObjectGuid casterGUID = default, bool resetPeriodicTimer = true, ObjectGuid castItemGuid = default, uint castItemId = 0, int castItemLevel = -1)
|
||||
{
|
||||
bool throwway;
|
||||
return TryRefreshStackOrCreate(spellproto, castId, tryEffMask, owner, caster, out throwway, baseAmount, castItem, casterGUID, resetPeriodicTimer, castItemGuid, castItemLevel);
|
||||
return TryRefreshStackOrCreate(spellproto, castId, tryEffMask, owner, caster, out throwway, baseAmount, castItem, casterGUID, resetPeriodicTimer, castItemGuid, castItemId, castItemLevel);
|
||||
}
|
||||
public static Aura TryRefreshStackOrCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, out bool refresh, int[] baseAmount, Item castItem = null, ObjectGuid casterGUID = default, bool resetPeriodicTimer = true, ObjectGuid castItemGuid = default, int castItemLevel = -1)
|
||||
public static Aura TryRefreshStackOrCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, out bool refresh, int[] baseAmount, Item castItem = null, ObjectGuid casterGUID = default, bool resetPeriodicTimer = true, ObjectGuid castItemGuid = default, uint castItemId = 0, int castItemLevel = -1)
|
||||
{
|
||||
Cypher.Assert(spellproto != null);
|
||||
Cypher.Assert(owner != null);
|
||||
@@ -2406,7 +2413,7 @@ namespace Game.Spells
|
||||
uint effMask = BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
|
||||
if (effMask == 0)
|
||||
return null;
|
||||
Aura foundAura = owner.ToUnit()._TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID, resetPeriodicTimer, castItemGuid, castItemLevel);
|
||||
Aura foundAura = owner.ToUnit()._TryStackingOrRefreshingExistingAura(spellproto, effMask, caster, baseAmount, castItem, casterGUID, resetPeriodicTimer, castItemGuid, castItemId, castItemLevel);
|
||||
if (foundAura != null)
|
||||
{
|
||||
// we've here aura, which script triggered removal after modding stack amount
|
||||
@@ -2418,9 +2425,9 @@ namespace Game.Spells
|
||||
return foundAura;
|
||||
}
|
||||
else
|
||||
return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemLevel);
|
||||
return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemId, castItemLevel);
|
||||
}
|
||||
public static Aura TryCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem = null, ObjectGuid casterGUID = default, ObjectGuid castItemGuid = default, int castItemLevel = -1)
|
||||
public static Aura TryCreate(SpellInfo spellproto, ObjectGuid castId, uint tryEffMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem = null, ObjectGuid casterGUID = default, ObjectGuid castItemGuid = default, uint castItemId = 0, int castItemLevel = -1)
|
||||
{
|
||||
Cypher.Assert(spellproto != null);
|
||||
Cypher.Assert(owner != null);
|
||||
@@ -2429,9 +2436,9 @@ namespace Game.Spells
|
||||
uint effMask = BuildEffectMaskForOwner(spellproto, tryEffMask, owner);
|
||||
if (effMask == 0)
|
||||
return null;
|
||||
return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemLevel);
|
||||
return Create(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemId, castItemLevel);
|
||||
}
|
||||
public static Aura Create(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, int castItemLevel)
|
||||
public static Aura Create(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint castItemId, int castItemLevel)
|
||||
{
|
||||
Cypher.Assert(effMask != 0);
|
||||
Cypher.Assert(spellproto != null);
|
||||
@@ -2461,10 +2468,10 @@ namespace Game.Spells
|
||||
{
|
||||
case TypeId.Unit:
|
||||
case TypeId.Player:
|
||||
aura = new UnitAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemLevel);
|
||||
aura = new UnitAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemId, castItemLevel);
|
||||
break;
|
||||
case TypeId.DynamicObject:
|
||||
aura = new DynObjAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemLevel);
|
||||
aura = new DynObjAura(spellproto, castId, effMask, owner, caster, baseAmount, castItem, casterGUID, castItemGuid, castItemId, castItemLevel);
|
||||
break;
|
||||
default:
|
||||
Cypher.Assert(false);
|
||||
@@ -2482,6 +2489,7 @@ namespace Game.Spells
|
||||
ObjectGuid m_castGuid;
|
||||
ObjectGuid m_casterGuid;
|
||||
ObjectGuid m_castItemGuid;
|
||||
uint m_castItemId;
|
||||
int m_castItemLevel;
|
||||
uint m_spellXSpellVisualId;
|
||||
long m_applyTime;
|
||||
@@ -2518,8 +2526,8 @@ namespace Game.Spells
|
||||
|
||||
public class UnitAura : Aura
|
||||
{
|
||||
public UnitAura(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, int castItemLevel)
|
||||
: base(spellproto, castId, owner, caster, castItem, casterGUID, castItemGuid, castItemLevel)
|
||||
public UnitAura(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint castItemId, int castItemLevel)
|
||||
: base(spellproto, castId, owner, caster, castItem, casterGUID, castItemGuid, castItemId, castItemLevel)
|
||||
{
|
||||
m_AuraDRGroup = DiminishingGroup.None;
|
||||
LoadScripts();
|
||||
@@ -2629,8 +2637,8 @@ namespace Game.Spells
|
||||
|
||||
public class DynObjAura : Aura
|
||||
{
|
||||
public DynObjAura(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, int castItemLevel)
|
||||
: base(spellproto, castId, owner, caster, castItem, casterGUID, castItemGuid, castItemLevel)
|
||||
public DynObjAura(SpellInfo spellproto, ObjectGuid castId, uint effMask, WorldObject owner, Unit caster, int[] baseAmount, Item castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint castItemId, int castItemLevel)
|
||||
: base(spellproto, castId, owner, caster, castItem, casterGUID, castItemGuid, castItemId, castItemLevel)
|
||||
{
|
||||
LoadScripts();
|
||||
Cypher.Assert(GetDynobjOwner() != null);
|
||||
|
||||
@@ -32,12 +32,12 @@ namespace Game.Spells
|
||||
{
|
||||
public class AuraEffect
|
||||
{
|
||||
public AuraEffect(Aura abase, uint effindex, int? baseAmount, Unit caster)
|
||||
public AuraEffect(Aura baseAura, uint effindex, int? baseAmount, Unit caster)
|
||||
{
|
||||
auraBase = abase;
|
||||
m_spellInfo = abase.GetSpellInfo();
|
||||
_effectInfo = abase.GetSpellEffectInfo(effindex);
|
||||
m_baseAmount = baseAmount.HasValue ? baseAmount.Value : _effectInfo.CalcBaseValue(caster, abase.GetAuraType() == AuraObjectType.Unit ? abase.GetOwner().ToUnit() : null, abase.GetCastItemLevel());
|
||||
auraBase = baseAura;
|
||||
m_spellInfo = baseAura.GetSpellInfo();
|
||||
_effectInfo = baseAura.GetSpellEffectInfo(effindex);
|
||||
m_baseAmount = baseAmount.HasValue ? baseAmount.Value : _effectInfo.CalcBaseValue(caster, baseAura.GetAuraType() == AuraObjectType.Unit ? baseAura.GetOwner().ToUnit() : null, baseAura.GetCastItemId(), baseAura.GetCastItemLevel());
|
||||
m_donePct = 1.0f;
|
||||
m_effIndex = (byte)effindex;
|
||||
m_canBeRecalculated = true;
|
||||
@@ -76,7 +76,7 @@ namespace Game.Spells
|
||||
int amount = 0;
|
||||
|
||||
if (!m_spellInfo.HasAttribute(SpellAttr8.MasterySpecialization) || MathFunctions.fuzzyEq(GetSpellEffectInfo().BonusCoefficient, 0.0f))
|
||||
amount = GetSpellEffectInfo().CalcValue(caster, m_baseAmount, GetBase().GetOwner().ToUnit(), GetBase().GetCastItemLevel());
|
||||
amount = GetSpellEffectInfo().CalcValue(caster, m_baseAmount, GetBase().GetOwner().ToUnit(), GetBase().GetCastItemId(), GetBase().GetCastItemLevel());
|
||||
else if (caster != null && caster.IsTypeId(TypeId.Player))
|
||||
amount = (int)(caster.ToPlayer().m_activePlayerData.Mastery * GetSpellEffectInfo().BonusCoefficient);
|
||||
|
||||
|
||||
@@ -2073,12 +2073,12 @@ namespace Game.Spells
|
||||
foreach (SpellEffectInfo auraSpellEffect in GetEffects())
|
||||
if (auraSpellEffect != null)
|
||||
basePoints[auraSpellEffect.EffectIndex] = (m_spellValue.CustomBasePointsMask & (1 << (int)auraSpellEffect.EffectIndex)) != 0 ?
|
||||
m_spellValue.EffectBasePoints[auraSpellEffect.EffectIndex] : auraSpellEffect.CalcBaseValue(m_originalCaster, unit, m_castItemLevel);
|
||||
m_spellValue.EffectBasePoints[auraSpellEffect.EffectIndex] : auraSpellEffect.CalcBaseValue(m_originalCaster, unit, m_castItemEntry, m_castItemLevel);
|
||||
|
||||
bool refresh = false;
|
||||
bool resetPeriodicTimer = !_triggeredCastFlags.HasAnyFlag(TriggerCastFlags.DontResetPeriodicTimer);
|
||||
m_spellAura = Aura.TryRefreshStackOrCreate(m_spellInfo, m_castId, (byte)effectMask, unit,
|
||||
m_originalCaster, out refresh, basePoints, m_CastItem, ObjectGuid.Empty, resetPeriodicTimer, ObjectGuid.Empty, m_castItemLevel);
|
||||
m_originalCaster, out refresh, basePoints, m_CastItem, ObjectGuid.Empty, resetPeriodicTimer, ObjectGuid.Empty, m_castItemEntry, m_castItemLevel);
|
||||
if (m_spellAura != null)
|
||||
{
|
||||
// Set aura stack amount to desired value
|
||||
@@ -7121,7 +7121,7 @@ namespace Game.Spells
|
||||
if ((m_spellValue.CustomBasePointsMask & (1 << (int)i)) != 0)
|
||||
basePoint = m_spellValue.EffectBasePoints[i];
|
||||
|
||||
return m_caster.CalculateSpellDamage(target, m_spellInfo, i, basePoint, m_castItemLevel);
|
||||
return m_caster.CalculateSpellDamage(target, m_spellInfo, i, basePoint, m_castItemEntry, m_castItemLevel);
|
||||
}
|
||||
int CalculateDamage(uint i, Unit target, out float variance)
|
||||
{
|
||||
@@ -7129,7 +7129,7 @@ namespace Game.Spells
|
||||
if ((m_spellValue.CustomBasePointsMask & (1 << (int)i)) != 0)
|
||||
basePoint = m_spellValue.EffectBasePoints[i];
|
||||
|
||||
return m_caster.CalculateSpellDamage(target, m_spellInfo, i, out variance, basePoint, m_castItemLevel);
|
||||
return m_caster.CalculateSpellDamage(target, m_spellInfo, i, out variance, basePoint, m_castItemEntry, m_castItemLevel);
|
||||
}
|
||||
public SpellState GetState()
|
||||
{
|
||||
@@ -7566,7 +7566,7 @@ namespace Game.Spells
|
||||
Cypher.Assert(effects.Length <= SpellConst.MaxEffects);
|
||||
foreach (SpellEffectInfo effect in effects)
|
||||
if (effect != null)
|
||||
EffectBasePoints[effect.EffectIndex] = effect.CalcBaseValue(caster, null, -1);
|
||||
EffectBasePoints[effect.EffectIndex] = effect.CalcBaseValue(caster, null, 0, -1);
|
||||
|
||||
CustomBasePointsMask = 0;
|
||||
MaxAffectedTargets = proto.MaxAffectedTargets;
|
||||
|
||||
@@ -1223,7 +1223,7 @@ namespace Game.Spells
|
||||
if (!dynObj.CreateDynamicObject(caster.GetMap().GenerateLowGuid(HighGuid.DynamicObject), caster, m_spellInfo, destTarget, radius, DynamicObjectType.AreaSpell, m_SpellVisual))
|
||||
return;
|
||||
|
||||
Aura aura = Aura.TryCreate(m_spellInfo, m_castId, SpellConst.MaxEffectMask, dynObj, caster, m_spellValue.EffectBasePoints, null, ObjectGuid.Empty, ObjectGuid.Empty, m_castItemLevel);
|
||||
Aura aura = Aura.TryCreate(m_spellInfo, m_castId, SpellConst.MaxEffectMask, dynObj, caster, m_spellValue.EffectBasePoints, null, ObjectGuid.Empty, ObjectGuid.Empty, m_castItemEntry, m_castItemLevel);
|
||||
if (aura != null)
|
||||
{
|
||||
m_spellAura = aura;
|
||||
|
||||
@@ -3905,18 +3905,18 @@ namespace Game.Spells
|
||||
return IsAreaAuraEffect() || Effect == SpellEffectName.ApplyAura;
|
||||
}
|
||||
|
||||
public int CalcValue(Unit caster = null, int? bp = null, Unit target = null, int itemLevel = -1)
|
||||
public int CalcValue(Unit caster = null, int? bp = null, Unit target = null, uint castItemId = 0, int itemLevel = -1)
|
||||
{
|
||||
float throwAway;
|
||||
return CalcValue(out throwAway, caster, bp, target, itemLevel);
|
||||
return CalcValue(out throwAway, caster, bp, target, castItemId, itemLevel);
|
||||
}
|
||||
|
||||
public int CalcValue(out float variance, Unit caster = null, int? bp = null, Unit target = null, int itemLevel = -1)
|
||||
public int CalcValue(out float variance, Unit caster = null, int? bp = null, Unit target = null, uint castItemId = 0, int itemLevel = -1)
|
||||
{
|
||||
variance = 0.0f;
|
||||
float basePointsPerLevel = RealPointsPerLevel;
|
||||
// TODO: this needs to be a float, not rounded
|
||||
int basePoints = CalcBaseValue(caster, target, itemLevel);
|
||||
int basePoints = CalcBaseValue(caster, target, castItemId, itemLevel);
|
||||
float value = bp.HasValue ? bp.Value : BasePoints;
|
||||
float comboDamage = PointsPerResource;
|
||||
|
||||
@@ -3964,7 +3964,7 @@ namespace Game.Spells
|
||||
return (int)Math.Round(value);
|
||||
}
|
||||
|
||||
public int CalcBaseValue(Unit caster, Unit target, int itemLevel)
|
||||
public int CalcBaseValue(Unit caster, Unit target, uint itemId, int itemLevel)
|
||||
{
|
||||
if (Scaling.Coefficient != 0.0f)
|
||||
{
|
||||
@@ -4011,10 +4011,34 @@ namespace Game.Spells
|
||||
|
||||
if (_spellInfo.Scaling._Class == -7)
|
||||
{
|
||||
// todo: get inventorytype here
|
||||
GtCombatRatingsMultByILvlRecord ratingMult = CliDB.CombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel);
|
||||
GtGenericMultByILvlRecord ratingMult = CliDB.CombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel);
|
||||
if (ratingMult != null)
|
||||
tempValue *= ratingMult.ArmorMultiplier;
|
||||
{
|
||||
ItemSparseRecord itemSparse = CliDB.ItemSparseStorage.LookupByKey(itemId);
|
||||
if (itemSparse != null)
|
||||
tempValue *= CliDB.GetIlvlStatMultiplier(ratingMult, itemSparse.inventoryType);
|
||||
}
|
||||
}
|
||||
|
||||
if (IsAura(AuraType.ModRating))
|
||||
{
|
||||
GtGenericMultByILvlRecord ratingMult = CliDB.CombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel);
|
||||
if (ratingMult != null)
|
||||
{
|
||||
ItemSparseRecord itemSparse = CliDB.ItemSparseStorage.LookupByKey(itemId);
|
||||
if (itemSparse != null)
|
||||
tempValue *= CliDB.GetIlvlStatMultiplier(ratingMult, itemSparse.inventoryType);
|
||||
}
|
||||
else if (IsAura(AuraType.ModStat) && MiscValue == (int)Stats.Stamina)
|
||||
{
|
||||
GtGenericMultByILvlRecord staminaMult = CliDB.StaminaMultByILvlGameTable.GetRow(effectiveItemLevel);
|
||||
if (staminaMult != null)
|
||||
{
|
||||
ItemSparseRecord itemSparse = CliDB.ItemSparseStorage.LookupByKey(itemId);
|
||||
if (itemSparse != null)
|
||||
tempValue *= CliDB.GetIlvlStatMultiplier(staminaMult, itemSparse.inventoryType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4172,6 +4196,7 @@ namespace Game.Spells
|
||||
case SpellEffectName.ApplyAreaAuraOwner:
|
||||
case SpellEffectName.ApllyAuraOnPet:
|
||||
case SpellEffectName.Unk202:
|
||||
case SpellEffectName.ApplyAreaAuraPartyNonrandom:
|
||||
switch (ApplyAuraName)
|
||||
{
|
||||
case AuraType.PeriodicDamage:
|
||||
|
||||
Reference in New Issue
Block a user