Core/Spells: Fixed spell scaling problems with CastTimeMin > CastTimeMax, also minor cleanup

This commit is contained in:
Shauren
2012-08-22 16:50:42 +02:00
parent 4ee7558aa2
commit 5b19f8672c
3 changed files with 26 additions and 39 deletions

View File

@@ -2006,16 +2006,16 @@ typedef std::map<uint32, SpellReagent> SpellReagentMap;
// SpellScaling.dbc
struct SpellScalingEntry
{
//uint32 Id; // 0 m_ID
int32 castTimeMin; // 1
int32 castTimeMax; // 2
uint32 castScalingMaxLevel; // 3
uint32 playerClass; // 4 (index * 100) + charLevel => gtSpellScaling.dbc
//uint32 Id; // 0 m_ID
int32 CastTimeMin; // 1
int32 CastTimeMax; // 2
int32 CastTimeMaxLevel; // 3
int32 ScalingClass; // 4 (index * 100) + charLevel - 1 => gtSpellScaling.dbc
float Multiplier[3]; // 5-7
float RandomMultiplier[3]; // 8-10
float OtherMultiplier[3]; // 11-13
float CoefBase; // 14 some coefficient, mostly 1.0f
uint32 CoefLevelBase; // 15 some level
int32 CoefLevelBase; // 15 some level
};
struct SpellDurationEntry

View File

@@ -417,18 +417,17 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster, int32 const* bp, Unit const
{
if (caster)
{
uint32 level = caster->getLevel();
int32 level = caster->getLevel();
if (target && _spellInfo->IsPositiveEffect(_effIndex) && (Effect == SPELL_EFFECT_APPLY_AURA))
level = target->getLevel();
SpellScalingEntry const* scaling = _spellInfo->GetSpellScaling(); // must exist, otherwise ScalingMultiplier == 0.0f
if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.LookupEntry((scaling->playerClass != -1 ? scaling->playerClass - 1 : MAX_CLASSES - 1) * 100 + level - 1))
if (GtSpellScalingEntry const* gtScaling = sGtSpellScalingStore.LookupEntry((_spellInfo->ScalingClass != -1 ? _spellInfo->ScalingClass - 1 : MAX_CLASSES - 1) * 100 + level - 1))
{
float multiplier = gtScaling->value;
if (scaling->castTimeMax > 0 && scaling->castScalingMaxLevel > level)
multiplier *= float(scaling->castTimeMin + (level - 1) * (scaling->castTimeMax - scaling->castTimeMin) / (scaling->castScalingMaxLevel - 1)) / float(scaling->castTimeMax);
if (scaling->CoefLevelBase > level)
multiplier *= (1.0f - scaling->CoefBase) * (float)(level - 1) / (float)(scaling->CoefLevelBase - 1) + scaling->CoefBase;
if (_spellInfo->CastTimeMax > 0 && _spellInfo->CastTimeMaxLevel > level)
multiplier *= float(_spellInfo->CastTimeMin + (level - 1) * (_spellInfo->CastTimeMax - _spellInfo->CastTimeMin) / (_spellInfo->CastTimeMaxLevel - 1)) / float(_spellInfo->CastTimeMax);
if (_spellInfo->CoefLevelBase > level)
multiplier *= (1.0f - _spellInfo->CoefBase) * (float)(level - 1) / (float)(_spellInfo->CoefLevelBase - 1) + _spellInfo->CoefBase;
float preciseBasePoints = ScalingMultiplier * multiplier;
if (DeltaScalingMultiplier)
@@ -804,16 +803,10 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry)
// SpellScalingEntry
SpellScalingEntry const* _scaling = GetSpellScaling();
castTimeMin = _scaling ? _scaling->castTimeMin : 0;
castTimeMax = _scaling ?_scaling->castTimeMax : 0;
castScalingMaxLevel = _scaling ? _scaling->castScalingMaxLevel : 0;
playerClass = _scaling ? _scaling->playerClass : 0;
for (uint8 i = 0; i < 3; ++i)
{
Multiplier[i] = _scaling ? _scaling->Multiplier[i] : 0;
RandomMultiplier[i] = _scaling ? _scaling->RandomMultiplier[i] : 0;
OtherMultiplier[i] = _scaling ? _scaling->OtherMultiplier[i] : 0;
}
CastTimeMin = _scaling ? _scaling->CastTimeMin : 0;
CastTimeMax = _scaling ?_scaling->CastTimeMax : 0;
CastTimeMaxLevel = _scaling ? _scaling->CastTimeMaxLevel : 0;
ScalingClass = _scaling ? _scaling->ScalingClass : 0;
CoefBase = _scaling ? _scaling->CoefBase : 0;
CoefLevelBase = _scaling ? _scaling->CoefLevelBase : 0;
@@ -2092,15 +2085,11 @@ uint32 SpellInfo::CalcCastTime(Unit* caster, Spell* spell) const
int32 castTime = 0;
// not all spells have cast time index and this is all is pasiive abilities
SpellScalingEntry const* scaling = GetSpellScaling();
if (scaling && caster)
if (caster && CastTimeMax > 0)
{
if (scaling->castTimeMax > 0)
{
castTime = scaling->castTimeMax;
if (scaling->castScalingMaxLevel > caster->getLevel())
castTime = scaling->castTimeMin + (caster->getLevel() - 1) * (scaling->castTimeMax - scaling->castTimeMin) / (scaling->castScalingMaxLevel - 1);
}
castTime = CastTimeMax;
if (CastTimeMaxLevel > int32(caster->getLevel()))
castTime = CastTimeMin + int32(caster->getLevel() - 1) * (CastTimeMax - CastTimeMin) / (CastTimeMaxLevel - 1);
}
else if (CastTimeEntry)
castTime = CastTimeEntry->CastTime;

View File

@@ -251,6 +251,7 @@ public:
uint32 TriggerSpell;
flag96 SpellClassMask;
std::list<Condition*>* ImplicitTargetConditions;
// SpellScalingEntry
float ScalingMultiplier;
float DeltaScalingMultiplier;
float ComboScalingMultiplier;
@@ -383,15 +384,12 @@ public:
uint32 SpellTargetRestrictionsId;
uint32 SpellTotemsId;
// SpellScalingEntry
int32 castTimeMin;
int32 castTimeMax;
uint32 castScalingMaxLevel;
uint32 playerClass;
float Multiplier[3];
float RandomMultiplier[3];
float OtherMultiplier[3];
int32 CastTimeMin;
int32 CastTimeMax;
int32 CastTimeMaxLevel;
int32 ScalingClass;
float CoefBase;
uint32 CoefLevelBase;
int32 CoefLevelBase;
SpellEffectInfo Effects[MAX_SPELL_EFFECTS];
uint32 ExplicitTargetMask;
SpellChainNode const* ChainEntry;