From a22bc236ebc038c723774e5b38cd93e814ccc43d Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Fri, 22 Jan 2021 19:48:50 +0100 Subject: Core/Creature: Add new db field InteractionPauseTimer (#25880) * Core/Creature: Add new db field InteractionPauseTimer Add new db field InteractionPauseTimer to allow to define different interaction pause timers for each creature (the previous system was a global setting in worldserver.conf Creature.MovingStopTimeForPlayer) * Set all columns in creature_template_movement as optional (can be NULL, default NULL). Fill only the columns that should override the default C++ value * Use the InteractionPauseTimer value throughout the code instead of Creature.MovingStopTimeForPlayer * Handle InteractionPauseTimer set to 0 as "don't stop at all" * Implement InteractionPauseTimer in creature_movement_override creature_movement_override allows NULL values, in which case the values from creature_template_movement will be used for those columns that are NULL, falling back to default C++ values if creature_template_movement has NULL values too (or no rows for the creature) * Read default InteractionPauseTimer from worldserver.conf * Rename 2021_99_99_99_world.sql to 2021_01_22_00_world.sql --- src/server/game/Globals/ObjectMgr.cpp | 89 ++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 32 deletions(-) (limited to 'src/server/game/Globals/ObjectMgr.cpp') diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index db4a45d5011..d68a07234f3 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -468,30 +468,32 @@ void ObjectMgr::LoadCreatureTemplates() // 49 "ctm.Random," // 50 - "HoverHeight," + "ctm.InteractionPauseTimer," // 51 - "HealthModifier," + "HoverHeight," // 52 - "ManaModifier," + "HealthModifier," // 53 - "ArmorModifier," + "ManaModifier," // 54 - "DamageModifier," + "ArmorModifier," // 55 - "ExperienceModifier," + "DamageModifier," // 56 - "RacialLeader," + "ExperienceModifier," // 57 - "movementId," + "RacialLeader," // 58 - "RegenHealth," + "movementId," // 59 - "mechanic_immune_mask," + "RegenHealth," // 60 - "spell_school_immune_mask," + "mechanic_immune_mask," // 61 - "flags_extra," + "spell_school_immune_mask," // 62 + "flags_extra," + // 63 "ScriptName" " FROM creature_template ct" " LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId"); @@ -595,20 +597,23 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) if (!fields[49].IsNull()) creatureTemplate.Movement.Random = static_cast(fields[49].GetUInt8()); - creatureTemplate.HoverHeight = fields[50].GetFloat(); - creatureTemplate.ModHealth = fields[51].GetFloat(); - creatureTemplate.ModMana = fields[52].GetFloat(); - creatureTemplate.ModArmor = fields[53].GetFloat(); - creatureTemplate.ModDamage = fields[54].GetFloat(); - creatureTemplate.ModExperience = fields[55].GetFloat(); - creatureTemplate.RacialLeader = fields[56].GetBool(); + if (!fields[50].IsNull()) + creatureTemplate.Movement.InteractionPauseTimer = fields[50].GetUInt32(); + + creatureTemplate.HoverHeight = fields[51].GetFloat(); + creatureTemplate.ModHealth = fields[52].GetFloat(); + creatureTemplate.ModMana = fields[53].GetFloat(); + creatureTemplate.ModArmor = fields[54].GetFloat(); + creatureTemplate.ModDamage = fields[55].GetFloat(); + creatureTemplate.ModExperience = fields[56].GetFloat(); + creatureTemplate.RacialLeader = fields[57].GetBool(); - creatureTemplate.movementId = fields[57].GetUInt32(); - creatureTemplate.RegenHealth = fields[58].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[59].GetUInt32(); - creatureTemplate.SpellSchoolImmuneMask = fields[60].GetUInt32(); - creatureTemplate.flags_extra = fields[61].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[62].GetString()); + creatureTemplate.movementId = fields[58].GetUInt32(); + creatureTemplate.RegenHealth = fields[59].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[60].GetUInt32(); + creatureTemplate.SpellSchoolImmuneMask = fields[61].GetUInt32(); + creatureTemplate.flags_extra = fields[62].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[63].GetString()); } void ObjectMgr::LoadCreatureTemplateResistances() @@ -1531,7 +1536,19 @@ void ObjectMgr::LoadCreatureMovementOverrides() _creatureMovementOverrides.clear(); - QueryResult result = WorldDatabase.Query("SELECT SpawnId, Ground, Swim, Flight, Rooted, Chase, Random from creature_movement_override"); + // 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.Chase, ctm.Chase)," + "COALESCE(cmo.Random, ctm.Random)," + "COALESCE(cmo.InteractionPauseTimer, ctm.InteractionPauseTimer) " + "FROM creature_movement_override AS cmo " + "LEFT JOIN creature AS c ON c.guid = cmo.SpawnId " + "LEFT JOIN creature_template_movement AS ctm ON ctm.CreatureId = c.id"); if (!result) { @@ -1550,12 +1567,20 @@ void ObjectMgr::LoadCreatureMovementOverrides() } CreatureMovementData& movement = _creatureMovementOverrides[spawnId]; - movement.Ground = static_cast(fields[1].GetUInt8()); - movement.Swim = fields[2].GetBool(); - movement.Flight = static_cast(fields[3].GetUInt8()); - movement.Rooted = fields[4].GetBool(); - movement.Chase = static_cast(fields[5].GetUInt8()); - movement.Random = static_cast(fields[6].GetUInt8()); + if (!fields[1].IsNull()) + movement.Ground = static_cast(fields[1].GetUInt8()); + if (!fields[2].IsNull()) + movement.Swim = fields[2].GetBool(); + if (!fields[3].IsNull()) + movement.Flight = static_cast(fields[3].GetUInt8()); + if (!fields[4].IsNull()) + movement.Rooted = fields[4].GetBool(); + if (!fields[5].IsNull()) + movement.Chase = static_cast(fields[5].GetUInt8()); + if (!fields[6].IsNull()) + movement.Random = static_cast(fields[6].GetUInt8()); + if (!fields[7].IsNull()) + movement.InteractionPauseTimer = fields[7].GetUInt32(); CheckCreatureMovement("creature_movement_override", spawnId, movement); } -- cgit v1.2.3