Core/Spells: Fixed spell effect value truncation when value is a large integer

Port From (https://github.com/TrinityCore/TrinityCore/commit/2d205506bfd3a2bb253db73b121fd147928811ba)
This commit is contained in:
hondacrx
2022-12-28 15:31:42 -05:00
parent 989b80b056
commit 3fcafdfa80
3 changed files with 17 additions and 7 deletions
+1 -1
View File
@@ -1827,7 +1827,7 @@ namespace Game.Entities
return spellInfo.GetMinRange(!IsHostileTo(target)); return spellInfo.GetMinRange(!IsHostileTo(target));
} }
public float ApplyEffectModifiers(SpellInfo spellInfo, uint effIndex, float value) public double ApplyEffectModifiers(SpellInfo spellInfo, uint effIndex, double value)
{ {
Player modOwner = GetSpellModOwner(); Player modOwner = GetSpellModOwner();
if (modOwner != null) if (modOwner != null)
@@ -2765,6 +2765,16 @@ namespace Game.Entities
basevalue = (float)(basevalue + totalflat) * totalmul; basevalue = (float)(basevalue + totalflat) * totalmul;
} }
public void ApplySpellMod(SpellInfo spellInfo, SpellModOp op, ref double basevalue, Spell spell = null)
{
float totalmul = 1.0f;
int totalflat = 0;
GetSpellModValues(spellInfo, op, spell, basevalue, ref totalflat, ref totalmul);
basevalue = (double)(basevalue + totalflat) * totalmul;
}
public void GetSpellModValues<T>(SpellInfo spellInfo, SpellModOp op, Spell spell, T baseValue, ref int flat, ref float pct) where T : IComparable public void GetSpellModValues<T>(SpellInfo spellInfo, SpellModOp op, Spell spell, T baseValue, ref int flat, ref float pct) where T : IComparable
{ {
flat = 0; flat = 0;
+6 -6
View File
@@ -4171,11 +4171,11 @@ namespace Game.Spells
public int CalcValue(out float variance, WorldObject caster = null, int? bp = null, Unit target = null, uint castItemId = 0, int itemLevel = -1) public int CalcValue(out float variance, WorldObject caster = null, int? bp = null, Unit target = null, uint castItemId = 0, int itemLevel = -1)
{ {
variance = 0.0f; variance = 0.0f;
float basePointsPerLevel = RealPointsPerLevel; double basePointsPerLevel = RealPointsPerLevel;
// TODO: this needs to be a float, not rounded // TODO: this needs to be a float, not rounded
int basePoints = CalcBaseValue(caster, target, castItemId, itemLevel); int basePoints = CalcBaseValue(caster, target, castItemId, itemLevel);
float value = bp.HasValue ? bp.Value : basePoints; double value = bp.HasValue ? bp.Value : basePoints;
float comboDamage = PointsPerResource; double comboDamage = PointsPerResource;
Unit casterUnit = null; Unit casterUnit = null;
if (caster != null) if (caster != null)
@@ -4184,9 +4184,9 @@ namespace Game.Spells
if (Scaling.Variance != 0) if (Scaling.Variance != 0)
{ {
float delta = Math.Abs(Scaling.Variance * 0.5f); float delta = Math.Abs(Scaling.Variance * 0.5f);
float valueVariance = RandomHelper.FRand(-delta, delta); double valueVariance = RandomHelper.FRand(-delta, delta);
value += basePoints * valueVariance; value += (double)basePoints * valueVariance;
variance = valueVariance; variance = (float)valueVariance;
} }
// base amount modification based on spell lvl vs caster lvl // base amount modification based on spell lvl vs caster lvl