From 820eea59498a940dec03815b92a757ca02648f06 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 24 May 2022 19:13:45 -0400 Subject: [PATCH] Core/Creature: Add new db field InteractionPauseTimer Port From (https://github.com/TrinityCore/TrinityCore/commit/5180abfb19b9c1c4f2df2fbfa918a62f1c4ae995) --- .../Database/Databases/WorldDatabase.cs | 2 +- Source/Game/Entities/Creature/CreatureData.cs | 8 ++- Source/Game/Globals/ObjectManager.cs | 64 +++++++++++-------- Source/Game/Handlers/BattleGroundHandler.cs | 4 +- Source/Game/Handlers/NPCHandler.cs | 8 ++- Source/Game/Handlers/QuestHandler.cs | 4 +- 6 files changed, 59 insertions(+), 31 deletions(-) diff --git a/Source/Framework/Database/Databases/WorldDatabase.cs b/Source/Framework/Database/Databases/WorldDatabase.cs index e36b83127..685698ca3 100644 --- a/Source/Framework/Database/Databases/WorldDatabase.cs +++ b/Source/Framework/Database/Databases/WorldDatabase.cs @@ -75,7 +75,7 @@ namespace Framework.Database PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?"); PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command"); - PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?"); + PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?"); PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?"); PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?"); PrepareStatement(WorldStatements.SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_"); diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index aa1c609b3..a19fdd52c 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -354,6 +354,7 @@ namespace Game.Entities public bool Rooted; public CreatureChaseMovementType Chase; public CreatureRandomMovementType Random; + public uint InteractionPauseTimer; public CreatureMovementData() { @@ -361,6 +362,9 @@ namespace Game.Entities Flight = CreatureFlightMovementType.None; Swim = true; Rooted = false; + Chase = CreatureChaseMovementType.Run; + Random = CreatureRandomMovementType.Walk; + InteractionPauseTimer = WorldConfig.GetIntValue(WorldCfg.CreatureStopForPlayer); } public bool IsGroundAllowed() { return Ground != CreatureGroundMovementType.None; } @@ -371,9 +375,11 @@ namespace Game.Entities public CreatureChaseMovementType GetChase() { return Chase; } public CreatureRandomMovementType GetRandom() { return Random; } + public uint GetInteractionPauseTimer() { return InteractionPauseTimer; } + public override string ToString() { - return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}, Chase: {Chase}, Random: {Random}"; + return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}, Chase: {Chase}, Random: {Random}, InteractionPauseTimer: {InteractionPauseTimer}"; } } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index fb98e6c55..8d42b9e39 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1841,24 +1841,27 @@ namespace Game if (!fields.IsNull(51)) creature.Movement.Random = (CreatureRandomMovementType)fields.Read(51); - creature.HoverHeight = fields.Read(52); - creature.ModHealth = fields.Read(53); - creature.ModHealthExtra = fields.Read(54); - creature.ModMana = fields.Read(55); - creature.ModManaExtra = fields.Read(56); - creature.ModArmor = fields.Read(57); - creature.ModDamage = fields.Read(58); - creature.ModExperience = fields.Read(59); - creature.RacialLeader = fields.Read(60); - creature.MovementId = fields.Read(61); - creature.CreatureDifficultyID = fields.Read(62); - creature.WidgetSetID = fields.Read(63); - creature.WidgetSetUnitConditionID = fields.Read(64); - creature.RegenHealth = fields.Read(65); - creature.MechanicImmuneMask = fields.Read(66); - creature.SpellSchoolImmuneMask = fields.Read(67); - creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(68); - creature.ScriptID = GetScriptId(fields.Read(69)); + if (!fields.IsNull(52)) + creature.Movement.InteractionPauseTimer = fields.Read(52); + + creature.HoverHeight = fields.Read(53); + creature.ModHealth = fields.Read(54); + creature.ModHealthExtra = fields.Read(55); + creature.ModMana = fields.Read(56); + creature.ModManaExtra = fields.Read(57); + creature.ModArmor = fields.Read(58); + creature.ModDamage = fields.Read(59); + creature.ModExperience = fields.Read(60); + creature.RacialLeader = fields.Read(61); + creature.MovementId = fields.Read(62); + creature.CreatureDifficultyID = fields.Read(63); + creature.WidgetSetID = fields.Read(64); + creature.WidgetSetUnitConditionID = fields.Read(65); + creature.RegenHealth = fields.Read(66); + creature.MechanicImmuneMask = fields.Read(67); + creature.SpellSchoolImmuneMask = fields.Read(68); + creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(69); + creature.ScriptID = GetScriptId(fields.Read(70)); creatureTemplateStorage[entry] = creature; } @@ -2346,7 +2349,10 @@ namespace Game creatureMovementOverrides.Clear(); - SQLResult result = DB.World.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 + SQLResult result = DB.World.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.IsEmpty()) { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!"); @@ -2363,12 +2369,20 @@ namespace Game } CreatureMovementData movement = new(); - movement.Ground = (CreatureGroundMovementType)result.Read(1); - movement.Swim = result.Read(2); - movement.Flight = (CreatureFlightMovementType)result.Read(3); - movement.Rooted = result.Read(4); - movement.Chase = (CreatureChaseMovementType)result.Read(5); - movement.Random = (CreatureRandomMovementType)result.Read(6); + if (!result.IsNull(1)) + movement.Ground = (CreatureGroundMovementType)result.Read(1); + if (!result.IsNull(2)) + movement.Swim = result.Read(2); + if (!result.IsNull(3)) + movement.Flight = (CreatureFlightMovementType)result.Read(3); + if (!result.IsNull(4)) + movement.Rooted = result.Read(4); + if (!result.IsNull(5)) + movement.Chase = (CreatureChaseMovementType)result.Read(5); + if (!result.IsNull(6)) + movement.Random = (CreatureRandomMovementType)result.Read(6); + if (!result.IsNull(7)) + movement.InteractionPauseTimer = result.Read(7); CheckCreatureMovement("creature_movement_override", spawnId, movement); diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 09ba390da..8ee875ce5 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -39,7 +39,9 @@ namespace Game return; // Stop the npc if moving - unit.PauseMovement(WorldConfig.GetUIntValue(WorldCfg.CreatureStopForPlayer)); + uint pause = unit.GetMovementTemplate().GetInteractionPauseTimer(); + if (pause != 0) + unit.PauseMovement(pause); unit.SetHomePosition(unit.GetPosition()); BattlegroundTypeId bgTypeId = Global.BattlegroundMgr.GetBattleMasterBG(unit.GetEntry()); diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index c1b95e50c..cd6d00866 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -144,7 +144,9 @@ namespace Game GetPlayer().RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.Interacting); // Stop the npc if moving - unit.PauseMovement(WorldConfig.GetUIntValue(WorldCfg.CreatureStopForPlayer)); + uint pause = unit.GetMovementTemplate().GetInteractionPauseTimer(); + if (pause != 0) + unit.PauseMovement(pause); unit.SetHomePosition(unit.GetPosition()); // If spiritguide, no need for gossip menu, just put player into resurrect queue @@ -601,7 +603,9 @@ namespace Game GetPlayer().RemoveAurasByType(AuraType.FeignDeath); // Stop the npc if moving - vendor.PauseMovement(WorldConfig.GetUIntValue(WorldCfg.CreatureStopForPlayer)); + uint pause = vendor.GetMovementTemplate().GetInteractionPauseTimer(); + if (pause != 0) + vendor.PauseMovement(pause); vendor.SetHomePosition(vendor.GetPosition()); VendorItemData vendorItems = vendor.GetVendorItems(); diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index cff33e6b3..47e31d8e9 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -73,7 +73,9 @@ namespace Game GetPlayer().RemoveAurasByType(AuraType.FeignDeath); // Stop the npc if moving - creature.PauseMovement(WorldConfig.GetUIntValue(WorldCfg.CreatureStopForPlayer)); + uint pause = creature.GetMovementTemplate().GetInteractionPauseTimer(); + if (pause != 0) + creature.PauseMovement(pause); creature.SetHomePosition(creature.GetPosition()); _player.PlayerTalkClass.ClearMenus();