Fixes crashes when character dies, and when teleporting.

This commit is contained in:
hondacrx
2024-02-22 16:17:27 -05:00
parent 15d714f050
commit f6b1c24297
7 changed files with 25 additions and 19 deletions
@@ -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));
} }
+3 -3
View File
@@ -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);
+2 -2
View File
@@ -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])
{ {
+2 -2
View File
@@ -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);
+2 -2
View File
@@ -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);