From 24691c71105ae87fe60849b1b3508649e0b5a366 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 3 Feb 2024 13:48:02 -0500 Subject: [PATCH] Core/Creatures: Don't require `creature`.`modelid` to be one of linked `creature_template` models Port From (https://github.com/TrinityCore/TrinityCore/commit/7cafeb46b3b1f3eea3c966c20f9ef1efe68dfbdc) --- Source/Game/Entities/Creature/Creature.cs | 5 ++- Source/Game/Entities/Creature/CreatureData.cs | 2 +- Source/Game/Events/GameEventManager.cs | 42 +++++++++++-------- Source/Game/Globals/ObjectManager.cs | 13 +++--- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/Source/Game/Entities/Creature/Creature.cs b/Source/Game/Entities/Creature/Creature.cs index bfb7c4ac7..5eb356a5d 100644 --- a/Source/Game/Entities/Creature/Creature.cs +++ b/Source/Game/Entities/Creature/Creature.cs @@ -1355,7 +1355,10 @@ namespace Game.Entities Cypher.Assert(data.SpawnId == m_spawnId); data.Id = GetEntry(); - data.displayid = displayId; + if (displayId != 0) + data.display = new(displayId, SharedConst.DefaultPlayerDisplayScale, 1.0f); + else + data.display = null; data.equipmentId = (sbyte)GetCurrentEquipmentId(); if (GetTransport() == null) diff --git a/Source/Game/Entities/Creature/CreatureData.cs b/Source/Game/Entities/Creature/CreatureData.cs index f63660d47..7918616bf 100644 --- a/Source/Game/Entities/Creature/CreatureData.cs +++ b/Source/Game/Entities/Creature/CreatureData.cs @@ -259,7 +259,7 @@ namespace Game.Entities public class CreatureData : SpawnData { - public uint displayid; + public CreatureModel display; public sbyte equipmentId; public float WanderDistance; public uint currentwaypoint; diff --git a/Source/Game/Events/GameEventManager.cs b/Source/Game/Events/GameEventManager.cs index 8b92b68d4..90d56f493 100644 --- a/Source/Game/Events/GameEventManager.cs +++ b/Source/Game/Events/GameEventManager.cs @@ -1272,49 +1272,55 @@ namespace Game void ChangeEquipOrModel(short event_id, bool activate) { - foreach (var tuple in mGameEventModelEquip[event_id]) + foreach (var (spawnId, modelEquip) in mGameEventModelEquip[event_id]) { // Remove the creature from grid - CreatureData data = Global.ObjectMgr.GetCreatureData(tuple.Item1); + CreatureData data = Global.ObjectMgr.GetCreatureData(spawnId); if (data == null) continue; // Update if spawned Global.MapMgr.DoForAllMapsWithMapId(data.MapId, map => { - var creatureBounds = map.GetCreatureBySpawnIdStore().LookupByKey(tuple.Item1); + var creatureBounds = map.GetCreatureBySpawnIdStore().LookupByKey(spawnId); foreach (var creature in creatureBounds) { if (activate) { - tuple.Item2.equipement_id_prev = creature.GetCurrentEquipmentId(); - tuple.Item2.modelid_prev = creature.GetDisplayId(); - creature.LoadEquipment(tuple.Item2.equipment_id, true); - if (tuple.Item2.modelid > 0 && tuple.Item2.modelid_prev != tuple.Item2.modelid && Global.ObjectMgr.GetCreatureModelInfo(tuple.Item2.modelid) != null) - creature.SetDisplayId(tuple.Item2.modelid, true); + modelEquip.equipement_id_prev = creature.GetCurrentEquipmentId(); + modelEquip.modelid_prev = creature.GetDisplayId(); + creature.LoadEquipment(modelEquip.equipment_id, true); + if (modelEquip.modelid > 0 && modelEquip.modelid_prev != modelEquip.modelid && Global.ObjectMgr.GetCreatureModelInfo(modelEquip.modelid) != null) + creature.SetDisplayId(modelEquip.modelid, true); } else { - creature.LoadEquipment(tuple.Item2.equipement_id_prev, true); - if (tuple.Item2.modelid_prev > 0 && tuple.Item2.modelid_prev != tuple.Item2.modelid && Global.ObjectMgr.GetCreatureModelInfo(tuple.Item2.modelid_prev) != null) - creature.SetDisplayId(tuple.Item2.modelid_prev, true); + creature.LoadEquipment(modelEquip.equipement_id_prev, true); + if (modelEquip.modelid_prev > 0 && modelEquip.modelid_prev != modelEquip.modelid && Global.ObjectMgr.GetCreatureModelInfo(modelEquip.modelid_prev) != null) + creature.SetDisplayId(modelEquip.modelid_prev, true); } } }); // now last step: put in data - CreatureData data2 = Global.ObjectMgr.NewOrExistCreatureData(tuple.Item1); + CreatureData data2 = Global.ObjectMgr.NewOrExistCreatureData(spawnId); if (activate) { - tuple.Item2.modelid_prev = data2.displayid; - tuple.Item2.equipement_id_prev = (byte)data2.equipmentId; - data2.displayid = tuple.Item2.modelid; - data2.equipmentId = (sbyte)tuple.Item2.equipment_id; + modelEquip.modelid_prev = data2.display != null ? data2.display.CreatureDisplayID : 0; + modelEquip.equipement_id_prev = (byte)data2.equipmentId; + if (modelEquip.modelid != 0) + data2.display = new(modelEquip.modelid, SharedConst.DefaultPlayerDisplayScale, 1.0f); + else + data2.display = null; + data2.equipmentId = (sbyte)modelEquip.equipment_id; } else { - data2.displayid = tuple.Item2.modelid_prev; - data2.equipmentId = (sbyte)tuple.Item2.equipement_id_prev; + if (modelEquip.modelid_prev != 0) + data2.display = new(modelEquip.modelid_prev, SharedConst.DefaultPlayerDisplayScale, 1.0f); + else + data2.display = null; + data2.equipmentId = (sbyte)modelEquip.equipement_id_prev; } } } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 44f27e83a..1c2cd7476 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -70,12 +70,8 @@ namespace Game public static CreatureModel ChooseDisplayId(CreatureTemplate cinfo, CreatureData data = null) { // Load creature model (display id) - if (data != null && data.displayid != 0) - { - CreatureModel model = cinfo.GetModelWithDisplayId(data.displayid); - if (model != null) - return model; - } + if (data != null && data.display != null) + return data.display; if (!cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Trigger)) { @@ -3480,7 +3476,10 @@ namespace Game data.Id = entry; data.MapId = result.Read(2); data.SpawnPoint = new Position(result.Read(3), result.Read(4), result.Read(5), result.Read(6)); - data.displayid = result.Read(7); + uint displayId = result.Read(7); + if (displayId != 0) + data.display = new(displayId, SharedConst.DefaultPlayerDisplayScale, 1.0f); + data.equipmentId = result.Read(8); data.spawntimesecs = result.Read(9); data.WanderDistance = result.Read(10);