Core/Creatures: Don't require creature.modelid to be one of linked creature_template models

Port From (https://github.com/TrinityCore/TrinityCore/commit/7cafeb46b3b1f3eea3c966c20f9ef1efe68dfbdc)
This commit is contained in:
hondacrx
2024-02-03 13:48:02 -05:00
parent 99c931652d
commit 24691c7110
4 changed files with 35 additions and 27 deletions
+4 -1
View File
@@ -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)
@@ -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;
+24 -18
View File
@@ -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;
}
}
}
+6 -7
View File
@@ -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<ushort>(2);
data.SpawnPoint = new Position(result.Read<float>(3), result.Read<float>(4), result.Read<float>(5), result.Read<float>(6));
data.displayid = result.Read<uint>(7);
uint displayId = result.Read<uint>(7);
if (displayId != 0)
data.display = new(displayId, SharedConst.DefaultPlayerDisplayScale, 1.0f);
data.equipmentId = result.Read<sbyte>(8);
data.spawntimesecs = result.Read<int>(9);
data.WanderDistance = result.Read<float>(10);