diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 3 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPacketsCommon.cpp | 9 |
4 files changed, 25 insertions, 20 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 9881945a825..105a780beca 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1226,20 +1226,22 @@ void Creature::SelectLevel() { CreatureTemplate const* cInfo = GetCreatureTemplate(); - if (!HasScalableLevels()) - { - // level - uint8 minlevel = std::min(cInfo->maxlevel, cInfo->minlevel); - uint8 maxlevel = std::max(cInfo->maxlevel, cInfo->minlevel); - uint8 level = minlevel == maxlevel ? minlevel : urand(minlevel, maxlevel); - SetLevel(level); - } - else + // level + uint8 minlevel = std::min(cInfo->maxlevel, cInfo->minlevel); + uint8 maxlevel = std::max(cInfo->maxlevel, cInfo->minlevel); + uint8 level = minlevel == maxlevel ? minlevel : urand(minlevel, maxlevel); + SetLevel(level); + + if (HasScalableLevels()) { - SetLevel(cInfo->levelScaling->MaxLevel); SetUInt32Value(UNIT_FIELD_SCALING_LEVEL_MIN, cInfo->levelScaling->MinLevel); SetUInt32Value(UNIT_FIELD_SCALING_LEVEL_MAX, cInfo->levelScaling->MaxLevel); - SetUInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA, cInfo->levelScaling->DeltaLevel); + + int8 mindelta = std::min(cInfo->levelScaling->DeltaLevelMax, cInfo->levelScaling->DeltaLevelMin); + int8 maxdelta = std::max(cInfo->levelScaling->DeltaLevelMax, cInfo->levelScaling->DeltaLevelMin); + int8 delta = mindelta == maxdelta ? mindelta : irand(mindelta, maxdelta); + + SetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA, delta); } UpdateLevelDependantStats(); @@ -2566,7 +2568,7 @@ uint8 Creature::GetLevelForTarget(WorldObject const* target) const // between UNIT_FIELD_SCALING_LEVEL_MIN and UNIT_FIELD_SCALING_LEVEL_MAX if (HasScalableLevels()) { - uint8 targetLevelWithDelta = unitTarget->getLevel() + GetCreatureTemplate()->levelScaling->DeltaLevel; + uint8 targetLevelWithDelta = unitTarget->getLevel() + GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA); if (target->IsPlayer()) targetLevelWithDelta += target->GetUInt32Value(PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA); diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index fddbc672542..e1d0fea528e 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -296,7 +296,8 @@ struct CreatureLevelScaling { uint16 MinLevel; uint16 MaxLevel; - int16 DeltaLevel; + int16 DeltaLevelMin; + int16 DeltaLevelMax; }; // from `creature_template` table diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 07d13c1d303..713a7a04343 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -634,8 +634,8 @@ void ObjectMgr::LoadCreatureScalingData() { uint32 oldMSTime = getMSTime(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT Entry, LevelScalingMin, LevelScalingMax, LevelScalingDelta FROM creature_template_scaling"); + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT Entry, LevelScalingMin, LevelScalingMax, LevelScalingDeltaMin, LevelScalingDeltaMax FROM creature_template_scaling"); if (!result) { @@ -660,7 +660,8 @@ void ObjectMgr::LoadCreatureScalingData() CreatureLevelScaling creatureLevelScaling; creatureLevelScaling.MinLevel = fields[1].GetUInt16(); creatureLevelScaling.MaxLevel = fields[2].GetUInt16(); - creatureLevelScaling.DeltaLevel = fields[3].GetInt16(); + creatureLevelScaling.DeltaLevelMin = fields[3].GetInt16(); + creatureLevelScaling.DeltaLevelMax = fields[4].GetInt16(); itr->second.levelScaling = creatureLevelScaling; ++count; diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index ff378e680e0..e2f18ace45e 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -71,7 +71,7 @@ namespace WorldPackets Class = creatureTemplate->unit_class; TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel); TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel); - TargetScalingLevelDelta = int8(creatureTemplate->levelScaling->DeltaLevel); + TargetScalingLevelDelta = int8(attacker->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA)); return true; } @@ -88,14 +88,15 @@ namespace WorldPackets Class = creatureTemplate->unit_class; TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel); TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel); - TargetScalingLevelDelta = int8(creatureTemplate->levelScaling->DeltaLevel); + TargetScalingLevelDelta = int8(target->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA)); return true; } template<> bool SandboxScalingData::GenerateDataForUnits<Creature, Creature>(Creature* attacker, Creature* target) { - CreatureTemplate const* creatureTemplate = target->HasScalableLevels() ? target->GetCreatureTemplate() : attacker->GetCreatureTemplate(); + Creature* accessor = target->HasScalableLevels() ? target : attacker; + CreatureTemplate const* creatureTemplate = accessor->GetCreatureTemplate(); Type = TYPE_CREATURE_TO_CREATURE_DAMAGE; PlayerLevelDelta = 0; @@ -105,7 +106,7 @@ namespace WorldPackets Class = creatureTemplate->unit_class; TargetMinScalingLevel = uint8(creatureTemplate->levelScaling->MinLevel); TargetMaxScalingLevel = uint8(creatureTemplate->levelScaling->MaxLevel); - TargetScalingLevelDelta = int8(creatureTemplate->levelScaling->DeltaLevel); + TargetScalingLevelDelta = int8(accessor->GetInt32Value(UNIT_FIELD_SCALING_LEVEL_DELTA)); return true; } |