Core/PacketIO: Updated packet structures to 9.2.0

Port From (https://github.com/TrinityCore/TrinityCore/commit/9f30afe3528441571f89cb2e1775c756774fa0cd)
This commit is contained in:
hondacrx
2022-05-09 23:14:38 -04:00
parent 1ca851db26
commit 0bbabbd667
32 changed files with 1309 additions and 1023 deletions
@@ -370,6 +370,9 @@ namespace Game.Entities
case AreaTriggerTypes.Cylinder:
SearchUnitInCylinder(targetList);
break;
case AreaTriggerTypes.Disk:
SearchUnitInDisk(targetList);
break;
default:
break;
}
@@ -452,6 +455,18 @@ namespace Game.Entities
targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
}
void SearchUnitInDisk(List<Unit> targetList)
{
SearchUnits(targetList, GetMaxSearchRadius(), false);
float innerRadius = _shape.DiskDatas.InnerRadius;
float height = _shape.DiskDatas.Height;
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
targetList.RemoveAll(unit => unit.IsInDist2d(this, innerRadius) || unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ);
}
void HandleUnitEnterExit(List<Unit> newTargetList)
{
List<ObjectGuid> exitUnits = _insideUnits;
@@ -44,6 +44,9 @@ namespace Game.Entities
[FieldOffset(0)]
public cylinderdatas CylinderDatas;
[FieldOffset(0)]
public diskDatas DiskDatas;
public struct defaultdatas
{
public fixed float Data[SharedConst.MaxAreatriggerEntityData];
@@ -80,6 +83,18 @@ namespace Game.Entities
public float LocationZOffset;
public float LocationZOffsetTarget;
}
// AREATRIGGER_TYPE_DISK
public struct diskDatas
{
public float InnerRadius;
public float InnerRadiusTarget;
public float OuterRadius;
public float OuterRadiusTarget;
public float Height;
public float HeightTarget;
public float LocationZOffset;
public float LocationZOffsetTarget;
}
}
/// <summary>
@@ -183,7 +198,7 @@ namespace Game.Entities
}
public class AreaTriggerShapeInfo : AreaTriggerData
{
{
public AreaTriggerTypes TriggerType;
public AreaTriggerShapeInfo()
@@ -200,7 +215,9 @@ namespace Game.Entities
case AreaTriggerTypes.Box:
return MathF.Sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
case AreaTriggerTypes.Cylinder:
return CylinderDatas.Radius;
return Math.Max(CylinderDatas.Radius, CylinderDatas.RadiusTarget);
case AreaTriggerTypes.Disk:
return Math.Max(DiskDatas.OuterRadius, DiskDatas.OuterRadiusTarget);
}
return 0.0f;
@@ -210,6 +227,7 @@ namespace Game.Entities
public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; }
public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; }
public bool IsCylinder() { return TriggerType == AreaTriggerTypes.Cylinder; }
public bool IsDisk() { return TriggerType == AreaTriggerTypes.Disk; }
}
public class AreaTriggerOrbitInfo
+3
View File
@@ -260,6 +260,7 @@ namespace Game.Misc
opt.OptionNPC = item.MenuItemIcon;
opt.OptionFlags = (byte)(item.IsCoded ? 1 : 0); // makes pop up box password
opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3
opt.OptionLanguage = item.Language;
opt.Text = item.Message; // text for gossip item
opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
opt.Status = GossipOptionStatus.Available;
@@ -701,6 +702,7 @@ namespace Game.Misc
public uint OptionType;
public string BoxMessage;
public uint BoxMoney;
public uint Language;
}
public class GossipMenuItemData
@@ -734,6 +736,7 @@ namespace Game.Misc
public uint OptionBroadcastTextId;
public GossipOption OptionType;
public NPCFlags OptionNpcFlag;
public uint Language;
public uint ActionMenuId;
public uint ActionPoiId;
public bool BoxCoded;
@@ -1219,24 +1219,23 @@ namespace Game.Entities
public UpdateField<int> LookAtControllerID = new(96, 115);
public UpdateField<int> TaxiNodesID = new(96, 116);
public UpdateField<ObjectGuid> GuildGUID = new(96, 117);
public UpdateField<ObjectGuid> SkinningOwnerGUID = new(96, 118);
public UpdateField<uint> SilencedSchoolMask = new(96, 119);
public UpdateField<ObjectGuid> NameplateAttachToGUID = new(96, 120); // When set, nameplate of this unit will instead appear on that object
public UpdateFieldArray<uint> NpcFlags = new(2, 121, 122);
public UpdateFieldArray<int> Power = new(7, 124, 125);
public UpdateFieldArray<uint> MaxPower = new(7, 124, 132);
public UpdateFieldArray<float> PowerRegenFlatModifier = new(7, 124, 139);
public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(7, 124, 146);
public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 153, 154);
public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 157, 158);
public UpdateFieldArray<int> Stats = new(4, 160, 161);
public UpdateFieldArray<int> StatPosBuff = new(4, 160, 165);
public UpdateFieldArray<int> StatNegBuff = new(4, 160, 169);
public UpdateFieldArray<int> Resistances = new(7, 173, 174);
public UpdateFieldArray<int> BonusResistanceMods = new(7, 173, 181);
public UpdateFieldArray<int> ManaCostModifier = new(7, 173, 188);
public UpdateField<uint> SilencedSchoolMask = new(96, 118);
public UpdateField<ObjectGuid> NameplateAttachToGUID = new(96, 119); // When set, nameplate of this unit will instead appear on that object
public UpdateFieldArray<uint> NpcFlags = new(2, 120, 121);
public UpdateFieldArray<int> Power = new(7, 123, 124);
public UpdateFieldArray<uint> MaxPower = new(7, 123, 131);
public UpdateFieldArray<float> PowerRegenFlatModifier = new(7, 123, 138);
public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(7, 123, 145);
public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 152, 153);
public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 156, 157);
public UpdateFieldArray<int> Stats = new(4, 159, 160);
public UpdateFieldArray<int> StatPosBuff = new(4, 159, 164);
public UpdateFieldArray<int> StatNegBuff = new(4, 159, 168);
public UpdateFieldArray<int> Resistances = new(7, 172, 173);
public UpdateFieldArray<int> BonusResistanceMods = new(7, 172, 180);
public UpdateFieldArray<int> ManaCostModifier = new(7, 172, 187);
public UnitData() : base(0, TypeId.Unit, 195) { }
public UnitData() : base(0, TypeId.Unit, 194) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{
@@ -1415,7 +1414,6 @@ namespace Game.Entities
data.WriteInt32(PassiveSpells.Size());
data.WriteInt32(WorldEffects.Size());
data.WriteInt32(ChannelObjects.Size());
data.WritePackedGuid(SkinningOwnerGUID);
data.WriteUInt32(SilencedSchoolMask);
data.WritePackedGuid(NameplateAttachToGUID);
@@ -1431,7 +1429,7 @@ namespace Game.Entities
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{
UpdateMask allowedMaskForTarget = new(195, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
UpdateMask allowedMaskForTarget = new(195, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1439,16 +1437,16 @@ namespace Game.Entities
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner))
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x1000007Eu, 0x01FFF800u, 0xFFFFFFFFu, 0x00000007u }));
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0x80FFFC00u, 0xFFFFFFFFu, 0x00000003u }));
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll))
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x10000000u, 0x01FFF800u, 0x00000000u, 0x00000000u }));
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x00FFFC00u, 0x00000000u, 0x00000000u }));
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath))
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x001FE000u, 0x00000000u }));
allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000FF000u, 0x00000000u }));
}
public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags)
{
UpdateMask allowedMaskForTarget = new(195, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
UpdateMask allowedMaskForTarget = new(195, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask.AND(allowedMaskForTarget);
}
@@ -1979,101 +1977,97 @@ namespace Game.Entities
data.WritePackedGuid(GuildGUID);
}
if (changesMask[118])
{
data.WritePackedGuid(SkinningOwnerGUID);
}
if (changesMask[119])
{
data.WriteUInt32(SilencedSchoolMask);
}
if (changesMask[120])
if (changesMask[119])
{
data.WritePackedGuid(NameplateAttachToGUID);
}
}
if (changesMask[121])
if (changesMask[120])
{
for (int i = 0; i < 2; ++i)
{
if (changesMask[122 + i])
if (changesMask[121 + i])
{
data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver));
}
}
}
if (changesMask[124])
if (changesMask[123])
{
for (int i = 0; i < 7; ++i)
{
if (changesMask[125 + i])
if (changesMask[124 + i])
{
data.WriteInt32(Power[i]);
}
if (changesMask[132 + i])
if (changesMask[131 + i])
{
data.WriteUInt32(MaxPower[i]);
}
if (changesMask[139 + i])
if (changesMask[138 + i])
{
data.WriteFloat(PowerRegenFlatModifier[i]);
}
if (changesMask[146 + i])
if (changesMask[145 + i])
{
data.WriteFloat(PowerRegenInterruptedFlatModifier[i]);
}
}
}
if (changesMask[153])
if (changesMask[152])
{
for (int i = 0; i < 3; ++i)
{
if (changesMask[154 + i])
if (changesMask[153 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[157])
if (changesMask[156])
{
for (int i = 0; i < 2; ++i)
{
if (changesMask[158 + i])
if (changesMask[157 + i])
{
data.WriteUInt32(AttackRoundBaseTime[i]);
}
}
}
if (changesMask[160])
if (changesMask[159])
{
for (int i = 0; i < 4; ++i)
{
if (changesMask[161 + i])
if (changesMask[160 + i])
{
data.WriteInt32(Stats[i]);
}
if (changesMask[165 + i])
if (changesMask[164 + i])
{
data.WriteInt32(StatPosBuff[i]);
}
if (changesMask[169 + i])
if (changesMask[168 + i])
{
data.WriteInt32(StatNegBuff[i]);
}
}
}
if (changesMask[173])
if (changesMask[172])
{
for (int i = 0; i < 7; ++i)
{
if (changesMask[174 + i])
if (changesMask[173 + i])
{
data.WriteInt32(Resistances[i]);
}
if (changesMask[181 + i])
if (changesMask[180 + i])
{
data.WriteInt32(BonusResistanceMods[i]);
}
if (changesMask[188 + i])
if (changesMask[187 + i])
{
data.WriteInt32(ManaCostModifier[i]);
}
@@ -2197,7 +2191,6 @@ namespace Game.Entities
ClearChangesMask(LookAtControllerID);
ClearChangesMask(TaxiNodesID);
ClearChangesMask(GuildGUID);
ClearChangesMask(SkinningOwnerGUID);
ClearChangesMask(SilencedSchoolMask);
ClearChangesMask(NameplateAttachToGUID);
ClearChangesMask(NpcFlags);
@@ -5140,22 +5133,22 @@ namespace Game.Entities
public class DynamicObjectData : BaseUpdateData<DynamicObject>
{
public UpdateField<ObjectGuid> Caster = new(0, 1);
public UpdateField<SpellCastVisualField> SpellVisual = new(0, 2);
public UpdateField<uint> SpellID = new(0, 3);
public UpdateField<float> Radius = new(0, 4);
public UpdateField<uint> CastTime = new(0, 5);
public UpdateField<byte> Type = new(0, 6);
public UpdateField<byte> Type = new(0, 2);
public UpdateField<SpellCastVisualField> SpellVisual = new(0, 3);
public UpdateField<uint> SpellID = new(0, 4);
public UpdateField<float> Radius = new(0, 5);
public UpdateField<uint> CastTime = new(0, 6);
public DynamicObjectData() : base(0, TypeId.DynamicObject, 7) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver)
{
data.WritePackedGuid(Caster);
data.WriteUInt8(Type);
((SpellCastVisualField)SpellVisual).WriteCreate(data, owner, receiver);
data.WriteUInt32(SpellID);
data.WriteFloat(Radius);
data.WriteUInt32(CastTime);
data.WriteUInt8(Type);
}
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver)
@@ -5176,23 +5169,23 @@ namespace Game.Entities
}
if (_changesMask[2])
{
((SpellCastVisualField)SpellVisual).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
data.WriteUInt8(Type);
}
if (_changesMask[3])
{
data.WriteUInt32(SpellID);
((SpellCastVisualField)SpellVisual).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (_changesMask[4])
{
data.WriteFloat(Radius);
data.WriteUInt32(SpellID);
}
if (_changesMask[5])
{
data.WriteUInt32(CastTime);
data.WriteFloat(Radius);
}
if (_changesMask[6])
{
data.WriteUInt8(Type);
data.WriteUInt32(CastTime);
}
}
}
@@ -5200,11 +5193,11 @@ namespace Game.Entities
public override void ClearChangesMask()
{
ClearChangesMask(Caster);
ClearChangesMask(Type);
ClearChangesMask(SpellVisual);
ClearChangesMask(SpellID);
ClearChangesMask(Radius);
ClearChangesMask(CastTime);
ClearChangesMask(Type);
_changesMask.ResetAll();
}
}
@@ -5511,10 +5504,12 @@ namespace Game.Entities
public UpdateField<float> BoundsRadius2D = new(0, 11);
public UpdateField<uint> DecalPropertiesID = new(0, 12);
public UpdateField<ObjectGuid> CreatingEffectGUID = new(0, 13);
public UpdateField<ObjectGuid> Field_80 = new(0, 14);
public UpdateField<VisualAnim> VisualAnim = new(0, 15);
public UpdateField<uint> Field_80 = new(0, 14);
public UpdateField<uint> Field_84 = new(0, 15);
public UpdateField<ObjectGuid> Field_88 = new(0, 16);
public UpdateField<VisualAnim> VisualAnim = new(0, 17);
public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 16) { }
public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 18) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver)
{
@@ -5532,7 +5527,11 @@ namespace Game.Entities
data.WriteFloat(BoundsRadius2D);
data.WriteUInt32(DecalPropertiesID);
data.WritePackedGuid(CreatingEffectGUID);
data.WriteUInt32(Field_80);
data.WriteUInt32(Field_84);
data.WritePackedGuid(Field_88);
((ScaleCurve)ExtraScaleCurve).WriteCreate(data, owner, receiver);
((VisualAnim)VisualAnim).WriteCreate(data, owner, receiver);
}
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver)
@@ -5542,7 +5541,7 @@ namespace Game.Entities
public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, AreaTrigger owner, Player receiver)
{
data.WriteBits(_changesMask.GetBlock(0), 14);
data.WriteBits(_changesMask.GetBlock(0), 18);
data.FlushBits();
if (_changesMask[0])
@@ -5595,10 +5594,26 @@ namespace Game.Entities
{
data.WritePackedGuid(CreatingEffectGUID);
}
if (changesMask[14])
{
data.WriteUInt32(Field_80);
}
if (changesMask[15])
{
data.WriteUInt32(Field_84);
}
if (changesMask[16])
{
data.WritePackedGuid(Field_88);
}
if (_changesMask[2])
{
((ScaleCurve)ExtraScaleCurve).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[17])
{
((VisualAnim)VisualAnim).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
@@ -5617,6 +5632,10 @@ namespace Game.Entities
ClearChangesMask(BoundsRadius2D);
ClearChangesMask(DecalPropertiesID);
ClearChangesMask(CreatingEffectGUID);
ClearChangesMask(Field_80);
ClearChangesMask(Field_84);
ClearChangesMask(Field_88);
ClearChangesMask(VisualAnim);
_changesMask.ResetAll();
}
}
+41 -2
View File
@@ -281,9 +281,14 @@ namespace Game.Entities
bool HasFallDirection = unit.HasUnitMovementFlag(MovementFlag.Falling);
bool HasFall = HasFallDirection || unit.m_movementInfo.jump.fallTime != 0;
bool HasSpline = unit.IsSplineEnabled();
bool HasInertia = unit.m_movementInfo.inertia.HasValue;
data.WritePackedGuid(GetGUID()); // MoverGUID
data.WriteUInt32((uint)unit.GetUnitMovementFlags());
data.WriteUInt32((uint)unit.GetUnitMovementFlags2());
data.WriteUInt32((uint)unit.GetExtraUnitMovementFlags2());
data.WriteUInt32(unit.m_movementInfo.Time); // MoveTime
data.WriteFloat(unit.GetPositionX());
data.WriteFloat(unit.GetPositionY());
@@ -299,17 +304,23 @@ namespace Game.Entities
//for (public uint i = 0; i < RemoveForcesIDs.Count; ++i)
// *data << ObjectGuid(RemoveForcesIDs);
data.WriteBits((uint)unit.GetUnitMovementFlags(), 30);
data.WriteBits((uint)unit.GetUnitMovementFlags2(), 18);
data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport
data.WriteBit(HasFall); // HasFall
data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid
data.WriteBit(HasInertia); // HasInertia
if (!unit.m_movementInfo.transport.guid.IsEmpty())
MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport);
if (HasInertia)
{
data.WritePackedGuid(unit.m_movementInfo.inertia.Value.guid);
data.WriteXYZ(unit.m_movementInfo.inertia.Value.force);
data.WriteUInt32(unit.m_movementInfo.inertia.Value.lifetime);
}
if (HasFall)
{
data.WriteUInt32(unit.m_movementInfo.jump.fallTime); // Time
@@ -440,6 +451,7 @@ namespace Game.Entities
bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon();
bool hasAreaTriggerCylinder = shape.IsCylinder();
bool hasDisk = shape.IsDisk();
bool hasAreaTriggerSpline = areaTrigger.HasSplines();
bool hasOrbit = areaTrigger.HasOrbit();
bool hasMovementScript = false;
@@ -459,6 +471,7 @@ namespace Game.Entities
data.WriteBit(hasAreaTriggerBox);
data.WriteBit(hasAreaTriggerPolygon);
data.WriteBit(hasAreaTriggerCylinder);
data.WriteBit(hasDisk);
data.WriteBit(hasAreaTriggerSpline);
data.WriteBit(hasOrbit);
data.WriteBit(hasMovementScript);
@@ -532,6 +545,18 @@ namespace Game.Entities
data.WriteFloat(shape.CylinderDatas.LocationZOffsetTarget);
}
if (hasDisk)
{
data.WriteFloat(shape.DiskDatas.InnerRadius);
data.WriteFloat(shape.DiskDatas.InnerRadiusTarget);
data.WriteFloat(shape.DiskDatas.OuterRadius);
data.WriteFloat(shape.DiskDatas.OuterRadiusTarget);
data.WriteFloat(shape.DiskDatas.Height);
data.WriteFloat(shape.DiskDatas.HeightTarget);
data.WriteFloat(shape.DiskDatas.LocationZOffset);
data.WriteFloat(shape.DiskDatas.LocationZOffsetTarget);
}
//if (hasMovementScript)
// *data << *areaTrigger.GetMovementScript(); // AreaTriggerMovementScriptInfo
@@ -3667,10 +3692,12 @@ namespace Game.Entities
public ObjectGuid Guid { get; set; }
MovementFlag flags;
MovementFlag2 flags2;
MovementFlags3 flags3;
public Position Pos { get; set; }
public uint Time { get; set; }
public TransportInfo transport;
public float Pitch { get; set; }
public Inertia? inertia;
public JumpInfo jump;
public float SplineElevation { get; set; }
@@ -3699,6 +3726,12 @@ namespace Game.Entities
public void RemoveMovementFlag2(MovementFlag2 f) { flags2 &= ~f; }
public bool HasMovementFlag2(MovementFlag2 f) { return (flags2 & f) != 0; }
public MovementFlags3 GetExtraMovementFlags2() { return flags3; }
public void SetExtraMovementFlags2(MovementFlags3 flag) { flags3 = flag; }
public void AddExtraMovementFlag2(MovementFlags3 flag) { flags3 |= flag; }
public void RemoveExtraMovementFlag2(MovementFlags3 flag) { flags3 &= ~flag; }
public bool HasExtraMovementFlag2(MovementFlags3 flag) { return (flags3 & flag) != 0; }
public void SetFallTime(uint time) { jump.fallTime = time; }
public void ResetTransport()
@@ -3730,6 +3763,12 @@ namespace Game.Entities
public uint prevTime;
public uint vehicleId;
}
public struct Inertia
{
public ObjectGuid guid;
public Position force;
public uint lifetime;
}
public struct JumpInfo
{
public void Reset()
+3 -1
View File
@@ -299,9 +299,11 @@ namespace Game.Entities
{
var activePetIndex = Array.FindIndex(petStable.ActivePets, pet => pet?.PetNumber == petnumber);
Cypher.Assert(petStable.CurrentPetIndex == 0);
Cypher.Assert(activePetIndex != -1);
// Check that we either have no pet (unsummoned by player) or it matches temporarily unsummoned pet by server (for example on flying mount)
Cypher.Assert(petStable.CurrentPetIndex == 0 || petStable.CurrentPetIndex == activePetIndex);
petStable.SetCurrentActivePetIndex((uint)activePetIndex);
}
@@ -1714,6 +1714,12 @@ namespace Game.Entities
m_movementInfo.SetMovementFlags2(f);
}
public void AddExtraUnitMovementFlag2(MovementFlags3 f) { m_movementInfo.AddExtraMovementFlag2(f); }
public void RemoveExtraUnitMovementFlag2(MovementFlags3 f) { m_movementInfo.RemoveExtraMovementFlag2(f); }
public bool HasExtraUnitMovementFlag2(MovementFlags3 f) { return m_movementInfo.HasExtraMovementFlag2(f); }
public MovementFlags3 GetExtraUnitMovementFlags2() { return m_movementInfo.GetExtraMovementFlags2(); }
public void SetExtraUnitMovementFlags2(MovementFlags3 f) { m_movementInfo.SetExtraMovementFlags2(f); }
//Spline
public bool IsSplineEnabled()
{
+3 -1
View File
@@ -242,7 +242,7 @@ namespace Game.Entities
_spellHistory.Update();
}
public void HandleEmoteCommand(Emote emoteId, Player target = null, uint[] spellVisualKitIds = null)
public void HandleEmoteCommand(Emote emoteId, Player target = null, uint[] spellVisualKitIds = null, int sequenceVariation = 0)
{
EmoteMessage packet = new();
packet.Guid = GetGUID();
@@ -253,6 +253,8 @@ namespace Game.Entities
if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial)
packet.SpellVisualKitIDs.AddRange(spellVisualKitIds);
packet.SequenceVariation = sequenceVariation;
if (target != null)
target.SendPacket(packet);
else