Fixes crashes when character dies, and when teleporting.
This commit is contained in:
@@ -597,7 +597,7 @@ namespace Game.Entities
|
|||||||
if (GetTemplate() != null)
|
if (GetTemplate() != null)
|
||||||
{
|
{
|
||||||
var conditions = Global.ConditionMgr.GetConditionsForAreaTrigger(GetTemplate().Id.Id, GetTemplate().Id.IsCustom);
|
var conditions = Global.ConditionMgr.GetConditionsForAreaTrigger(GetTemplate().Id.Id, GetTemplate().Id.IsCustom);
|
||||||
if (!conditions.Empty())
|
if (conditions != null && !conditions.Empty())
|
||||||
targetList.RemoveAll(target => !Global.ConditionMgr.IsObjectMeetToConditions(target, conditions));
|
targetList.RemoveAll(target => !Global.ConditionMgr.IsObjectMeetToConditions(target, conditions));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -443,18 +443,18 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
||||||
{
|
{
|
||||||
UpdateMask valuesMask = new(14);
|
UpdateMask valuesMask = new((int)TypeId.Max);
|
||||||
valuesMask.Set((int)TypeId.Item);
|
valuesMask.Set((int)TypeId.Item);
|
||||||
valuesMask.Set((int)TypeId.AzeriteItem);
|
valuesMask.Set((int)TypeId.AzeriteItem);
|
||||||
|
|
||||||
WorldPacket buffer = new();
|
WorldPacket buffer = new();
|
||||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||||
|
|
||||||
UpdateMask mask = new(40);
|
UpdateMask mask = m_itemData.GetStaticUpdateMask();
|
||||||
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||||
m_itemData.WriteUpdate(buffer, mask, true, this, target);
|
m_itemData.WriteUpdate(buffer, mask, true, this, target);
|
||||||
|
|
||||||
UpdateMask mask2 = new(9);
|
UpdateMask mask2 = m_azeriteItemData.GetStaticUpdateMask();
|
||||||
m_azeriteItemData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
m_azeriteItemData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
||||||
m_azeriteItemData.WriteUpdate(buffer, mask2, true, this, target);
|
m_azeriteItemData.WriteUpdate(buffer, mask2, true, this, target);
|
||||||
|
|
||||||
|
|||||||
@@ -1305,11 +1305,11 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
||||||
{
|
{
|
||||||
UpdateMask valuesMask = new(14);
|
UpdateMask valuesMask = new((int)TypeId.Max);
|
||||||
valuesMask.Set((int)TypeId.Item);
|
valuesMask.Set((int)TypeId.Item);
|
||||||
|
|
||||||
WorldPacket buffer = new();
|
WorldPacket buffer = new();
|
||||||
UpdateMask mask = new(40);
|
UpdateMask mask = m_itemData.GetStaticUpdateMask();
|
||||||
|
|
||||||
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
buffer.WriteUInt32(valuesMask.GetBlock(0));
|
||||||
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
m_itemData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||||
|
|||||||
@@ -379,6 +379,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public abstract class HasChangesMask : IHasChangesMask
|
public abstract class HasChangesMask : IHasChangesMask
|
||||||
{
|
{
|
||||||
|
public int _changeMask;
|
||||||
public UpdateMask _changesMask;
|
public UpdateMask _changesMask;
|
||||||
public int _blockBit;
|
public int _blockBit;
|
||||||
public int Bit;
|
public int Bit;
|
||||||
@@ -388,6 +389,7 @@ namespace Game.Entities
|
|||||||
_blockBit = blockBit;
|
_blockBit = blockBit;
|
||||||
Bit = (int)bit;
|
Bit = (int)bit;
|
||||||
_changesMask = new UpdateMask(changeMask);
|
_changesMask = new UpdateMask(changeMask);
|
||||||
|
_changeMask = changeMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public HasChangesMask(int changeMask)
|
public HasChangesMask(int changeMask)
|
||||||
@@ -558,6 +560,11 @@ namespace Game.Entities
|
|||||||
if ((size % 32) != 0)
|
if ((size % 32) != 0)
|
||||||
data.WriteBits(0xFFFFFFFFu, size % 32);
|
data.WriteBits(0xFFFFFFFFu, size % 32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UpdateMask GetStaticUpdateMask()
|
||||||
|
{
|
||||||
|
return new UpdateMask(_changeMask);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DynamicUpdateFieldSetter<T> : IUpdateField<T> where T : new()
|
public class DynamicUpdateFieldSetter<T> : IUpdateField<T> where T : new()
|
||||||
|
|||||||
@@ -1267,7 +1267,6 @@ namespace Game.Entities
|
|||||||
public UpdateFieldArray<int> BonusResistanceMods = new(7, 195, 203);
|
public UpdateFieldArray<int> BonusResistanceMods = new(7, 195, 203);
|
||||||
public UpdateFieldArray<int> ManaCostModifier = new(7, 195, 210);
|
public UpdateFieldArray<int> ManaCostModifier = new(7, 195, 210);
|
||||||
|
|
||||||
|
|
||||||
public UnitData() : base(0, TypeId.Unit, ChangeMaskLength) { }
|
public UnitData() : base(0, TypeId.Unit, ChangeMaskLength) { }
|
||||||
|
|
||||||
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
|
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
|
||||||
@@ -1408,7 +1407,7 @@ namespace Game.Entities
|
|||||||
data.WriteUInt32(BaseHealth);
|
data.WriteUInt32(BaseHealth);
|
||||||
|
|
||||||
data.WriteUInt8(SheatheState);
|
data.WriteUInt8(SheatheState);
|
||||||
data.WriteUInt8((byte)GetViewerDependentPvpFlags(this, owner, receiver));
|
data.WriteUInt8(GetViewerDependentPvpFlags(this, owner, receiver));
|
||||||
data.WriteUInt8(PetFlags);
|
data.WriteUInt8(PetFlags);
|
||||||
data.WriteUInt8(ShapeshiftForm);
|
data.WriteUInt8(ShapeshiftForm);
|
||||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
|
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
|
||||||
@@ -2890,7 +2889,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
|
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
|
||||||
{
|
{
|
||||||
UpdateMask allowedMaskForTarget = new(261, [0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu]);
|
UpdateMask allowedMaskForTarget = new(269, [0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu]);
|
||||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||||
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
|
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
|
||||||
}
|
}
|
||||||
@@ -2898,12 +2897,12 @@ namespace Game.Entities
|
|||||||
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
|
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
|
||||||
{
|
{
|
||||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember))
|
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember))
|
||||||
allowedMaskForTarget.OR(new UpdateMask(261, new[] { 0x00000022u, 0xFFFFC000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x3FFFFFFFu, 0x00000000u, 0x00000000u }));
|
allowedMaskForTarget.OR(new UpdateMask(269, new[] { 0x00000022u, 0xFFFFC000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x3FFFFFFFu, 0x00000000u, 0x00000000u }));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
|
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
|
||||||
{
|
{
|
||||||
UpdateMask allowedMaskForTarget = new(261, new[] { 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu });
|
UpdateMask allowedMaskForTarget = new(269, new[] { 0xFFFFFFDDu, 0x00003FFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xC0000000u, 0xFFFFFFFFu, 0x00001FFFu });
|
||||||
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
|
||||||
changesMask.AND(allowedMaskForTarget);
|
changesMask.AND(allowedMaskForTarget);
|
||||||
}
|
}
|
||||||
@@ -3064,15 +3063,15 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (changesMask[19])
|
if (changesMask[19])
|
||||||
{
|
{
|
||||||
data.WriteUInt32(Inebriation);
|
data.WriteUInt8(Inebriation);
|
||||||
}
|
}
|
||||||
if (changesMask[20])
|
if (changesMask[20])
|
||||||
{
|
{
|
||||||
data.WriteInt32(PvpTitle);
|
data.WriteUInt8(PvpTitle);
|
||||||
}
|
}
|
||||||
if (changesMask[21])
|
if (changesMask[21])
|
||||||
{
|
{
|
||||||
data.WriteUInt32(ArenaFaction);
|
data.WriteUInt8(ArenaFaction);
|
||||||
}
|
}
|
||||||
if (changesMask[22])
|
if (changesMask[22])
|
||||||
{
|
{
|
||||||
@@ -3104,7 +3103,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (changesMask[29])
|
if (changesMask[29])
|
||||||
{
|
{
|
||||||
data.WriteInt32(CurrentBattlePetBreedQuality);
|
data.WriteUInt8(CurrentBattlePetBreedQuality);
|
||||||
}
|
}
|
||||||
if (changesMask[30])
|
if (changesMask[30])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7771,11 +7771,11 @@ namespace Game.Entities
|
|||||||
|
|
||||||
WorldPacket buffer = new();
|
WorldPacket buffer = new();
|
||||||
|
|
||||||
UpdateMask mask = new(191);
|
UpdateMask mask = m_unitData.GetStaticUpdateMask();
|
||||||
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||||
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
||||||
|
|
||||||
UpdateMask mask2 = new(161);
|
UpdateMask mask2 = m_playerData.GetStaticUpdateMask();
|
||||||
m_playerData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
m_playerData.AppendAllowedFieldsMaskForFlag(mask2, flags);
|
||||||
m_playerData.WriteUpdate(buffer, mask2, true, this, target);
|
m_playerData.WriteUpdate(buffer, mask2, true, this, target);
|
||||||
|
|
||||||
|
|||||||
@@ -2448,12 +2448,12 @@ namespace Game.Entities
|
|||||||
|
|
||||||
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
public override void BuildValuesUpdateWithFlag(WorldPacket data, UpdateFieldFlag flags, Player target)
|
||||||
{
|
{
|
||||||
UpdateMask valuesMask = new(14);
|
UpdateMask valuesMask = new((int)TypeId.Max);
|
||||||
valuesMask.Set((int)TypeId.Unit);
|
valuesMask.Set((int)TypeId.Unit);
|
||||||
|
|
||||||
WorldPacket buffer = new();
|
WorldPacket buffer = new();
|
||||||
|
|
||||||
UpdateMask mask = new(194);
|
UpdateMask mask = m_unitData.GetStaticUpdateMask();
|
||||||
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
m_unitData.AppendAllowedFieldsMaskForFlag(mask, flags);
|
||||||
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
m_unitData.WriteUpdate(buffer, mask, true, this, target);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user