From 9cdccb9a087e3674bfee025c0fa6c27d714f62d0 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 29 Nov 2021 13:29:51 -0500 Subject: [PATCH] Core/Movement: Allow using walk when chasing v2 Port From (https://github.com/TrinityCore/TrinityCore/commit/956158d299b3264f883f49ac647154179182fbea) --- Source/Framework/Constants/CreatureConst.cs | 9 ++++ .../Database/Databases/WorldDatabase.cs | 2 +- Source/Game/Entities/Creature/CreatureData.cs | 5 +- Source/Game/Globals/ObjectManager.cs | 48 +++++++++++-------- .../Generators/ChaseMovementGenerator.cs | 25 ++++++++-- Source/Game/Movement/MotionMaster.cs | 4 +- ...021_11_24_06_world_2019_03_02_00_world.sql | 7 +++ 7 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 sql/updates/world/master/2021_11_24_06_world_2019_03_02_00_world.sql diff --git a/Source/Framework/Constants/CreatureConst.cs b/Source/Framework/Constants/CreatureConst.cs index 41c86b778..2ec8fbe7a 100644 --- a/Source/Framework/Constants/CreatureConst.cs +++ b/Source/Framework/Constants/CreatureConst.cs @@ -398,6 +398,15 @@ namespace Framework.Constants Max } + public enum CreatureChaseMovementType + { + Run, + CanWalk, + AlwaysWalk, + + Max + } + public enum VendorInventoryReason { None = 0, diff --git a/Source/Framework/Database/Databases/WorldDatabase.cs b/Source/Framework/Database/Databases/WorldDatabase.cs index da99f4310..d3e05ae1d 100644 --- a/Source/Framework/Database/Databases/WorldDatabase.cs +++ b/Source/Framework/Database/Databases/WorldDatabase.cs @@ -76,7 +76,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, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, 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, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, 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 f12b3e5ae..c53bd9f69 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -352,6 +352,7 @@ namespace Game.Entities public CreatureFlightMovementType Flight; public bool Swim; public bool Rooted; + public CreatureChaseMovementType Chase; public CreatureMovementData() { @@ -366,9 +367,11 @@ namespace Game.Entities public bool IsFlightAllowed() { return Flight != CreatureFlightMovementType.None; } public bool IsRooted() { return Rooted; } + public CreatureChaseMovementType GetChase() { return Chase; } + public override string ToString() { - return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}"; + return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}, Chase: {Chase}"; } } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 3a8e466b1..b3134e416 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1829,24 +1829,27 @@ namespace Game if (!fields.IsNull(63)) creature.Movement.Rooted = fields.Read(63); - creature.HoverHeight = fields.Read(64); - creature.ModHealth = fields.Read(65); - creature.ModHealthExtra = fields.Read(66); - creature.ModMana = fields.Read(67); - creature.ModManaExtra = fields.Read(68); - creature.ModArmor = fields.Read(69); - creature.ModDamage = fields.Read(70); - creature.ModExperience = fields.Read(71); - creature.RacialLeader = fields.Read(72); - creature.MovementId = fields.Read(73); - creature.CreatureDifficultyID = fields.Read(74); - creature.WidgetSetID = fields.Read(75); - creature.WidgetSetUnitConditionID = fields.Read(76); - creature.RegenHealth = fields.Read(77); - creature.MechanicImmuneMask = fields.Read(78); - creature.SpellSchoolImmuneMask = fields.Read(79); - creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(80); - creature.ScriptID = GetScriptId(fields.Read(81)); + if (!fields.IsNull(64)) + creature.Movement.Chase = (CreatureChaseMovementType)fields.Read(64); + + creature.HoverHeight = fields.Read(65); + creature.ModHealth = fields.Read(66); + creature.ModHealthExtra = fields.Read(67); + creature.ModMana = fields.Read(68); + creature.ModManaExtra = fields.Read(69); + creature.ModArmor = fields.Read(70); + creature.ModDamage = fields.Read(71); + creature.ModExperience = fields.Read(72); + creature.RacialLeader = fields.Read(73); + creature.MovementId = fields.Read(74); + creature.CreatureDifficultyID = fields.Read(75); + creature.WidgetSetID = fields.Read(76); + creature.WidgetSetUnitConditionID = fields.Read(77); + creature.RegenHealth = fields.Read(78); + creature.MechanicImmuneMask = fields.Read(79); + creature.SpellSchoolImmuneMask = fields.Read(80); + creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(81); + creature.ScriptID = GetScriptId(fields.Read(82)); creatureTemplateStorage[entry] = creature; } @@ -2249,7 +2252,7 @@ namespace Game creatureMovementOverrides.Clear(); - SQLResult result = DB.World.Query("SELECT SpawnId, Ground, Swim, Flight, Rooted from creature_movement_override"); + SQLResult result = DB.World.Query("SELECT SpawnId, Ground, Swim, Flight, Rooted, Chase from creature_movement_override"); if (result.IsEmpty()) { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!"); @@ -2270,6 +2273,7 @@ namespace Game movement.Swim = result.Read(2); movement.Flight = (CreatureFlightMovementType)result.Read(3); movement.Rooted = result.Read(4); + movement.Chase = (CreatureChaseMovementType)result.Read(5); CheckCreatureMovement("creature_movement_override", spawnId, movement); @@ -2740,6 +2744,12 @@ namespace Game Log.outError(LogFilter.Sql, $"`{table}`.`Flight` wrong value ({creatureMovement.Flight}) for Id {id}, setting to None."); creatureMovement.Flight = CreatureFlightMovementType.None; } + + if (creatureMovement.Chase >= CreatureChaseMovementType.Max) + { + Log.outError(LogFilter.Sql, $"`{table}`.`Chase` wrong value ({creatureMovement.Chase}) for Id {id}, setting to Run."); + creatureMovement.Chase = CreatureChaseMovementType.Run; + } } public void LoadLinkedRespawn() { diff --git a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs index 9fa9dfefa..181ccf283 100644 --- a/Source/Game/Movement/Generators/ChaseMovementGenerator.cs +++ b/Source/Game/Movement/Generators/ChaseMovementGenerator.cs @@ -28,7 +28,6 @@ namespace Game.Movement ChaseRange? _range; ChaseAngle? _angle; - bool _walk; PathGenerator _path; Position _lastTargetPosition; @@ -38,12 +37,11 @@ namespace Game.Movement AbstractFollower _abstractFollower; - public ChaseMovementGenerator(Unit target, ChaseRange? range, ChaseAngle? angle, bool walk = false) + public ChaseMovementGenerator(Unit target, ChaseRange? range, ChaseAngle? angle) { _abstractFollower = new AbstractFollower(target); _range = range; _angle = angle; - _walk = walk; Mode = MovementGeneratorMode.Default; Priority = MovementGeneratorPriority.Normal; @@ -56,7 +54,6 @@ namespace Game.Movement RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated); AddFlag(MovementGeneratorFlags.Initialized); - owner.SetWalk(_walk); _path = null; _lastTargetPosition = null; } @@ -186,11 +183,29 @@ namespace Game.Movement if (cOwner) cOwner.SetCannotReachTarget(false); + owner.AddUnitState(UnitState.ChaseMove); + bool walk = false; + if (cOwner && !cOwner.IsPet()) + { + switch (cOwner.GetMovementTemplate().GetChase()) + { + case CreatureChaseMovementType.CanWalk: + if (owner.IsWalking()) + walk = true; + break; + case CreatureChaseMovementType.AlwaysWalk: + walk = true; + break; + default: + break; + } + } + MoveSplineInit init = new(owner); init.MovebyPath(_path.GetPath()); - init.SetWalk(_walk); + init.SetWalk(walk); init.SetFacing(target); init.Launch(); diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index 2ed7bbe6b..5b655e406 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -533,13 +533,13 @@ namespace Game.Movement public void MoveChase(Unit target, float dist, float angle = 0.0f) { MoveChase(target, new ChaseRange(dist), new ChaseAngle(angle)); } public void MoveChase(Unit target, float dist) { MoveChase(target, new ChaseRange(dist)); } - public void MoveChase(Unit target, ChaseRange? dist = null, ChaseAngle? angle = null, bool walk = false) + public void MoveChase(Unit target, ChaseRange? dist = null, ChaseAngle? angle = null) { // Ignore movement request if target not exist if (!target || target == _owner) return; - Add(new ChaseMovementGenerator(target, dist, angle, walk)); + Add(new ChaseMovementGenerator(target, dist, angle)); } public void MoveConfused() diff --git a/sql/updates/world/master/2021_11_24_06_world_2019_03_02_00_world.sql b/sql/updates/world/master/2021_11_24_06_world_2019_03_02_00_world.sql new file mode 100644 index 000000000..4399b0ae3 --- /dev/null +++ b/sql/updates/world/master/2021_11_24_06_world_2019_03_02_00_world.sql @@ -0,0 +1,7 @@ +ALTER TABLE `creature_template_movement` ADD `Chase` tinyint(3) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `creature_movement_override` ADD `Chase` tinyint(3) UNSIGNED NOT NULL DEFAULT '0'; + +DELETE FROM `creature_template_movement` WHERE `CreatureID` IN (20064,28654); +INSERT INTO `creature_template_movement` (`CreatureID`,`Ground`,`Swim`,`Flight`,`Rooted`,`Chase`) VALUES +(20064,1,0,0,0,2), +(28654,1,0,0,0,2);