aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp94
1 files changed, 37 insertions, 57 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 70c1d64c309..75b4da4172c 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -363,13 +363,13 @@ void ObjectMgr::LoadCreatureTemplates()
// "unit_class, unit_flags, unit_flags2, unit_flags3, "
// 25 26 27 28 29 30
// "family, trainer_class, type, VehicleId, AIName, MovementType, "
- // 31 32 33 34 35 36 37 38
- // "ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, ExperienceModifier, "
- // 39 40 41 42 43
+ // 31 32 33 34 35
+ // "ctm.HoverInitiallyEnabled, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, ExperienceModifier, "
+ // 36 37 38 39 40
// "RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, "
- // 44 45
+ // 41 42
// "CreatureImmunitiesId, flags_extra, "
- // 46 47
+ // 43 44
// "ScriptName, StringId FROM creature_template WHERE entry = ? OR 1 = ?");
WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEMPLATE);
@@ -448,37 +448,29 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
creatureTemplate.VehicleId = fields[28].GetUInt32();
creatureTemplate.AIName = fields[29].GetString();
creatureTemplate.MovementType = uint32(fields[30].GetUInt8());
+
if (!fields[31].IsNull())
- creatureTemplate.Movement.Ground = static_cast<CreatureGroundMovementType>(fields[31].GetUInt8());
+ creatureTemplate.Movement.HoverInitiallyEnabled = fields[31].GetBool();
if (!fields[32].IsNull())
- creatureTemplate.Movement.Swim = fields[32].GetBool();
+ creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(fields[32].GetUInt8());
if (!fields[33].IsNull())
- creatureTemplate.Movement.Flight = static_cast<CreatureFlightMovementType>(fields[33].GetUInt8());
+ creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(fields[33].GetUInt8());
if (!fields[34].IsNull())
- creatureTemplate.Movement.Rooted = fields[34].GetBool();
-
- if (!fields[35].IsNull())
- creatureTemplate.Movement.Chase = static_cast<CreatureChaseMovementType>(fields[35].GetUInt8());
-
- if (!fields[36].IsNull())
- creatureTemplate.Movement.Random = static_cast<CreatureRandomMovementType>(fields[36].GetUInt8());
+ creatureTemplate.Movement.InteractionPauseTimer = fields[34].GetUInt32();
- if (!fields[37].IsNull())
- creatureTemplate.Movement.InteractionPauseTimer = fields[37].GetUInt32();
-
- creatureTemplate.ModExperience = fields[38].GetFloat();
- creatureTemplate.RacialLeader = fields[39].GetBool();
- creatureTemplate.movementId = fields[40].GetUInt32();
- creatureTemplate.WidgetSetID = fields[41].GetInt32();
- creatureTemplate.WidgetSetUnitConditionID = fields[42].GetInt32();
- creatureTemplate.RegenHealth = fields[43].GetBool();
- creatureTemplate.CreatureImmunitiesId = fields[44].GetInt32();
- creatureTemplate.flags_extra = fields[45].GetUInt32();
- creatureTemplate.ScriptID = GetScriptId(fields[46].GetString());
- creatureTemplate.StringId = fields[47].GetString();
+ creatureTemplate.ModExperience = fields[35].GetFloat();
+ creatureTemplate.RacialLeader = fields[36].GetBool();
+ creatureTemplate.movementId = fields[37].GetUInt32();
+ creatureTemplate.WidgetSetID = fields[38].GetInt32();
+ creatureTemplate.WidgetSetUnitConditionID = fields[39].GetInt32();
+ creatureTemplate.RegenHealth = fields[40].GetBool();
+ creatureTemplate.CreatureImmunitiesId = fields[41].GetInt32();
+ creatureTemplate.flags_extra = fields[42].GetUInt32();
+ creatureTemplate.ScriptID = GetScriptId(fields[43].GetString());
+ creatureTemplate.StringId = fields[44].GetString();
}
void ObjectMgr::LoadCreatureTemplateGossip()
@@ -1171,20 +1163,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
void ObjectMgr::CheckCreatureMovement(char const* table, uint64 id, CreatureMovementData& creatureMovement)
{
- if (creatureMovement.Ground >= CreatureGroundMovementType::Max)
- {
- TC_LOG_ERROR("sql.sql", "`{}`.`Ground` wrong value ({}) for Id {}, setting to Run.",
- table, uint32(creatureMovement.Ground), id);
- creatureMovement.Ground = CreatureGroundMovementType::Run;
- }
-
- if (creatureMovement.Flight >= CreatureFlightMovementType::Max)
- {
- TC_LOG_ERROR("sql.sql", "`{}`.`Flight` wrong value ({}) for Id {}, setting to None.",
- table, uint32(creatureMovement.Flight), id);
- creatureMovement.Flight = CreatureFlightMovementType::None;
- }
-
if (creatureMovement.Chase >= CreatureChaseMovementType::Max)
{
TC_LOG_ERROR("sql.sql", "`{}`.`Chase` wrong value ({}) for Id {}, setting to Run.",
@@ -1581,10 +1559,7 @@ void ObjectMgr::LoadCreatureMovementOverrides()
// Load the data from creature_movement_override and if NULL fallback to creature_template_movement
QueryResult result = WorldDatabase.Query(
"SELECT cmo.SpawnId,"
- "COALESCE(cmo.Ground, ctm.Ground),"
- "COALESCE(cmo.Swim, ctm.Swim),"
- "COALESCE(cmo.Flight, ctm.Flight),"
- "COALESCE(cmo.Rooted, ctm.Rooted),"
+ "COALESCE(cmo.HoverInitiallyEnabled, ctm.HoverInitiallyEnabled),"
"COALESCE(cmo.Chase, ctm.Chase),"
"COALESCE(cmo.Random, ctm.Random),"
"COALESCE(cmo.InteractionPauseTimer, ctm.InteractionPauseTimer) "
@@ -1610,19 +1585,13 @@ void ObjectMgr::LoadCreatureMovementOverrides()
CreatureMovementData& movement = _creatureMovementOverrides[spawnId];
if (!fields[1].IsNull())
- movement.Ground = static_cast<CreatureGroundMovementType>(fields[1].GetUInt8());
+ movement.HoverInitiallyEnabled = fields[1].GetBool();
if (!fields[2].IsNull())
- movement.Swim = fields[2].GetBool();
+ movement.Chase = static_cast<CreatureChaseMovementType>(fields[2].GetUInt8());
if (!fields[3].IsNull())
- movement.Flight = static_cast<CreatureFlightMovementType>(fields[3].GetUInt8());
+ movement.Random = static_cast<CreatureRandomMovementType>(fields[3].GetUInt8());
if (!fields[4].IsNull())
- movement.Rooted = fields[4].GetBool();
- if (!fields[5].IsNull())
- movement.Chase = static_cast<CreatureChaseMovementType>(fields[5].GetUInt8());
- if (!fields[6].IsNull())
- movement.Random = static_cast<CreatureRandomMovementType>(fields[6].GetUInt8());
- if (!fields[7].IsNull())
- movement.InteractionPauseTimer = fields[7].GetUInt32();
+ movement.InteractionPauseTimer = fields[4].GetUInt32();
CheckCreatureMovement("creature_movement_override", spawnId, movement);
}
@@ -1659,7 +1628,7 @@ CreatureModel const* ObjectMgr::ChooseDisplayId(CreatureTemplate const* cinfo, C
return cinfo->GetFirstInvisibleModel();
}
-void ObjectMgr::ChooseCreatureFlags(CreatureTemplate const* cInfo, uint64* npcFlags, uint32* unitFlags, uint32* unitFlags2, uint32* unitFlags3, CreatureData const* data /*= nullptr*/)
+void ObjectMgr::ChooseCreatureFlags(CreatureTemplate const* cInfo, uint64* npcFlags, uint32* unitFlags, uint32* unitFlags2, uint32* unitFlags3, CreatureStaticFlagsHolder const& staticFlags, CreatureData const* data /*= nullptr*/)
{
#define ChooseCreatureFlagSource(field) ((data && data->field.has_value()) ? *data->field : cInfo->field)
@@ -1667,10 +1636,21 @@ void ObjectMgr::ChooseCreatureFlags(CreatureTemplate const* cInfo, uint64* npcFl
*npcFlags = ChooseCreatureFlagSource(npcflag);
if (unitFlags)
+ {
*unitFlags = ChooseCreatureFlagSource(unit_flags);
+ if (staticFlags.HasFlag(CREATURE_STATIC_FLAG_CAN_SWIM))
+ *unitFlags |= UNIT_FLAG_CAN_SWIM;
+
+ if (staticFlags.HasFlag(CREATURE_STATIC_FLAG_3_CANNOT_SWIM))
+ *unitFlags |= UNIT_FLAG_CANT_SWIM;
+ }
if (unitFlags2)
+ {
*unitFlags2 = ChooseCreatureFlagSource(unit_flags2);
+ if (staticFlags.HasFlag(CREATURE_STATIC_FLAG_3_CANNOT_TURN))
+ *unitFlags2 |= UNIT_FLAG2_CANNOT_TURN;
+ }
if (unitFlags3)
*unitFlags3 = ChooseCreatureFlagSource(unit_flags3);