From 219db87e6aee6e71aa63d2fdf8e1a915cdad61c7 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 24 Jun 2023 09:11:35 -0400 Subject: [PATCH] Core/Creatures: Drop dynamic flags from creature and creature_template Port From (https://github.com/TrinityCore/TrinityCore/commit/bb68fd73b498f6d6fc2c4414352c6e073a184304) --- .../Database/Databases/WorldDatabase.cs | 4 +- Source/Game/Entities/Creature/Creature.cs | 20 ++--- Source/Game/Entities/Creature/CreatureData.cs | 2 - Source/Game/Globals/ObjectManager.cs | 86 ++++++++----------- 4 files changed, 43 insertions(+), 69 deletions(-) diff --git a/Source/Framework/Database/Databases/WorldDatabase.cs b/Source/Framework/Database/Databases/WorldDatabase.cs index 8f00f796b..cb1c82f45 100644 --- a/Source/Framework/Database/Databases/WorldDatabase.cs +++ b/Source/Framework/Database/Databases/WorldDatabase.cs @@ -60,12 +60,12 @@ 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, help FROM command"); - PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, 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, VehicleId, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, ExperienceModifier, RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName, StringId 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, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, family, trainer_class, type, VehicleId, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, ctm.Random, ctm.InteractionPauseTimer, ExperienceModifier, RacialLeader, movementId, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName, StringId 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_"); PrepareStatement(WorldStatements.SEL_CREATURE_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 creature WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_"); - PrepareStatement(WorldStatements.INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnDifficulties, PhaseId, PhaseGroup, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, unit_flags2, unit_flags3, dynamicflags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(WorldStatements.INS_CREATURE, "INSERT INTO creature (guid, id , map, spawnDifficulties, PhaseId, PhaseGroup, modelid, equipment_id, position_x, position_y, position_z, orientation, spawntimesecs, wander_distance, currentwaypoint, curhealth, curmana, MovementType, npcflag, unit_flags, unit_flags2, unit_flags3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(WorldStatements.DEL_GAME_EVENT_CREATURE, "DELETE FROM game_event_creature WHERE guid = ?"); PrepareStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP, "DELETE FROM game_event_model_equip WHERE guid = ?"); PrepareStatement(WorldStatements.INS_GAMEOBJECT, "INSERT INTO gameobject (guid, id, map, spawnDifficulties, PhaseId, PhaseGroup, position_x, position_y, position_z, orientation, rotation0, rotation1, rotation2, rotation3, spawntimesecs, animprogress, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index 04152fdde..ff3db1ff0 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -303,9 +303,7 @@ namespace Game.Entities SetFaction(cInfo.Faction); - ulong npcFlags; - uint unitFlags, unitFlags2, unitFlags3, dynamicFlags; - ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, data); + ObjectManager.ChooseCreatureFlags(cInfo, out ulong npcFlags, out uint unitFlags, out uint unitFlags2, out uint unitFlags3, data); if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) npcFlags |= Global.GameEventMgr.GetNPCFlag(this); @@ -322,7 +320,7 @@ namespace Game.Entities ReplaceAllUnitFlags2((UnitFlags2)unitFlags2); ReplaceAllUnitFlags3((UnitFlags3)unitFlags3); - ReplaceAllDynamicFlags((UnitDynFlags)dynamicFlags); + ReplaceAllDynamicFlags(UnitDynFlags.None); SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateAnimID), Global.DB2Mgr.GetEmptyAnimStateID()); @@ -1086,7 +1084,7 @@ namespace Game.Entities ClearUnitState(UnitState.AttackPlayer); if (IsAlive() && HasDynamicFlag(UnitDynFlags.Tapped)) - ReplaceAllDynamicFlags((UnitDynFlags)GetCreatureTemplate().DynamicFlags); + RemoveDynamicFlag(UnitDynFlags.Tapped); if (IsPet() || IsGuardian()) // update pets' speed for catchup OOC speed { @@ -1319,7 +1317,6 @@ namespace Game.Entities uint unitFlags = m_unitData.Flags; uint unitFlags2 = m_unitData.Flags2; uint unitFlags3 = m_unitData.Flags3; - UnitDynFlags dynamicflags = (UnitDynFlags)(uint)m_objectData.DynamicFlags; // check if it's a custom model and if not, use 0 for displayId CreatureTemplate cinfo = GetCreatureTemplate(); @@ -1340,9 +1337,6 @@ namespace Game.Entities if (unitFlags3 == cinfo.UnitFlags3) unitFlags3 = 0; - - if (dynamicflags == (UnitDynFlags)cinfo.DynamicFlags) - dynamicflags = 0; } if (data.SpawnId == 0) @@ -1378,7 +1372,6 @@ namespace Game.Entities data.unit_flags = unitFlags; data.unit_flags2 = unitFlags2; data.unit_flags3 = unitFlags3; - data.dynamicflags = (uint)dynamicflags; if (data.spawnGroupData == null) data.spawnGroupData = Global.ObjectMgr.GetDefaultSpawnGroup(); @@ -1417,7 +1410,6 @@ namespace Game.Entities stmt.AddValue(index++, unitFlags); stmt.AddValue(index++, unitFlags2); stmt.AddValue(index++, unitFlags3); - stmt.AddValue(index++, (uint)dynamicflags); trans.Append(stmt); DB.World.CommitTransaction(trans); @@ -1991,9 +1983,7 @@ namespace Game.Entities CreatureData creatureData = GetCreatureData(); CreatureTemplate cInfo = GetCreatureTemplate(); - ulong npcFlags; - uint unitFlags, unitFlags2, unitFlags3, dynamicFlags; - ObjectManager.ChooseCreatureFlags(cInfo, out npcFlags, out unitFlags, out unitFlags2, out unitFlags3, out dynamicFlags, creatureData); + ObjectManager.ChooseCreatureFlags(cInfo, out ulong npcFlags, out uint unitFlags, out uint unitFlags2, out uint unitFlags3, creatureData); if (cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Worldevent)) npcFlags |= Global.GameEventMgr.GetNPCFlag(this); @@ -2004,7 +1994,7 @@ namespace Game.Entities ReplaceAllUnitFlags((UnitFlags)unitFlags); ReplaceAllUnitFlags2((UnitFlags2)unitFlags2); ReplaceAllUnitFlags3((UnitFlags3)unitFlags3); - ReplaceAllDynamicFlags((UnitDynFlags)dynamicFlags); + ReplaceAllDynamicFlags(UnitDynFlags.None); RemoveUnitFlag(UnitFlags.InCombat); diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index ec480e650..21c7381bc 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -40,7 +40,6 @@ namespace Game.Entities public UnitFlags UnitFlags; public uint UnitFlags2; public uint UnitFlags3; - public uint DynamicFlags; public CreatureFamily Family; public Class TrainerClass; public CreatureType CreatureType; @@ -271,7 +270,6 @@ namespace Game.Entities public uint unit_flags; // enum UnitFlags mask values public uint unit_flags2; // enum UnitFlags2 mask values public uint unit_flags3; // enum UnitFlags3 mask values - public uint dynamicflags; public CreatureData() : base(SpawnObjectType.Creature) { } } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 86d365069..842ea698a 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -103,13 +103,12 @@ namespace Game return cinfo.GetFirstInvisibleModel(); } - public static void ChooseCreatureFlags(CreatureTemplate cInfo, out ulong npcFlag, out uint unitFlags, out uint unitFlags2, out uint unitFlags3, out uint dynamicFlags, CreatureData data = null) + public static void ChooseCreatureFlags(CreatureTemplate cInfo, out ulong npcFlag, out uint unitFlags, out uint unitFlags2, out uint unitFlags3, CreatureData data = null) { npcFlag = data != null && data.npcflag != 0 ? data.npcflag : cInfo.Npcflag; unitFlags = data != null && data.unit_flags != 0 ? data.unit_flags : (uint)cInfo.UnitFlags; unitFlags2 = data != null && data.unit_flags2 != 0 ? data.unit_flags2 : cInfo.UnitFlags2; unitFlags3 = data != null && data.unit_flags3 != 0 ? data.unit_flags3 : cInfo.UnitFlags3; - dynamicFlags = data != null && data.dynamicflags != 0 ? data.dynamicflags : cInfo.DynamicFlags; } public static ResponseCodes CheckPlayerName(string name, Locale locale, bool create = false) @@ -1794,10 +1793,9 @@ namespace Game creature.UnitFlags = (UnitFlags)fields.Read(22); creature.UnitFlags2 = fields.Read(23); creature.UnitFlags3 = fields.Read(24); - creature.DynamicFlags = fields.Read(25); - creature.Family = (CreatureFamily)fields.Read(26); - creature.TrainerClass = (Class)fields.Read(27); - creature.CreatureType = (CreatureType)fields.Read(28); + creature.Family = (CreatureFamily)fields.Read(25); + creature.TrainerClass = (Class)fields.Read(26); + creature.CreatureType = (CreatureType)fields.Read(27); for (var i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i) creature.Resistance[i] = 0; @@ -1805,42 +1803,42 @@ namespace Game for (var i = 0; i < SharedConst.MaxCreatureSpells; ++i) creature.Spells[i] = 0; - creature.VehicleId = fields.Read(29); - creature.AIName = fields.Read(30); - creature.MovementType = fields.Read(31); + creature.VehicleId = fields.Read(28); + creature.AIName = fields.Read(29); + creature.MovementType = fields.Read(30); + + if (!fields.IsNull(31)) + creature.Movement.Ground = (CreatureGroundMovementType)fields.Read(31); if (!fields.IsNull(32)) - creature.Movement.Ground = (CreatureGroundMovementType)fields.Read(32); + creature.Movement.Swim = fields.Read(32); if (!fields.IsNull(33)) - creature.Movement.Swim = fields.Read(33); + creature.Movement.Flight = (CreatureFlightMovementType)fields.Read(33); if (!fields.IsNull(34)) - creature.Movement.Flight = (CreatureFlightMovementType)fields.Read(34); + creature.Movement.Rooted = fields.Read(34); if (!fields.IsNull(35)) - creature.Movement.Rooted = fields.Read(35); + creature.Movement.Chase = (CreatureChaseMovementType)fields.Read(35); if (!fields.IsNull(36)) - creature.Movement.Chase = (CreatureChaseMovementType)fields.Read(36); + creature.Movement.Random = (CreatureRandomMovementType)fields.Read(36); if (!fields.IsNull(37)) - creature.Movement.Random = (CreatureRandomMovementType)fields.Read(37); + creature.Movement.InteractionPauseTimer = fields.Read(37); - if (!fields.IsNull(38)) - creature.Movement.InteractionPauseTimer = fields.Read(38); - - creature.ModExperience = fields.Read(39); - creature.RacialLeader = fields.Read(40); - creature.MovementId = fields.Read(41); - creature.WidgetSetID = fields.Read(42); - creature.WidgetSetUnitConditionID = fields.Read(43); - creature.RegenHealth = fields.Read(44); - creature.MechanicImmuneMask = fields.Read(45); - creature.SpellSchoolImmuneMask = fields.Read(46); - creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(47); - creature.ScriptID = GetScriptId(fields.Read(48)); - creature.StringId = fields.Read(49); + creature.ModExperience = fields.Read(38); + creature.RacialLeader = fields.Read(39); + creature.MovementId = fields.Read(40); + creature.WidgetSetID = fields.Read(41); + creature.WidgetSetUnitConditionID = fields.Read(42); + creature.RegenHealth = fields.Read(43); + creature.MechanicImmuneMask = fields.Read(44); + creature.SpellSchoolImmuneMask = fields.Read(45); + creature.FlagsExtra = (CreatureFlagsExtra)fields.Read(46); + creature.ScriptID = GetScriptId(fields.Read(47)); + creature.StringId = fields.Read(48); creatureTemplateStorage[entry] = creature; } @@ -2870,12 +2868,6 @@ namespace Game cInfo.UnitFlags3 &= (uint)UnitFlags3.Allowed; } - if (cInfo.DynamicFlags != 0) - { - Log.outError(LogFilter.Sql, $"Table `creature_template` lists creature (Entry: {cInfo.Entry}) with `dynamicflags` > 0. Ignored and set to 0."); - cInfo.DynamicFlags = 0; - } - if (!cInfo.GossipMenuIds.Empty() && !cInfo.Npcflag.HasAnyFlag((uint)NPCFlags.Gossip)) Log.outInfo(LogFilter.Sql, $"Creature (Entry: {cInfo.Entry}) has assigned gossip menu, but npcflag does not include UNIT_NPC_FLAG_GOSSIP."); else if (cInfo.GossipMenuIds.Empty() && cInfo.Npcflag.HasAnyFlag((uint)NPCFlags.Gossip)) @@ -3433,8 +3425,8 @@ namespace Game SQLResult result = DB.World.Query("SELECT creature.guid, id, map, position_x, position_y, position_z, orientation, modelid, equipment_id, spawntimesecs, wander_distance, " + //11 12 13 14 15 16 17 18 19 20 21 "currentwaypoint, curhealth, curmana, MovementType, spawnDifficulties, eventEntry, poolSpawnId, creature.npcflag, creature.unit_flags, creature.unit_flags2, creature.unit_flags3, " + - // 22 23 24 25 26 27 28 - "creature.dynamicflags, creature.phaseUseFlags, creature.phaseid, creature.phasegroup, creature.terrainSwapMap, creature.ScriptName, creature.StringId " + + //22 23 24 25 26 27 + "creature.phaseUseFlags, creature.phaseid, creature.phasegroup, creature.terrainSwapMap, creature.ScriptName, creature.StringId " + "FROM creature LEFT OUTER JOIN game_event_creature ON creature.guid = game_event_creature.guid LEFT OUTER JOIN pool_members ON pool_members.type = 0 AND creature.guid = pool_members.spawnId"); if (result.IsEmpty()) @@ -3491,13 +3483,13 @@ namespace Game data.unit_flags = result.Read(19); data.unit_flags2 = result.Read(20); data.unit_flags3 = result.Read(21); - data.dynamicflags = result.Read(22); - data.PhaseUseFlags = (PhaseUseFlagsValues)result.Read(23); - data.PhaseId = result.Read(24); - data.PhaseGroup = result.Read(25); - data.terrainSwapMap = result.Read(26); - data.ScriptId = GetScriptId(result.Read(27)); - data.StringId = result.Read(28); + + data.PhaseUseFlags = (PhaseUseFlagsValues)result.Read(22); + data.PhaseId = result.Read(23); + data.PhaseGroup = result.Read(24); + data.terrainSwapMap = result.Read(25); + data.ScriptId = GetScriptId(result.Read(26)); + data.StringId = result.Read(27); data.spawnGroupData = _spawnGroupDataStorage[IsTransportMap(data.MapId) ? 1 : 0u]; // transport spawns default to compatibility group var mapEntry = CliDB.MapStorage.LookupByKey(data.MapId); @@ -3625,12 +3617,6 @@ namespace Game cInfo.UnitFlags3 &= (uint)UnitFlags3.Allowed; } - if (cInfo.DynamicFlags != 0) - { - Log.outError(LogFilter.Sql, $"Table `creature_template` lists creature (Entry: {cInfo.Entry}) with `dynamicflags` > 0. Ignored and set to 0."); - cInfo.DynamicFlags = 0; - } - if (WorldConfig.GetBoolValue(WorldCfg.CalculateCreatureZoneAreaData)) { PhasingHandler.InitDbVisibleMapId(phaseShift, data.terrainSwapMap);