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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user