From 29af2a63b703258a40e7bf55bebcb954c9d5e37e Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 27 Feb 2024 13:54:39 -0500 Subject: [PATCH] Core/Creatures: Implemented CREATURE_STATIC_FLAG_2_ALLOW_MOUNTED_COMBAT and overriding default mount from creature addon Port From (https://github.com/TrinityCore/TrinityCore/commit/9463933eda630be97e3ab16cf66e419d2f696109) --- Source/Framework/Constants/CliDBConst.cs | 2 +- .../Game/Entities/Creature/Creature.Fields.cs | 1 + Source/Game/Entities/Creature/Creature.cs | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index eabe1eb96..9357550b4 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -2032,7 +2032,7 @@ namespace Framework.Constants SuppressPointsStacking = 0x40, ChainFromInitialTarget = 0x80, UncontrolledNoBackwards = 0x100, /*NYI*/ - AuraPointsStack = 0x000200, /*NYI*/ // refreshing periodic auras with this attribute will add remaining damage to new aura + AuraPointsStack = 0x000200, // refreshing periodic auras with this attribute will add remaining damage to new aura NoCopyDamageInterruptsOrProcs = 0x400, /*NYI*/ AddTargetCombatReachToAOE = 0x800, /*NYI*/ IsHarmful = 0x1000, diff --git a/Source/Game/Entities/Creature/Creature.Fields.cs b/Source/Game/Entities/Creature/Creature.Fields.cs index 57ae6adb0..963fd3a9d 100644 --- a/Source/Game/Entities/Creature/Creature.Fields.cs +++ b/Source/Game/Entities/Creature/Creature.Fields.cs @@ -29,6 +29,7 @@ namespace Game.Entities bool _isMissingCanSwimFlagOutOfCombat; + uint? _defaultMountDisplayIdOverride; int _creatureImmunitiesId; uint _gossipMenuId; uint? _trainerId; diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index cc5273489..775079475 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -283,6 +283,9 @@ namespace Game.Entities ApplyAllStaticFlags(m_creatureDifficulty.StaticFlags); _staticFlags.ApplyFlag(CreatureStaticFlags.NoXp, creatureInfo.CreatureType == CreatureType.Critter || IsPet() || IsTotem() || creatureInfo.FlagsExtra.HasFlag(CreatureFlagsExtra.NoXP)); + + // TODO: migrate these in DB + _staticFlags.ApplyFlag(CreatureStaticFlags2.AllowMountedCombat, GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.AllowMountedCombat)); _staticFlags.ApplyFlag(CreatureStaticFlags4.TreatAsRaidUnitForHelpfulSpells, GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.TreatAsRaidUnit)); return true; @@ -1056,7 +1059,7 @@ namespace Game.Entities { base.AtEngage(target); - if (!GetCreatureDifficulty().TypeFlags.HasFlag(CreatureTypeFlags.AllowMountedCombat)) + if (!HasFlag(CreatureStaticFlags2.AllowMountedCombat)) Dismount(); RefreshCanSwimFlag(); @@ -2522,8 +2525,9 @@ namespace Game.Entities CreatureAddon creatureAddon = GetCreatureAddon(); if (creatureAddon == null) return false; - - if (creatureAddon.mount != 0) + + uint mountDisplayId = _defaultMountDisplayIdOverride.GetValueOrDefault(creatureAddon.mount); + if ( mountDisplayId != 0) Mount(creatureAddon.mount); SetStandState((UnitStandStateType)creatureAddon.standState); @@ -3122,6 +3126,14 @@ namespace Game.Entities Log.outDebug(LogFilter.Unit, $"Creature::SetCannotReachTarget() called with true. Details: {GetDebugInfo()}"); } + void SetDefaultMount(uint? mountCreatureDisplayId) + { + if (mountCreatureDisplayId.HasValue && !CliDB.CreatureDisplayInfoStorage.HasRecord(mountCreatureDisplayId.Value)) + mountCreatureDisplayId = null; + + _defaultMountDisplayIdOverride = mountCreatureDisplayId; + } + public float GetAggroRange(Unit target) { // Determines the aggro range for creatures (usually pets), used mainly for aggressive pet target selection.