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);
|
Cypher.Assert(data.SpawnId == m_spawnId);
|
||||||
|
|
||||||
data.Id = GetEntry();
|
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();
|
data.equipmentId = (sbyte)GetCurrentEquipmentId();
|
||||||
|
|
||||||
if (GetTransport() == null)
|
if (GetTransport() == null)
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public class CreatureData : SpawnData
|
public class CreatureData : SpawnData
|
||||||
{
|
{
|
||||||
public uint displayid;
|
public CreatureModel display;
|
||||||
public sbyte equipmentId;
|
public sbyte equipmentId;
|
||||||
public float WanderDistance;
|
public float WanderDistance;
|
||||||
public uint currentwaypoint;
|
public uint currentwaypoint;
|
||||||
|
|||||||
@@ -1272,49 +1272,55 @@ namespace Game
|
|||||||
|
|
||||||
void ChangeEquipOrModel(short event_id, bool activate)
|
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
|
// Remove the creature from grid
|
||||||
CreatureData data = Global.ObjectMgr.GetCreatureData(tuple.Item1);
|
CreatureData data = Global.ObjectMgr.GetCreatureData(spawnId);
|
||||||
if (data == null)
|
if (data == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Update if spawned
|
// Update if spawned
|
||||||
Global.MapMgr.DoForAllMapsWithMapId(data.MapId, map =>
|
Global.MapMgr.DoForAllMapsWithMapId(data.MapId, map =>
|
||||||
{
|
{
|
||||||
var creatureBounds = map.GetCreatureBySpawnIdStore().LookupByKey(tuple.Item1);
|
var creatureBounds = map.GetCreatureBySpawnIdStore().LookupByKey(spawnId);
|
||||||
foreach (var creature in creatureBounds)
|
foreach (var creature in creatureBounds)
|
||||||
{
|
{
|
||||||
if (activate)
|
if (activate)
|
||||||
{
|
{
|
||||||
tuple.Item2.equipement_id_prev = creature.GetCurrentEquipmentId();
|
modelEquip.equipement_id_prev = creature.GetCurrentEquipmentId();
|
||||||
tuple.Item2.modelid_prev = creature.GetDisplayId();
|
modelEquip.modelid_prev = creature.GetDisplayId();
|
||||||
creature.LoadEquipment(tuple.Item2.equipment_id, true);
|
creature.LoadEquipment(modelEquip.equipment_id, true);
|
||||||
if (tuple.Item2.modelid > 0 && tuple.Item2.modelid_prev != tuple.Item2.modelid && Global.ObjectMgr.GetCreatureModelInfo(tuple.Item2.modelid) != null)
|
if (modelEquip.modelid > 0 && modelEquip.modelid_prev != modelEquip.modelid && Global.ObjectMgr.GetCreatureModelInfo(modelEquip.modelid) != null)
|
||||||
creature.SetDisplayId(tuple.Item2.modelid, true);
|
creature.SetDisplayId(modelEquip.modelid, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
creature.LoadEquipment(tuple.Item2.equipement_id_prev, true);
|
creature.LoadEquipment(modelEquip.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)
|
if (modelEquip.modelid_prev > 0 && modelEquip.modelid_prev != modelEquip.modelid && Global.ObjectMgr.GetCreatureModelInfo(modelEquip.modelid_prev) != null)
|
||||||
creature.SetDisplayId(tuple.Item2.modelid_prev, true);
|
creature.SetDisplayId(modelEquip.modelid_prev, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// now last step: put in data
|
// now last step: put in data
|
||||||
CreatureData data2 = Global.ObjectMgr.NewOrExistCreatureData(tuple.Item1);
|
CreatureData data2 = Global.ObjectMgr.NewOrExistCreatureData(spawnId);
|
||||||
if (activate)
|
if (activate)
|
||||||
{
|
{
|
||||||
tuple.Item2.modelid_prev = data2.displayid;
|
modelEquip.modelid_prev = data2.display != null ? data2.display.CreatureDisplayID : 0;
|
||||||
tuple.Item2.equipement_id_prev = (byte)data2.equipmentId;
|
modelEquip.equipement_id_prev = (byte)data2.equipmentId;
|
||||||
data2.displayid = tuple.Item2.modelid;
|
if (modelEquip.modelid != 0)
|
||||||
data2.equipmentId = (sbyte)tuple.Item2.equipment_id;
|
data2.display = new(modelEquip.modelid, SharedConst.DefaultPlayerDisplayScale, 1.0f);
|
||||||
|
else
|
||||||
|
data2.display = null;
|
||||||
|
data2.equipmentId = (sbyte)modelEquip.equipment_id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data2.displayid = tuple.Item2.modelid_prev;
|
if (modelEquip.modelid_prev != 0)
|
||||||
data2.equipmentId = (sbyte)tuple.Item2.equipement_id_prev;
|
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)
|
public static CreatureModel ChooseDisplayId(CreatureTemplate cinfo, CreatureData data = null)
|
||||||
{
|
{
|
||||||
// Load creature model (display id)
|
// Load creature model (display id)
|
||||||
if (data != null && data.displayid != 0)
|
if (data != null && data.display != null)
|
||||||
{
|
return data.display;
|
||||||
CreatureModel model = cinfo.GetModelWithDisplayId(data.displayid);
|
|
||||||
if (model != null)
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Trigger))
|
if (!cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.Trigger))
|
||||||
{
|
{
|
||||||
@@ -3480,7 +3476,10 @@ namespace Game
|
|||||||
data.Id = entry;
|
data.Id = entry;
|
||||||
data.MapId = result.Read<ushort>(2);
|
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.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.equipmentId = result.Read<sbyte>(8);
|
||||||
data.spawntimesecs = result.Read<int>(9);
|
data.spawntimesecs = result.Read<int>(9);
|
||||||
data.WanderDistance = result.Read<float>(10);
|
data.WanderDistance = result.Read<float>(10);
|
||||||
|
|||||||
Reference in New Issue
Block a user