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
+4 -3
View File
@@ -31,12 +31,13 @@ namespace Framework.Constants
PerCharacterTtsCache = 9, PerCharacterTtsCache = 9,
GlobalFlaggedCache = 10, GlobalFlaggedCache = 10,
PerCharacterFlaggedCache = 11, PerCharacterFlaggedCache = 11,
PerCharacterClickBindingsCache = 12,
Max = 12, Max = 13,
AllAccountDataCacheMask = 0xFFF, AllAccountDataCacheMask = 0x1FFF,
GlobalCacheMask = 0x515, GlobalCacheMask = 0x515,
PerCharacterCacheMask = 0xAEA PerCharacterCacheMask = 0x1AEA
} }
public enum TutorialAction public enum TutorialAction
@@ -40,7 +40,8 @@ namespace Framework.Constants
Unk = 2, Unk = 2,
Polygon = 3, Polygon = 3,
Cylinder = 4, Cylinder = 4,
Max = 5 Disk = 5,
Max
} }
public enum AreaTriggerActionTypes public enum AreaTriggerActionTypes
@@ -93,4 +93,11 @@ namespace Framework.Constants
InterpolatedTurning = 0x40000, InterpolatedTurning = 0x40000,
InterpolatedPitching = 0x80000 InterpolatedPitching = 0x80000
} }
[Flags]
public enum MovementFlags3
{
None = 0x00,
DisableInertia = 0x01,
}
} }
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -213,7 +213,7 @@ namespace Framework.Constants
/// <summary> /// <summary>
/// AreaTrigger Const /// AreaTrigger Const
/// </summary> /// </summary>
public const int MaxAreatriggerEntityData = 6; public const int MaxAreatriggerEntityData = 8;
public const int MaxAreatriggerScale = 7; public const int MaxAreatriggerScale = 7;
/// <summary> /// <summary>
+7 -4
View File
@@ -19,6 +19,7 @@ using Framework.Constants;
using Game.Entities; using Game.Entities;
using Game.Groups; using Game.Groups;
using Game.Maps; using Game.Maps;
using Game.Networking.Packets;
using Game.Scripting; using Game.Scripting;
namespace Game.DungeonFinding namespace Game.DungeonFinding
@@ -84,13 +85,15 @@ namespace Game.DungeonFinding
return; return;
} }
for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.Next()) QueryPlayerNameResponse response = new();
foreach (MemberSlot memberSlot in group.GetMemberSlots())
{ {
Player member = refe.GetSource(); player.GetSession().BuildNameQueryData(memberSlot.guid, out NameCacheLookupResult nameCacheLookupResult);
if (member) response.Players.Add(nameCacheLookupResult);
player.GetSession().SendNameQuery(member.GetGUID());
} }
player.SendPacket(response);
if (Global.LFGMgr.SelectedRandomLfgDungeon(player.GetGUID())) if (Global.LFGMgr.SelectedRandomLfgDungeon(player.GetGUID()))
player.CastSpell(player, SharedConst.LFGSpellLuckOfTheDraw, true); player.CastSpell(player, SharedConst.LFGSpellLuckOfTheDraw, true);
} }
@@ -370,6 +370,9 @@ namespace Game.Entities
case AreaTriggerTypes.Cylinder: case AreaTriggerTypes.Cylinder:
SearchUnitInCylinder(targetList); SearchUnitInCylinder(targetList);
break; break;
case AreaTriggerTypes.Disk:
SearchUnitInDisk(targetList);
break;
default: default:
break; break;
} }
@@ -452,6 +455,18 @@ namespace Game.Entities
targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ); 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) void HandleUnitEnterExit(List<Unit> newTargetList)
{ {
List<ObjectGuid> exitUnits = _insideUnits; List<ObjectGuid> exitUnits = _insideUnits;
@@ -44,6 +44,9 @@ namespace Game.Entities
[FieldOffset(0)] [FieldOffset(0)]
public cylinderdatas CylinderDatas; public cylinderdatas CylinderDatas;
[FieldOffset(0)]
public diskDatas DiskDatas;
public struct defaultdatas public struct defaultdatas
{ {
public fixed float Data[SharedConst.MaxAreatriggerEntityData]; public fixed float Data[SharedConst.MaxAreatriggerEntityData];
@@ -80,6 +83,18 @@ namespace Game.Entities
public float LocationZOffset; public float LocationZOffset;
public float LocationZOffsetTarget; 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> /// <summary>
@@ -200,7 +215,9 @@ namespace Game.Entities
case AreaTriggerTypes.Box: case AreaTriggerTypes.Box:
return MathF.Sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4); return MathF.Sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
case AreaTriggerTypes.Cylinder: 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; return 0.0f;
@@ -210,6 +227,7 @@ namespace Game.Entities
public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; } public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; }
public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; } public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; }
public bool IsCylinder() { return TriggerType == AreaTriggerTypes.Cylinder; } public bool IsCylinder() { return TriggerType == AreaTriggerTypes.Cylinder; }
public bool IsDisk() { return TriggerType == AreaTriggerTypes.Disk; }
} }
public class AreaTriggerOrbitInfo public class AreaTriggerOrbitInfo
+3
View File
@@ -260,6 +260,7 @@ namespace Game.Misc
opt.OptionNPC = item.MenuItemIcon; opt.OptionNPC = item.MenuItemIcon;
opt.OptionFlags = (byte)(item.IsCoded ? 1 : 0); // makes pop up box password 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.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.Text = item.Message; // text for gossip item
opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3 opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
opt.Status = GossipOptionStatus.Available; opt.Status = GossipOptionStatus.Available;
@@ -701,6 +702,7 @@ namespace Game.Misc
public uint OptionType; public uint OptionType;
public string BoxMessage; public string BoxMessage;
public uint BoxMoney; public uint BoxMoney;
public uint Language;
} }
public class GossipMenuItemData public class GossipMenuItemData
@@ -734,6 +736,7 @@ namespace Game.Misc
public uint OptionBroadcastTextId; public uint OptionBroadcastTextId;
public GossipOption OptionType; public GossipOption OptionType;
public NPCFlags OptionNpcFlag; public NPCFlags OptionNpcFlag;
public uint Language;
public uint ActionMenuId; public uint ActionMenuId;
public uint ActionPoiId; public uint ActionPoiId;
public bool BoxCoded; public bool BoxCoded;
@@ -1219,24 +1219,23 @@ namespace Game.Entities
public UpdateField<int> LookAtControllerID = new(96, 115); public UpdateField<int> LookAtControllerID = new(96, 115);
public UpdateField<int> TaxiNodesID = new(96, 116); public UpdateField<int> TaxiNodesID = new(96, 116);
public UpdateField<ObjectGuid> GuildGUID = new(96, 117); public UpdateField<ObjectGuid> GuildGUID = new(96, 117);
public UpdateField<ObjectGuid> SkinningOwnerGUID = new(96, 118); public UpdateField<uint> SilencedSchoolMask = new(96, 118);
public UpdateField<uint> SilencedSchoolMask = new(96, 119); public UpdateField<ObjectGuid> NameplateAttachToGUID = new(96, 119); // When set, nameplate of this unit will instead appear on that object
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, 120, 121);
public UpdateFieldArray<uint> NpcFlags = new(2, 121, 122); public UpdateFieldArray<int> Power = new(7, 123, 124);
public UpdateFieldArray<int> Power = new(7, 124, 125); public UpdateFieldArray<uint> MaxPower = new(7, 123, 131);
public UpdateFieldArray<uint> MaxPower = new(7, 124, 132); public UpdateFieldArray<float> PowerRegenFlatModifier = new(7, 123, 138);
public UpdateFieldArray<float> PowerRegenFlatModifier = new(7, 124, 139); public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(7, 123, 145);
public UpdateFieldArray<float> PowerRegenInterruptedFlatModifier = new(7, 124, 146); public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 152, 153);
public UpdateFieldArray<VisibleItem> VirtualItems = new(3, 153, 154); public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 156, 157);
public UpdateFieldArray<uint> AttackRoundBaseTime = new(2, 157, 158); public UpdateFieldArray<int> Stats = new(4, 159, 160);
public UpdateFieldArray<int> Stats = new(4, 160, 161); public UpdateFieldArray<int> StatPosBuff = new(4, 159, 164);
public UpdateFieldArray<int> StatPosBuff = new(4, 160, 165); public UpdateFieldArray<int> StatNegBuff = new(4, 159, 168);
public UpdateFieldArray<int> StatNegBuff = new(4, 160, 169); public UpdateFieldArray<int> Resistances = new(7, 172, 173);
public UpdateFieldArray<int> Resistances = new(7, 173, 174); public UpdateFieldArray<int> BonusResistanceMods = new(7, 172, 180);
public UpdateFieldArray<int> BonusResistanceMods = new(7, 173, 181); public UpdateFieldArray<int> ManaCostModifier = new(7, 172, 187);
public UpdateFieldArray<int> ManaCostModifier = new(7, 173, 188);
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) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver)
{ {
@@ -1415,7 +1414,6 @@ namespace Game.Entities
data.WriteInt32(PassiveSpells.Size()); data.WriteInt32(PassiveSpells.Size());
data.WriteInt32(WorldEffects.Size()); data.WriteInt32(WorldEffects.Size());
data.WriteInt32(ChannelObjects.Size()); data.WriteInt32(ChannelObjects.Size());
data.WritePackedGuid(SkinningOwnerGUID);
data.WriteUInt32(SilencedSchoolMask); data.WriteUInt32(SilencedSchoolMask);
data.WritePackedGuid(NameplateAttachToGUID); data.WritePackedGuid(NameplateAttachToGUID);
@@ -1431,7 +1429,7 @@ namespace Game.Entities
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) 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); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
} }
@@ -1439,16 +1437,16 @@ namespace Game.Entities
public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags)
{ {
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) 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)) 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)) 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) 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); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask.AND(allowedMaskForTarget); changesMask.AND(allowedMaskForTarget);
} }
@@ -1979,101 +1977,97 @@ namespace Game.Entities
data.WritePackedGuid(GuildGUID); data.WritePackedGuid(GuildGUID);
} }
if (changesMask[118]) if (changesMask[118])
{
data.WritePackedGuid(SkinningOwnerGUID);
}
if (changesMask[119])
{ {
data.WriteUInt32(SilencedSchoolMask); data.WriteUInt32(SilencedSchoolMask);
} }
if (changesMask[120]) if (changesMask[119])
{ {
data.WritePackedGuid(NameplateAttachToGUID); data.WritePackedGuid(NameplateAttachToGUID);
} }
} }
if (changesMask[121]) if (changesMask[120])
{ {
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
{ {
if (changesMask[122 + i]) if (changesMask[121 + i])
{ {
data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver)); data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver));
} }
} }
} }
if (changesMask[124]) if (changesMask[123])
{ {
for (int i = 0; i < 7; ++i) for (int i = 0; i < 7; ++i)
{ {
if (changesMask[125 + i]) if (changesMask[124 + i])
{ {
data.WriteInt32(Power[i]); data.WriteInt32(Power[i]);
} }
if (changesMask[132 + i]) if (changesMask[131 + i])
{ {
data.WriteUInt32(MaxPower[i]); data.WriteUInt32(MaxPower[i]);
} }
if (changesMask[139 + i]) if (changesMask[138 + i])
{ {
data.WriteFloat(PowerRegenFlatModifier[i]); data.WriteFloat(PowerRegenFlatModifier[i]);
} }
if (changesMask[146 + i]) if (changesMask[145 + i])
{ {
data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); data.WriteFloat(PowerRegenInterruptedFlatModifier[i]);
} }
} }
} }
if (changesMask[153]) if (changesMask[152])
{ {
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
{ {
if (changesMask[154 + i]) if (changesMask[153 + i])
{ {
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
} }
} }
} }
if (changesMask[157]) if (changesMask[156])
{ {
for (int i = 0; i < 2; ++i) for (int i = 0; i < 2; ++i)
{ {
if (changesMask[158 + i]) if (changesMask[157 + i])
{ {
data.WriteUInt32(AttackRoundBaseTime[i]); data.WriteUInt32(AttackRoundBaseTime[i]);
} }
} }
} }
if (changesMask[160]) if (changesMask[159])
{ {
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
if (changesMask[161 + i]) if (changesMask[160 + i])
{ {
data.WriteInt32(Stats[i]); data.WriteInt32(Stats[i]);
} }
if (changesMask[165 + i]) if (changesMask[164 + i])
{ {
data.WriteInt32(StatPosBuff[i]); data.WriteInt32(StatPosBuff[i]);
} }
if (changesMask[169 + i]) if (changesMask[168 + i])
{ {
data.WriteInt32(StatNegBuff[i]); data.WriteInt32(StatNegBuff[i]);
} }
} }
} }
if (changesMask[173]) if (changesMask[172])
{ {
for (int i = 0; i < 7; ++i) for (int i = 0; i < 7; ++i)
{ {
if (changesMask[174 + i]) if (changesMask[173 + i])
{ {
data.WriteInt32(Resistances[i]); data.WriteInt32(Resistances[i]);
} }
if (changesMask[181 + i]) if (changesMask[180 + i])
{ {
data.WriteInt32(BonusResistanceMods[i]); data.WriteInt32(BonusResistanceMods[i]);
} }
if (changesMask[188 + i]) if (changesMask[187 + i])
{ {
data.WriteInt32(ManaCostModifier[i]); data.WriteInt32(ManaCostModifier[i]);
} }
@@ -2197,7 +2191,6 @@ namespace Game.Entities
ClearChangesMask(LookAtControllerID); ClearChangesMask(LookAtControllerID);
ClearChangesMask(TaxiNodesID); ClearChangesMask(TaxiNodesID);
ClearChangesMask(GuildGUID); ClearChangesMask(GuildGUID);
ClearChangesMask(SkinningOwnerGUID);
ClearChangesMask(SilencedSchoolMask); ClearChangesMask(SilencedSchoolMask);
ClearChangesMask(NameplateAttachToGUID); ClearChangesMask(NameplateAttachToGUID);
ClearChangesMask(NpcFlags); ClearChangesMask(NpcFlags);
@@ -5140,22 +5133,22 @@ namespace Game.Entities
public class DynamicObjectData : BaseUpdateData<DynamicObject> public class DynamicObjectData : BaseUpdateData<DynamicObject>
{ {
public UpdateField<ObjectGuid> Caster = new(0, 1); public UpdateField<ObjectGuid> Caster = new(0, 1);
public UpdateField<SpellCastVisualField> SpellVisual = new(0, 2); public UpdateField<byte> Type = new(0, 2);
public UpdateField<uint> SpellID = new(0, 3); public UpdateField<SpellCastVisualField> SpellVisual = new(0, 3);
public UpdateField<float> Radius = new(0, 4); public UpdateField<uint> SpellID = new(0, 4);
public UpdateField<uint> CastTime = new(0, 5); public UpdateField<float> Radius = new(0, 5);
public UpdateField<byte> Type = new(0, 6); public UpdateField<uint> CastTime = new(0, 6);
public DynamicObjectData() : base(0, TypeId.DynamicObject, 7) { } public DynamicObjectData() : base(0, TypeId.DynamicObject, 7) { }
public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver)
{ {
data.WritePackedGuid(Caster); data.WritePackedGuid(Caster);
data.WriteUInt8(Type);
((SpellCastVisualField)SpellVisual).WriteCreate(data, owner, receiver); ((SpellCastVisualField)SpellVisual).WriteCreate(data, owner, receiver);
data.WriteUInt32(SpellID); data.WriteUInt32(SpellID);
data.WriteFloat(Radius); data.WriteFloat(Radius);
data.WriteUInt32(CastTime); data.WriteUInt32(CastTime);
data.WriteUInt8(Type);
} }
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver) public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, DynamicObject owner, Player receiver)
@@ -5176,23 +5169,23 @@ namespace Game.Entities
} }
if (_changesMask[2]) if (_changesMask[2])
{ {
((SpellCastVisualField)SpellVisual).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); data.WriteUInt8(Type);
} }
if (_changesMask[3]) if (_changesMask[3])
{ {
data.WriteUInt32(SpellID); ((SpellCastVisualField)SpellVisual).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
} }
if (_changesMask[4]) if (_changesMask[4])
{ {
data.WriteFloat(Radius); data.WriteUInt32(SpellID);
} }
if (_changesMask[5]) if (_changesMask[5])
{ {
data.WriteUInt32(CastTime); data.WriteFloat(Radius);
} }
if (_changesMask[6]) if (_changesMask[6])
{ {
data.WriteUInt8(Type); data.WriteUInt32(CastTime);
} }
} }
} }
@@ -5200,11 +5193,11 @@ namespace Game.Entities
public override void ClearChangesMask() public override void ClearChangesMask()
{ {
ClearChangesMask(Caster); ClearChangesMask(Caster);
ClearChangesMask(Type);
ClearChangesMask(SpellVisual); ClearChangesMask(SpellVisual);
ClearChangesMask(SpellID); ClearChangesMask(SpellID);
ClearChangesMask(Radius); ClearChangesMask(Radius);
ClearChangesMask(CastTime); ClearChangesMask(CastTime);
ClearChangesMask(Type);
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
} }
@@ -5511,10 +5504,12 @@ namespace Game.Entities
public UpdateField<float> BoundsRadius2D = new(0, 11); public UpdateField<float> BoundsRadius2D = new(0, 11);
public UpdateField<uint> DecalPropertiesID = new(0, 12); public UpdateField<uint> DecalPropertiesID = new(0, 12);
public UpdateField<ObjectGuid> CreatingEffectGUID = new(0, 13); public UpdateField<ObjectGuid> CreatingEffectGUID = new(0, 13);
public UpdateField<ObjectGuid> Field_80 = new(0, 14); public UpdateField<uint> Field_80 = new(0, 14);
public UpdateField<VisualAnim> VisualAnim = new(0, 15); 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) public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver)
{ {
@@ -5532,7 +5527,11 @@ namespace Game.Entities
data.WriteFloat(BoundsRadius2D); data.WriteFloat(BoundsRadius2D);
data.WriteUInt32(DecalPropertiesID); data.WriteUInt32(DecalPropertiesID);
data.WritePackedGuid(CreatingEffectGUID); data.WritePackedGuid(CreatingEffectGUID);
data.WriteUInt32(Field_80);
data.WriteUInt32(Field_84);
data.WritePackedGuid(Field_88);
((ScaleCurve)ExtraScaleCurve).WriteCreate(data, owner, receiver); ((ScaleCurve)ExtraScaleCurve).WriteCreate(data, owner, receiver);
((VisualAnim)VisualAnim).WriteCreate(data, owner, receiver);
} }
public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player 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) 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(); data.FlushBits();
if (_changesMask[0]) if (_changesMask[0])
@@ -5595,10 +5594,26 @@ namespace Game.Entities
{ {
data.WritePackedGuid(CreatingEffectGUID); 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]) if (_changesMask[2])
{ {
((ScaleCurve)ExtraScaleCurve).WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); ((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(BoundsRadius2D);
ClearChangesMask(DecalPropertiesID); ClearChangesMask(DecalPropertiesID);
ClearChangesMask(CreatingEffectGUID); ClearChangesMask(CreatingEffectGUID);
ClearChangesMask(Field_80);
ClearChangesMask(Field_84);
ClearChangesMask(Field_88);
ClearChangesMask(VisualAnim);
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
} }
+41 -2
View File
@@ -281,9 +281,14 @@ namespace Game.Entities
bool HasFallDirection = unit.HasUnitMovementFlag(MovementFlag.Falling); bool HasFallDirection = unit.HasUnitMovementFlag(MovementFlag.Falling);
bool HasFall = HasFallDirection || unit.m_movementInfo.jump.fallTime != 0; bool HasFall = HasFallDirection || unit.m_movementInfo.jump.fallTime != 0;
bool HasSpline = unit.IsSplineEnabled(); bool HasSpline = unit.IsSplineEnabled();
bool HasInertia = unit.m_movementInfo.inertia.HasValue;
data.WritePackedGuid(GetGUID()); // MoverGUID 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.WriteUInt32(unit.m_movementInfo.Time); // MoveTime
data.WriteFloat(unit.GetPositionX()); data.WriteFloat(unit.GetPositionX());
data.WriteFloat(unit.GetPositionY()); data.WriteFloat(unit.GetPositionY());
@@ -299,17 +304,23 @@ namespace Game.Entities
//for (public uint i = 0; i < RemoveForcesIDs.Count; ++i) //for (public uint i = 0; i < RemoveForcesIDs.Count; ++i)
// *data << ObjectGuid(RemoveForcesIDs); // *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(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport
data.WriteBit(HasFall); // HasFall data.WriteBit(HasFall); // HasFall
data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
data.WriteBit(false); // HeightChangeFailed data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
data.WriteBit(HasInertia); // HasInertia
if (!unit.m_movementInfo.transport.guid.IsEmpty()) if (!unit.m_movementInfo.transport.guid.IsEmpty())
MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport); 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) if (HasFall)
{ {
data.WriteUInt32(unit.m_movementInfo.jump.fallTime); // Time data.WriteUInt32(unit.m_movementInfo.jump.fallTime); // Time
@@ -440,6 +451,7 @@ namespace Game.Entities
bool hasAreaTriggerBox = shape.IsBox(); bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon(); bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon();
bool hasAreaTriggerCylinder = shape.IsCylinder(); bool hasAreaTriggerCylinder = shape.IsCylinder();
bool hasDisk = shape.IsDisk();
bool hasAreaTriggerSpline = areaTrigger.HasSplines(); bool hasAreaTriggerSpline = areaTrigger.HasSplines();
bool hasOrbit = areaTrigger.HasOrbit(); bool hasOrbit = areaTrigger.HasOrbit();
bool hasMovementScript = false; bool hasMovementScript = false;
@@ -459,6 +471,7 @@ namespace Game.Entities
data.WriteBit(hasAreaTriggerBox); data.WriteBit(hasAreaTriggerBox);
data.WriteBit(hasAreaTriggerPolygon); data.WriteBit(hasAreaTriggerPolygon);
data.WriteBit(hasAreaTriggerCylinder); data.WriteBit(hasAreaTriggerCylinder);
data.WriteBit(hasDisk);
data.WriteBit(hasAreaTriggerSpline); data.WriteBit(hasAreaTriggerSpline);
data.WriteBit(hasOrbit); data.WriteBit(hasOrbit);
data.WriteBit(hasMovementScript); data.WriteBit(hasMovementScript);
@@ -532,6 +545,18 @@ namespace Game.Entities
data.WriteFloat(shape.CylinderDatas.LocationZOffsetTarget); 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) //if (hasMovementScript)
// *data << *areaTrigger.GetMovementScript(); // AreaTriggerMovementScriptInfo // *data << *areaTrigger.GetMovementScript(); // AreaTriggerMovementScriptInfo
@@ -3667,10 +3692,12 @@ namespace Game.Entities
public ObjectGuid Guid { get; set; } public ObjectGuid Guid { get; set; }
MovementFlag flags; MovementFlag flags;
MovementFlag2 flags2; MovementFlag2 flags2;
MovementFlags3 flags3;
public Position Pos { get; set; } public Position Pos { get; set; }
public uint Time { get; set; } public uint Time { get; set; }
public TransportInfo transport; public TransportInfo transport;
public float Pitch { get; set; } public float Pitch { get; set; }
public Inertia? inertia;
public JumpInfo jump; public JumpInfo jump;
public float SplineElevation { get; set; } public float SplineElevation { get; set; }
@@ -3699,6 +3726,12 @@ namespace Game.Entities
public void RemoveMovementFlag2(MovementFlag2 f) { flags2 &= ~f; } public void RemoveMovementFlag2(MovementFlag2 f) { flags2 &= ~f; }
public bool HasMovementFlag2(MovementFlag2 f) { return (flags2 & f) != 0; } 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 SetFallTime(uint time) { jump.fallTime = time; }
public void ResetTransport() public void ResetTransport()
@@ -3730,6 +3763,12 @@ namespace Game.Entities
public uint prevTime; public uint prevTime;
public uint vehicleId; public uint vehicleId;
} }
public struct Inertia
{
public ObjectGuid guid;
public Position force;
public uint lifetime;
}
public struct JumpInfo public struct JumpInfo
{ {
public void Reset() public void Reset()
+3 -1
View File
@@ -299,9 +299,11 @@ namespace Game.Entities
{ {
var activePetIndex = Array.FindIndex(petStable.ActivePets, pet => pet?.PetNumber == petnumber); var activePetIndex = Array.FindIndex(petStable.ActivePets, pet => pet?.PetNumber == petnumber);
Cypher.Assert(petStable.CurrentPetIndex == 0);
Cypher.Assert(activePetIndex != -1); 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); petStable.SetCurrentActivePetIndex((uint)activePetIndex);
} }
@@ -1714,6 +1714,12 @@ namespace Game.Entities
m_movementInfo.SetMovementFlags2(f); 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 //Spline
public bool IsSplineEnabled() public bool IsSplineEnabled()
{ {
+3 -1
View File
@@ -242,7 +242,7 @@ namespace Game.Entities
_spellHistory.Update(); _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(); EmoteMessage packet = new();
packet.Guid = GetGUID(); packet.Guid = GetGUID();
@@ -253,6 +253,8 @@ namespace Game.Entities
if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial) if (emotesEntry.AnimId == (uint)Anim.MountSpecial || emotesEntry.AnimId == (uint)Anim.MountSelfSpecial)
packet.SpellVisualKitIDs.AddRange(spellVisualKitIds); packet.SpellVisualKitIDs.AddRange(spellVisualKitIds);
packet.SequenceVariation = sequenceVariation;
if (target != null) if (target != null)
target.SendPacket(packet); target.SendPacket(packet);
else else
+30 -20
View File
@@ -597,14 +597,9 @@ namespace Game
gossipMenuItemsStorage.Clear(); gossipMenuItemsStorage.Clear();
// 0 1 2 3 4 5 6 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
SQLResult result = DB.World.Query("SELECT o.MenuId, o.OptionIndex, o.OptionIcon, o.OptionText, o.OptionBroadcastTextId, o.OptionType, o.OptionNpcFlag, " + SQLResult result = DB.World.Query("SELECT MenuID, OptionID, OptionIcon, OptionText, OptionBroadcastTextID, OptionType, OptionNpcFlag, Language, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID " +
// 7 8 9 10 11 12 "FROM gossip_menu_option ORDER BY MenuID, OptionID");
"oa.ActionMenuId, oa.ActionPoiId, ob.BoxCoded, ob.BoxMoney, ob.BoxText, ob.BoxBroadcastTextId " +
"FROM gossip_menu_option o " +
"LEFT JOIN gossip_menu_option_action oa ON o.MenuId = oa.MenuId AND o.OptionIndex = oa.OptionIndex " +
"LEFT JOIN gossip_menu_option_box ob ON o.MenuId = ob.MenuId AND o.OptionIndex = ob.OptionIndex " +
"ORDER BY o.MenuId, o.OptionIndex");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
@@ -623,12 +618,13 @@ namespace Game
gMenuItem.OptionBroadcastTextId = result.Read<uint>(4); gMenuItem.OptionBroadcastTextId = result.Read<uint>(4);
gMenuItem.OptionType = (GossipOption)result.Read<uint>(5); gMenuItem.OptionType = (GossipOption)result.Read<uint>(5);
gMenuItem.OptionNpcFlag = (NPCFlags)result.Read<ulong>(6); gMenuItem.OptionNpcFlag = (NPCFlags)result.Read<ulong>(6);
gMenuItem.ActionMenuId = result.Read<uint>(7); gMenuItem.Language = result.Read<uint>(7);
gMenuItem.ActionPoiId = result.Read<uint>(8); gMenuItem.ActionMenuId = result.Read<uint>(8);
gMenuItem.BoxCoded = result.Read<bool>(9); gMenuItem.ActionPoiId = result.Read<uint>(9);
gMenuItem.BoxMoney = result.Read<uint>(10); gMenuItem.BoxCoded = result.Read<bool>(10);
gMenuItem.BoxText = result.Read<string>(11); gMenuItem.BoxMoney = result.Read<uint>(11);
gMenuItem.BoxBroadcastTextId = result.Read<uint>(12); gMenuItem.BoxText = result.Read<string>(12);
gMenuItem.BoxBroadcastTextId = result.Read<uint>(13);
if (gMenuItem.OptionIcon >= GossipOptionIcon.Max) if (gMenuItem.OptionIcon >= GossipOptionIcon.Max)
{ {
@@ -648,6 +644,12 @@ namespace Game
if (gMenuItem.OptionType >= GossipOption.Max) if (gMenuItem.OptionType >= GossipOption.Max)
Log.outError(LogFilter.Sql, $"Table gossip_menu_option for MenuId {gMenuItem.MenuId}, OptionIndex {gMenuItem.OptionId} has unknown option id {gMenuItem.OptionType}. Option will not be used"); Log.outError(LogFilter.Sql, $"Table gossip_menu_option for MenuId {gMenuItem.MenuId}, OptionIndex {gMenuItem.OptionId} has unknown option id {gMenuItem.OptionType}. Option will not be used");
if (gMenuItem.Language != 0 && !CliDB.LanguagesStorage.ContainsKey(gMenuItem.Language))
{
Log.outError(LogFilter.Sql, $"Table `gossip_menu_option` for menu {gMenuItem.MenuId}, id {gMenuItem.OptionId} use non-existing Language {gMenuItem.Language}, ignoring");
gMenuItem.Language = 0;
}
if (gMenuItem.ActionPoiId != 0 && GetPointOfInterest(gMenuItem.ActionPoiId) == null) if (gMenuItem.ActionPoiId != 0 && GetPointOfInterest(gMenuItem.ActionPoiId) == null)
{ {
Log.outError(LogFilter.Sql, $"Table gossip_menu_option for MenuId {gMenuItem.MenuId}, OptionIndex {gMenuItem.OptionId} use non-existing actionpoiid {gMenuItem.ActionPoiId}, ignoring"); Log.outError(LogFilter.Sql, $"Table gossip_menu_option for MenuId {gMenuItem.MenuId}, OptionIndex {gMenuItem.OptionId} use non-existing actionpoiid {gMenuItem.ActionPoiId}, ignoring");
@@ -9550,7 +9552,7 @@ namespace Game
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
_playerChoices.Clear(); _playerChoices.Clear();
SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, SoundKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, SoundKitId, CloseSoundKitId, Duration, Question, PendingChoiceText, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice");
if (choiceResult.IsEmpty()) if (choiceResult.IsEmpty())
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty.");
@@ -9571,9 +9573,12 @@ namespace Game
choice.ChoiceId = choiceResult.Read<int>(0); choice.ChoiceId = choiceResult.Read<int>(0);
choice.UiTextureKitId = choiceResult.Read<int>(1); choice.UiTextureKitId = choiceResult.Read<int>(1);
choice.SoundKitId = choiceResult.Read<uint>(2); choice.SoundKitId = choiceResult.Read<uint>(2);
choice.Question = choiceResult.Read<string>(3); choice.CloseSoundKitId = choiceResult.Read<uint>(3);
choice.HideWarboardHeader = choiceResult.Read<bool>(4); choice.Duration = choiceResult.Read<long>(4);
choice.KeepOpenAfterChoice = choiceResult.Read<bool>(5); choice.Question = choiceResult.Read<string>(5);
choice.PendingChoiceText = choiceResult.Read<string>(6);
choice.HideWarboardHeader = choiceResult.Read<bool>(7);
choice.KeepOpenAfterChoice = choiceResult.Read<bool>(8);
_playerChoices[choice.ChoiceId] = choice; _playerChoices[choice.ChoiceId] = choice;
@@ -9887,7 +9892,9 @@ namespace Game
PlayerChoiceResponseMawPower mawPower = new(); PlayerChoiceResponseMawPower mawPower = new();
mawPower.TypeArtFileID = mawPowersResult.Read<int>(2); mawPower.TypeArtFileID = mawPowersResult.Read<int>(2);
if (!mawPowersResult.IsNull(3))
mawPower.Rarity = mawPowersResult.Read<int>(3); mawPower.Rarity = mawPowersResult.Read<int>(3);
if (!mawPowersResult.IsNull(4))
mawPower.RarityColor = mawPowersResult.Read<uint>(4); mawPower.RarityColor = mawPowersResult.Read<uint>(4);
mawPower.SpellID = mawPowersResult.Read<int>(5); mawPower.SpellID = mawPowersResult.Read<int>(5);
mawPower.MaxStacks = mawPowersResult.Read<int>(6); mawPower.MaxStacks = mawPowersResult.Read<int>(6);
@@ -11805,8 +11812,8 @@ namespace Game
public struct PlayerChoiceResponseMawPower public struct PlayerChoiceResponseMawPower
{ {
public int TypeArtFileID; public int TypeArtFileID;
public int Rarity; public int? Rarity;
public uint RarityColor; public uint? RarityColor;
public int SpellID; public int SpellID;
public int MaxStacks; public int MaxStacks;
} }
@@ -11843,7 +11850,10 @@ namespace Game
public int ChoiceId; public int ChoiceId;
public int UiTextureKitId; public int UiTextureKitId;
public uint SoundKitId; public uint SoundKitId;
public uint CloseSoundKitId;
public long Duration;
public string Question; public string Question;
public string PendingChoiceText;
public List<PlayerChoiceResponse> Responses = new(); public List<PlayerChoiceResponse> Responses = new();
public bool HideWarboardHeader; public bool HideWarboardHeader;
public bool KeepOpenAfterChoice; public bool KeepOpenAfterChoice;
+6 -7
View File
@@ -148,7 +148,7 @@ namespace Game.Guilds
{ {
SQLTransaction trans = new(); SQLTransaction trans = new();
m_achievementSys.SaveToDB(trans); GetAchievementMgr().SaveToDB(trans);
DB.Characters.CommitTransaction(trans); DB.Characters.CommitTransaction(trans);
} }
@@ -252,11 +252,10 @@ namespace Game.Guilds
session.SendPacket(roster); session.SendPacket(roster);
} }
public void SendQueryResponse(WorldSession session, ObjectGuid playerGuid) public void SendQueryResponse(WorldSession session)
{ {
QueryGuildInfoResponse response = new(); QueryGuildInfoResponse response = new();
response.GuildGUID = GetGUID(); response.GuildGUID = GetGUID();
response.PlayerGuid = playerGuid;
response.HasGuildInfo = true; response.HasGuildInfo = true;
response.Info.GuildGuid = GetGUID(); response.Info.GuildGuid = GetGUID();
@@ -395,7 +394,7 @@ namespace Game.Guilds
SendSaveEmblemResult(session, GuildEmblemError.Success); // "Guild Emblem saved." SendSaveEmblemResult(session, GuildEmblemError.Success); // "Guild Emblem saved."
SendQueryResponse(session, ObjectGuid.Empty); SendQueryResponse(session);
} }
} }
@@ -1145,7 +1144,7 @@ namespace Game.Guilds
foreach (var entry in CliDB.GuildPerkSpellsStorage.Values) foreach (var entry in CliDB.GuildPerkSpellsStorage.Values)
player.LearnSpell(entry.SpellID, true); player.LearnSpell(entry.SpellID, true);
m_achievementSys.SendAllData(player); GetAchievementMgr().SendAllData(player);
// tells the client to request bank withdrawal limit // tells the client to request bank withdrawal limit
player.SendPacket(new GuildMemberDailyReset()); player.SendPacket(new GuildMemberDailyReset());
@@ -2412,12 +2411,12 @@ namespace Game.Guilds
bool HasAchieved(uint achievementId) bool HasAchieved(uint achievementId)
{ {
return m_achievementSys.HasAchieved(achievementId); return GetAchievementMgr().HasAchieved(achievementId);
} }
public void UpdateCriteria(CriteriaType type, ulong miscValue1, ulong miscValue2, ulong miscValue3, WorldObject refe, Player player) public void UpdateCriteria(CriteriaType type, ulong miscValue1, ulong miscValue2, ulong miscValue3, WorldObject refe, Player player)
{ {
m_achievementSys.UpdateCriteria(type, miscValue1, miscValue2, miscValue3, refe, player); GetAchievementMgr().UpdateCriteria(type, miscValue1, miscValue2, miscValue3, refe, player);
} }
public void HandleNewsSetSticky(WorldSession session, uint newsId, bool sticky) public void HandleNewsSetSticky(WorldSession session, uint newsId, bool sticky)
+2 -2
View File
@@ -763,10 +763,10 @@ namespace Game
// Send PVPSeason // Send PVPSeason
{ {
SeasonInfo seasonInfo = new(); SeasonInfo seasonInfo = new();
seasonInfo.PreviousSeason = (WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0)); seasonInfo.MythicPlusMilestoneSeasonID = (WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId) - (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress) ? 1 : 0));
if (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress)) if (WorldConfig.GetBoolValue(WorldCfg.ArenaSeasonInProgress))
seasonInfo.CurrentSeason = WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId); seasonInfo.PreviousArenaSeason = WorldConfig.GetIntValue(WorldCfg.ArenaSeasonId);
SendPacket(seasonInfo); SendPacket(seasonInfo);
} }
+1 -1
View File
@@ -584,7 +584,7 @@ namespace Game
// Only allow text-emotes for "dead" entities (feign death included) // Only allow text-emotes for "dead" entities (feign death included)
if (GetPlayer().HasUnitState(UnitState.Died)) if (GetPlayer().HasUnitState(UnitState.Died))
break; break;
GetPlayer().HandleEmoteCommand(emote, null, packet.SpellVisualKitIDs); GetPlayer().HandleEmoteCommand(emote, null, packet.SpellVisualKitIDs, packet.SequenceVariation);
break; break;
} }
+1 -5
View File
@@ -31,16 +31,12 @@ namespace Game
Guild guild = Global.GuildMgr.GetGuildByGuid(query.GuildGuid); Guild guild = Global.GuildMgr.GetGuildByGuid(query.GuildGuid);
if (guild) if (guild)
{ {
if (guild.IsMember(query.PlayerGuid)) guild.SendQueryResponse(this);
{
guild.SendQueryResponse(this, query.PlayerGuid);
return; return;
} }
}
QueryGuildInfoResponse response = new(); QueryGuildInfoResponse response = new();
response.GuildGUID = query.GuildGuid; response.GuildGUID = query.GuildGuid;
response.PlayerGuid = query.PlayerGuid;
SendPacket(response); SendPacket(response);
} }
+1
View File
@@ -440,6 +440,7 @@ namespace Game
SpecialMountAnim specialMountAnim = new(); SpecialMountAnim specialMountAnim = new();
specialMountAnim.UnitGUID = _player.GetGUID(); specialMountAnim.UnitGUID = _player.GetGUID();
specialMountAnim.SpellVisualKitIDs.AddRange(mountSpecial.SpellVisualKitIDs); specialMountAnim.SpellVisualKitIDs.AddRange(mountSpecial.SpellVisualKitIDs);
specialMountAnim.SequenceVariation = mountSpecial.SequenceVariation;
GetPlayer().SendMessageToSet(specialMountAnim, false); GetPlayer().SendMessageToSet(specialMountAnim, false);
} }
+16 -9
View File
@@ -33,22 +33,29 @@ namespace Game
[WorldPacketHandler(ClientOpcodes.QueryPlayerName, Processing = PacketProcessing.Inplace)] [WorldPacketHandler(ClientOpcodes.QueryPlayerName, Processing = PacketProcessing.Inplace)]
void HandleNameQueryRequest(QueryPlayerName queryPlayerName) void HandleNameQueryRequest(QueryPlayerName queryPlayerName)
{ {
SendNameQuery(queryPlayerName.Player); QueryPlayerNameResponse response = new();
foreach (ObjectGuid guid in queryPlayerName.Players)
{
BuildNameQueryData(guid, out NameCacheLookupResult nameCacheLookupResult);
response.Players.Add(nameCacheLookupResult);
} }
public void SendNameQuery(ObjectGuid guid) SendPacket(response);
}
public void BuildNameQueryData(ObjectGuid guid, out NameCacheLookupResult lookupData)
{ {
lookupData = new();
Player player = Global.ObjAccessor.FindPlayer(guid); Player player = Global.ObjAccessor.FindPlayer(guid);
QueryPlayerNameResponse response = new(); lookupData.Player = guid;
response.Player = guid;
if (response.Data.Initialize(guid, player)) lookupData.Data = new();
response.Result = ResponseCodes.Success; if (lookupData.Data.Initialize(guid, player))
lookupData.Result = (byte)ResponseCodes.Success;
else else
response.Result = ResponseCodes.Failure; // name unknown lookupData.Result = (byte)ResponseCodes.Failure; // name unknown
SendPacket(response);
} }
[WorldPacketHandler(ClientOpcodes.QueryTime, Processing = PacketProcessing.Inplace)] [WorldPacketHandler(ClientOpcodes.QueryTime, Processing = PacketProcessing.Inplace)]
@@ -30,18 +30,20 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteInt32(MythicPlusSeasonID); _worldPacket.WriteInt32(MythicPlusDisplaySeasonID);
_worldPacket.WriteInt32(CurrentSeason); _worldPacket.WriteInt32(MythicPlusMilestoneSeasonID);
_worldPacket.WriteInt32(PreviousSeason); _worldPacket.WriteInt32(CurrentArenaSeason);
_worldPacket.WriteInt32(PreviousArenaSeason);
_worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID); _worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID);
_worldPacket.WriteInt32(PvpSeasonID); _worldPacket.WriteInt32(PvpSeasonID);
_worldPacket.WriteBit(WeeklyRewardChestsEnabled); _worldPacket.WriteBit(WeeklyRewardChestsEnabled);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
public int MythicPlusSeasonID; public int MythicPlusDisplaySeasonID;
public int PreviousSeason; public int MythicPlusMilestoneSeasonID;
public int CurrentSeason; public int PreviousArenaSeason;
public int CurrentArenaSeason;
public int PvpSeasonID; public int PvpSeasonID;
public int ConquestWeeklyProgressCurrencyID; public int ConquestWeeklyProgressCurrencyID;
public bool WeeklyRewardChestsEnabled; public bool WeeklyRewardChestsEnabled;
@@ -159,6 +161,7 @@ namespace Game.Networking.Packets
Hdr.Write(_worldPacket); Hdr.Write(_worldPacket);
_worldPacket.WriteUInt32(AverageWaitTime); _worldPacket.WriteUInt32(AverageWaitTime);
_worldPacket.WriteUInt32(WaitTime); _worldPacket.WriteUInt32(WaitTime);
_worldPacket.WriteInt32(Unused920);
_worldPacket.WriteBit(AsGroup); _worldPacket.WriteBit(AsGroup);
_worldPacket.WriteBit(EligibleForMatchmaking); _worldPacket.WriteBit(EligibleForMatchmaking);
_worldPacket.WriteBit(SuspendedQueue); _worldPacket.WriteBit(SuspendedQueue);
@@ -171,6 +174,7 @@ namespace Game.Networking.Packets
public bool SuspendedQueue; public bool SuspendedQueue;
public bool EligibleForMatchmaking; public bool EligibleForMatchmaking;
public uint WaitTime; public uint WaitTime;
public int Unused920;
} }
public class BattlefieldStatusFailed : ServerPacket public class BattlefieldStatusFailed : ServerPacket
@@ -503,6 +507,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt8(Winner); _worldPacket.WriteUInt8(Winner);
_worldPacket.WriteInt32(Duration); _worldPacket.WriteInt32(Duration);
_worldPacket.WriteBit(LogData != null); _worldPacket.WriteBit(LogData != null);
_worldPacket.WriteBits(SoloShuffleStatus, 2);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (LogData != null) if (LogData != null)
@@ -512,6 +517,7 @@ namespace Game.Networking.Packets
public byte Winner; public byte Winner;
public int Duration; public int Duration;
public PVPMatchStatistics LogData; public PVPMatchStatistics LogData;
public uint SoloShuffleStatus;
} }
//Structs //Structs
@@ -631,6 +637,7 @@ namespace Game.Networking.Packets
data.WriteInt32(PlayerClass); data.WriteInt32(PlayerClass);
data.WriteInt32(CreatureID); data.WriteInt32(CreatureID);
data.WriteInt32(HonorLevel); data.WriteInt32(HonorLevel);
data.WriteInt32(Role);
foreach (var pvpStat in Stats) foreach (var pvpStat in Stats)
pvpStat.Write(data); pvpStat.Write(data);
@@ -678,6 +685,7 @@ namespace Game.Networking.Packets
public int PlayerClass; public int PlayerClass;
public int CreatureID; public int CreatureID;
public int HonorLevel; public int HonorLevel;
public int Role;
} }
public void Write(WorldPacket data) public void Write(WorldPacket data)
@@ -281,6 +281,7 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(Guid); _worldPacket.WritePackedGuid(Guid);
_worldPacket.WriteUInt32(EmoteID); _worldPacket.WriteUInt32(EmoteID);
_worldPacket.WriteInt32(SpellVisualKitIDs.Count); _worldPacket.WriteInt32(SpellVisualKitIDs.Count);
_worldPacket.WriteInt32(SequenceVariation);
foreach (var id in SpellVisualKitIDs) foreach (var id in SpellVisualKitIDs)
_worldPacket.WriteUInt32(id); _worldPacket.WriteUInt32(id);
@@ -289,6 +290,7 @@ namespace Game.Networking.Packets
public ObjectGuid Guid; public ObjectGuid Guid;
public uint EmoteID; public uint EmoteID;
public List<uint> SpellVisualKitIDs = new(); public List<uint> SpellVisualKitIDs = new();
public int SequenceVariation;
} }
public class CTextEmote : ClientPacket public class CTextEmote : ClientPacket
@@ -302,6 +304,7 @@ namespace Game.Networking.Packets
SoundIndex = _worldPacket.ReadInt32(); SoundIndex = _worldPacket.ReadInt32();
SpellVisualKitIDs = new uint[_worldPacket.ReadUInt32()]; SpellVisualKitIDs = new uint[_worldPacket.ReadUInt32()];
SequenceVariation = _worldPacket.ReadInt32();
for (var i = 0; i < SpellVisualKitIDs.Length; ++i) for (var i = 0; i < SpellVisualKitIDs.Length; ++i)
SpellVisualKitIDs[i] = _worldPacket.ReadUInt32(); SpellVisualKitIDs[i] = _worldPacket.ReadUInt32();
} }
@@ -310,6 +313,7 @@ namespace Game.Networking.Packets
public int EmoteID; public int EmoteID;
public int SoundIndex; public int SoundIndex;
public uint[] SpellVisualKitIDs; public uint[] SpellVisualKitIDs;
public int SequenceVariation;
} }
public class STextEmote : ServerPacket public class STextEmote : ServerPacket
@@ -144,10 +144,12 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(ObjectGUID); _worldPacket.WritePackedGuid(ObjectGUID);
_worldPacket.WriteInt32(UILink); _worldPacket.WriteInt32(UILink);
_worldPacket.WriteInt32(UIItemInteractionID);
} }
public ObjectGuid ObjectGUID; public ObjectGuid ObjectGUID;
public int UILink; public int UILink;
public int UIItemInteractionID;
} }
class GameObjectPlaySpellVisual : ServerPacket class GameObjectPlaySpellVisual : ServerPacket
@@ -44,7 +44,6 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WritePackedGuid(GuildGUID); _worldPacket.WritePackedGuid(GuildGUID);
_worldPacket.WritePackedGuid(PlayerGuid);
_worldPacket.WriteBit(HasGuildInfo); _worldPacket.WriteBit(HasGuildInfo);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -76,7 +75,6 @@ namespace Game.Networking.Packets
} }
public ObjectGuid GuildGUID; public ObjectGuid GuildGUID;
public ObjectGuid PlayerGuid;
public GuildInfo Info = new(); public GuildInfo Info = new();
public bool HasGuildInfo; public bool HasGuildInfo;
@@ -1181,11 +1181,13 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
SpellVisualKitIDs = new int[_worldPacket.ReadUInt32()]; SpellVisualKitIDs = new int[_worldPacket.ReadUInt32()];
SequenceVariation = _worldPacket.ReadInt32();
for (var i = 0; i < SpellVisualKitIDs.Length; ++i) for (var i = 0; i < SpellVisualKitIDs.Length; ++i)
SpellVisualKitIDs[i] = _worldPacket.ReadInt32(); SpellVisualKitIDs[i] = _worldPacket.ReadInt32();
} }
public int[] SpellVisualKitIDs; public int[] SpellVisualKitIDs;
public int SequenceVariation;
} }
class SpecialMountAnim : ServerPacket class SpecialMountAnim : ServerPacket
@@ -1196,12 +1198,14 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(UnitGUID); _worldPacket.WritePackedGuid(UnitGUID);
_worldPacket.WriteInt32(SpellVisualKitIDs.Count); _worldPacket.WriteInt32(SpellVisualKitIDs.Count);
_worldPacket.WriteInt32(SequenceVariation);
foreach (var id in SpellVisualKitIDs) foreach (var id in SpellVisualKitIDs)
_worldPacket.WriteInt32(id); _worldPacket.WriteInt32(id);
} }
public ObjectGuid UnitGUID; public ObjectGuid UnitGUID;
public List<int> SpellVisualKitIDs = new(); public List<int> SpellVisualKitIDs = new();
public int SequenceVariation;
} }
class CrossedInebriationThreshold : ServerPacket class CrossedInebriationThreshold : ServerPacket
@@ -75,6 +75,9 @@ namespace Game.Networking.Packets
{ {
var movementInfo = new MovementInfo(); var movementInfo = new MovementInfo();
movementInfo.Guid = data.ReadPackedGuid(); movementInfo.Guid = data.ReadPackedGuid();
movementInfo.SetMovementFlags((MovementFlag)data.ReadUInt32());
movementInfo.SetMovementFlags2((MovementFlag2)data.ReadUInt32());
movementInfo.SetExtraMovementFlags2((MovementFlags3)data.ReadUInt32());
movementInfo.Time = data.ReadUInt32(); movementInfo.Time = data.ReadUInt32();
float x = data.ReadFloat(); float x = data.ReadFloat();
float y = data.ReadFloat(); float y = data.ReadFloat();
@@ -96,19 +99,27 @@ namespace Game.Networking.Packets
// ResetBitReader // ResetBitReader
movementInfo.SetMovementFlags((MovementFlag)data.ReadBits<uint>(30));
movementInfo.SetMovementFlags2((MovementFlag2)data.ReadBits<uint>(18));
bool hasTransport = data.HasBit(); bool hasTransport = data.HasBit();
bool hasFall = data.HasBit(); bool hasFall = data.HasBit();
bool hasSpline = data.HasBit(); // todo 6.x read this infos bool hasSpline = data.HasBit(); // todo 6.x read this infos
data.ReadBit(); // HeightChangeFailed data.ReadBit(); // HeightChangeFailed
data.ReadBit(); // RemoteTimeValid data.ReadBit(); // RemoteTimeValid
bool hasInertia = data.HasBit();
if (hasTransport) if (hasTransport)
ReadTransportInfo(data, ref movementInfo.transport); ReadTransportInfo(data, ref movementInfo.transport);
if (hasInertia)
{
MovementInfo.Inertia inertia = new();
inertia.guid = data.ReadPackedGuid();
inertia.force = data.ReadPosition();
inertia.lifetime = data.ReadUInt32();
movementInfo.inertia = inertia;
}
if (hasFall) if (hasFall)
{ {
movementInfo.jump.fallTime = data.ReadUInt32(); movementInfo.jump.fallTime = data.ReadUInt32();
@@ -134,8 +145,12 @@ namespace Game.Networking.Packets
bool hasFallDirection = movementInfo.HasMovementFlag(MovementFlag.Falling | MovementFlag.FallingFar); bool hasFallDirection = movementInfo.HasMovementFlag(MovementFlag.Falling | MovementFlag.FallingFar);
bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0; bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
bool hasSpline = false; // todo 6.x send this infos bool hasSpline = false; // todo 6.x send this infos
bool hasInertia = movementInfo.inertia.HasValue;
data.WritePackedGuid(movementInfo.Guid); data.WritePackedGuid(movementInfo.Guid);
data.WriteUInt32((uint)movementInfo.GetMovementFlags());
data.WriteUInt32((uint)movementInfo.GetMovementFlags2());
data.WriteUInt32((uint)movementInfo.GetExtraMovementFlags2());
data.WriteUInt32(movementInfo.Time); data.WriteUInt32(movementInfo.Time);
data.WriteFloat(movementInfo.Pos.GetPositionX()); data.WriteFloat(movementInfo.Pos.GetPositionX());
data.WriteFloat(movementInfo.Pos.GetPositionY()); data.WriteFloat(movementInfo.Pos.GetPositionY());
@@ -147,27 +162,32 @@ namespace Game.Networking.Packets
uint removeMovementForcesCount = 0; uint removeMovementForcesCount = 0;
data.WriteUInt32(removeMovementForcesCount); data.WriteUInt32(removeMovementForcesCount);
uint int168 = 0; uint moveIndex = 0;
data.WriteUInt32(int168); data.WriteUInt32(moveIndex);
/*for (public uint i = 0; i < removeMovementForcesCount; ++i) /*for (public uint i = 0; i < removeMovementForcesCount; ++i)
{ {
_worldPacket << ObjectGuid; _worldPacket << ObjectGuid;
}*/ }*/
data.WriteBits((uint)movementInfo.GetMovementFlags(), 30);
data.WriteBits((uint)movementInfo.GetMovementFlags2(), 18);
data.WriteBit(hasTransportData); data.WriteBit(hasTransportData);
data.WriteBit(hasFallData); data.WriteBit(hasFallData);
data.WriteBit(hasSpline); data.WriteBit(hasSpline);
data.WriteBit(false); // HeightChangeFailed data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
data.WriteBit(hasInertia);
data.FlushBits(); data.FlushBits();
if (hasTransportData) if (hasTransportData)
WriteTransportInfo(data, movementInfo.transport); WriteTransportInfo(data, movementInfo.transport);
if (hasInertia)
{
data.WritePackedGuid(movementInfo.inertia.Value.guid);
data.WriteXYZ(movementInfo.inertia.Value.force);
data.WriteUInt32(movementInfo.inertia.Value.lifetime);
}
if (hasFallData) if (hasFallData)
{ {
data.WriteUInt32(movementInfo.jump.fallTime); data.WriteUInt32(movementInfo.jump.fallTime);
@@ -1168,13 +1188,13 @@ namespace Game.Networking.Packets
data.WriteBit(CollisionHeight.HasValue); data.WriteBit(CollisionHeight.HasValue);
data.WriteBit(@MovementForce != null); data.WriteBit(@MovementForce != null);
data.WriteBit(MovementForceGUID.HasValue); data.WriteBit(MovementForceGUID.HasValue);
data.WriteBit(MovementInertiaGUID.HasValue);
data.WriteBit(MovementInertiaLifetimeMs.HasValue);
data.FlushBits(); data.FlushBits();
if (@MovementForce != null) if (@MovementForce != null)
@MovementForce.Write(data); @MovementForce.Write(data);
if (Speed.HasValue) if (Speed.HasValue)
data.WriteFloat(Speed.Value); data.WriteFloat(Speed.Value);
@@ -1198,6 +1218,12 @@ namespace Game.Networking.Packets
if (MovementForceGUID.HasValue) if (MovementForceGUID.HasValue)
data.WritePackedGuid(MovementForceGUID.Value); data.WritePackedGuid(MovementForceGUID.Value);
if (MovementInertiaGUID.HasValue)
data.WritePackedGuid(MovementInertiaGUID.Value);
if (MovementInertiaLifetimeMs.HasValue)
data.WriteUInt32(MovementInertiaLifetimeMs.Value);
} }
public ServerOpcodes MessageID; public ServerOpcodes MessageID;
@@ -1208,6 +1234,8 @@ namespace Game.Networking.Packets
public CollisionHeightInfo? CollisionHeight; public CollisionHeightInfo? CollisionHeight;
public MovementForce MovementForce; public MovementForce MovementForce;
public ObjectGuid? MovementForceGUID; public ObjectGuid? MovementForceGUID;
public ObjectGuid? MovementInertiaGUID;
public uint? MovementInertiaLifetimeMs;
} }
} }
@@ -42,11 +42,13 @@ namespace Game.Networking.Packets
public class DungeonScoreSummary public class DungeonScoreSummary
{ {
public float CurrentSeasonScore; public float CurrentSeasonScore;
public float LifetimeBestSeasonScore;
public List<DungeonScoreMapSummary> Runs = new(); public List<DungeonScoreMapSummary> Runs = new();
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteFloat(CurrentSeasonScore); data.WriteFloat(CurrentSeasonScore);
data.WriteFloat(LifetimeBestSeasonScore);
data.WriteInt32(Runs.Count); data.WriteInt32(Runs.Count);
foreach (var dungeonScoreMapSummary in Runs) foreach (var dungeonScoreMapSummary in Runs)
dungeonScoreMapSummary.Write(data); dungeonScoreMapSummary.Write(data);
@@ -61,7 +63,7 @@ namespace Game.Networking.Packets
public ObjectGuid GuildGUID; public ObjectGuid GuildGUID;
public uint NativeRealmAddress; public uint NativeRealmAddress;
public uint VirtualRealmAddress; public uint VirtualRealmAddress;
public short ChrSpecializationID; public int ChrSpecializationID;
public short RaceID; public short RaceID;
public int ItemLevel; public int ItemLevel;
public int CovenantID; public int CovenantID;
@@ -75,7 +77,7 @@ namespace Game.Networking.Packets
data.WritePackedGuid(GuildGUID); data.WritePackedGuid(GuildGUID);
data.WriteUInt32(NativeRealmAddress); data.WriteUInt32(NativeRealmAddress);
data.WriteUInt32(VirtualRealmAddress); data.WriteUInt32(VirtualRealmAddress);
data.WriteInt16(ChrSpecializationID); data.WriteInt32(ChrSpecializationID);
data.WriteInt16(RaceID); data.WriteInt16(RaceID);
data.WriteInt32(ItemLevel); data.WriteInt32(ItemLevel);
data.WriteInt32(CovenantID); data.WriteInt32(CovenantID);
@@ -157,7 +159,13 @@ namespace Game.Networking.Packets
{ {
data.WriteInt32(Season); data.WriteInt32(Season);
data.WriteInt32(Maps.Count); data.WriteInt32(Maps.Count);
data.WriteUInt32(0);
data.WriteFloat(SeasonScore); data.WriteFloat(SeasonScore);
data.WriteFloat(0);
foreach (var map in Maps)
map.Write(data);
foreach (var map in Maps) foreach (var map in Maps)
map.Write(data); map.Write(data);
} }
+9 -1
View File
@@ -63,6 +63,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt8(options.OptionNPC); _worldPacket.WriteUInt8(options.OptionNPC);
_worldPacket.WriteUInt8(options.OptionFlags); _worldPacket.WriteUInt8(options.OptionFlags);
_worldPacket.WriteInt32(options.OptionCost); _worldPacket.WriteInt32(options.OptionCost);
_worldPacket.WriteUInt32(options.OptionLanguage);
_worldPacket.WriteBits(options.Text.GetByteCount(), 12); _worldPacket.WriteBits(options.Text.GetByteCount(), 12);
_worldPacket.WriteBits(options.Confirm.GetByteCount(), 12); _worldPacket.WriteBits(options.Confirm.GetByteCount(), 12);
@@ -113,9 +114,15 @@ namespace Game.Networking.Packets
public class GossipComplete : ServerPacket public class GossipComplete : ServerPacket
{ {
public bool SuppressSound;
public GossipComplete() : base(ServerOpcodes.GossipComplete) { } public GossipComplete() : base(ServerOpcodes.GossipComplete) { }
public override void Write() { } public override void Write()
{
_worldPacket.WriteBit(SuppressSound);
_worldPacket.FlushBits();
}
} }
public class VendorInventory : ServerPacket public class VendorInventory : ServerPacket
@@ -341,6 +348,7 @@ namespace Game.Networking.Packets
public byte OptionNPC; public byte OptionNPC;
public byte OptionFlags; public byte OptionFlags;
public int OptionCost; public int OptionCost;
public uint OptionLanguage;
public GossipOptionStatus Status; public GossipOptionStatus Status;
public string Text; public string Text;
public string Confirm; public string Confirm;
+50 -15
View File
@@ -33,31 +33,26 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
Player = _worldPacket.ReadPackedGuid(); Players = new ObjectGuid[_worldPacket.ReadInt32()];
for (var i = 0; i < Players.Length; ++i)
Players[i] = _worldPacket.ReadPackedGuid();
} }
public ObjectGuid Player; public ObjectGuid[] Players;
} }
public class QueryPlayerNameResponse : ServerPacket public class QueryPlayerNameResponse : ServerPacket
{ {
public QueryPlayerNameResponse() : base(ServerOpcodes.QueryPlayerNameResponse) public List<NameCacheLookupResult> Players = new();
{
Data = new PlayerGuidLookupData(); public QueryPlayerNameResponse() : base(ServerOpcodes.QueryPlayerNameResponse) { }
}
public override void Write() public override void Write()
{ {
_worldPacket.WriteInt8((sbyte)Result); _worldPacket.WriteInt32(Players.Count);
_worldPacket.WritePackedGuid(Player); foreach (NameCacheLookupResult lookupResult in Players)
lookupResult.Write(_worldPacket);
if (Result == ResponseCodes.Success)
Data.Write(_worldPacket);
} }
public ObjectGuid Player;
public ResponseCodes Result; // 0 - full packet, != 0 - only guid
public PlayerGuidLookupData Data;
} }
public class QueryCreature : ClientPacket public class QueryCreature : ClientPacket
@@ -685,6 +680,46 @@ namespace Game.Networking.Packets
public DeclinedName DeclinedNames = new(); public DeclinedName DeclinedNames = new();
} }
public struct NameCacheUnused920
{
public uint Unused1;
public ObjectGuid Unused2;
public string Unused3 = "";
public void Write(WorldPacket data)
{
data.WriteUInt32(Unused1);
data.WritePackedGuid(Unused2);
data.WriteBits(Unused3.GetByteCount(), 7);
data.FlushBits();
data.WriteString(Unused3);
}
}
public struct NameCacheLookupResult
{
public ObjectGuid Player;
public byte Result = 0; // 0 - full packet, != 0 - only guid
public PlayerGuidLookupData Data;
public NameCacheUnused920? Unused920;
public void Write(WorldPacket data)
{
data.WriteUInt8(Result);
data.WritePackedGuid(Player);
data.WriteBit(Data != null);
data.WriteBit(Unused920.HasValue);
data.FlushBits();
if (Data != null)
Data.Write(data);
if (Unused920.HasValue)
Unused920.Value.Write(data);
}
}
public class CreatureXDisplay public class CreatureXDisplay
{ {
public CreatureXDisplay(uint creatureDisplayID, float displayScale, float probability) public CreatureXDisplay(uint creatureDisplayID, float displayScale, float probability)
+18 -4
View File
@@ -850,8 +850,11 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WritePackedGuid(SenderGUID);
_worldPacket.WriteInt32(UiTextureKitID); _worldPacket.WriteInt32(UiTextureKitID);
_worldPacket.WriteUInt32(SoundKitID); _worldPacket.WriteUInt32(SoundKitID);
_worldPacket.WriteUInt32(CloseUISoundKitID);
_worldPacket.WriteUInt8(NumRerolls); _worldPacket.WriteUInt8(NumRerolls);
_worldPacket.WriteInt64(Duration);
_worldPacket.WriteBits(Question.GetByteCount(), 8); _worldPacket.WriteBits(Question.GetByteCount(), 8);
_worldPacket.WriteBits(PendingChoiceText.GetByteCount(), 8);
_worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(CloseChoiceFrame);
_worldPacket.WriteBit(HideWarboardHeader); _worldPacket.WriteBit(HideWarboardHeader);
_worldPacket.WriteBit(KeepOpenAfterChoice); _worldPacket.WriteBit(KeepOpenAfterChoice);
@@ -861,14 +864,18 @@ namespace Game.Networking.Packets
response.Write(_worldPacket); response.Write(_worldPacket);
_worldPacket.WriteString(Question); _worldPacket.WriteString(Question);
_worldPacket.WriteString(PendingChoiceText);
} }
public ObjectGuid SenderGUID; public ObjectGuid SenderGUID;
public int ChoiceID; public int ChoiceID;
public int UiTextureKitID; public int UiTextureKitID;
public uint SoundKitID; public uint SoundKitID;
public uint CloseUISoundKitID;
public byte NumRerolls; public byte NumRerolls;
public long Duration;
public string Question; public string Question;
public string PendingChoiceText;
public List<PlayerChoiceResponse> Responses = new(); public List<PlayerChoiceResponse> Responses = new();
public bool CloseChoiceFrame; public bool CloseChoiceFrame;
public bool HideWarboardHeader; public bool HideWarboardHeader;
@@ -1278,8 +1285,8 @@ namespace Game.Networking.Packets
{ {
public int Unused901_1; public int Unused901_1;
public int TypeArtFileID; public int TypeArtFileID;
public int Rarity; public int? Rarity;
public uint RarityColor; public uint? RarityColor;
public int Unused901_2; public int Unused901_2;
public int SpellID; public int SpellID;
public int MaxStacks; public int MaxStacks;
@@ -1288,11 +1295,18 @@ namespace Game.Networking.Packets
{ {
data.WriteInt32(Unused901_1); data.WriteInt32(Unused901_1);
data.WriteInt32(TypeArtFileID); data.WriteInt32(TypeArtFileID);
data.WriteInt32(Rarity);
data.WriteUInt32(RarityColor);
data.WriteInt32(Unused901_2); data.WriteInt32(Unused901_2);
data.WriteInt32(SpellID); data.WriteInt32(SpellID);
data.WriteInt32(MaxStacks); data.WriteInt32(MaxStacks);
data.WriteBit(Rarity.HasValue);
data.WriteBit(RarityColor.HasValue);
data.FlushBits();
if (Rarity.HasValue)
data.WriteInt32(Rarity.Value);
if (RarityColor.HasValue)
data.WriteUInt32(RarityColor.Value);
} }
} }
@@ -53,6 +53,14 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(ClubsPresenceUpdateTimer); _worldPacket.WriteUInt32(ClubsPresenceUpdateTimer);
_worldPacket.WriteUInt32(HiddenUIClubsPresenceUpdateTimer); _worldPacket.WriteUInt32(HiddenUIClubsPresenceUpdateTimer);
_worldPacket.WriteInt32(GameRuleUnknown1);
_worldPacket.WriteInt32(GameRuleValues.Count);
_worldPacket.WriteInt16(MaxPlayerNameQueriesPerPacket);
foreach (GameRuleValuePair gameRuleValue in GameRuleValues)
gameRuleValue.Write(_worldPacket);
_worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(VoiceEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
_worldPacket.WriteBit(ScrollOfResurrectionEnabled); _worldPacket.WriteBit(ScrollOfResurrectionEnabled);
@@ -152,6 +160,8 @@ namespace Game.Networking.Packets
public uint ClubsPresenceUpdateTimer; public uint ClubsPresenceUpdateTimer;
public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden
public uint KioskSessionMinutes; public uint KioskSessionMinutes;
public int GameRuleUnknown1;
public short MaxPlayerNameQueriesPerPacket = 50;
public bool ItemRestorationButtonEnabled; public bool ItemRestorationButtonEnabled;
public bool CharUndeleteEnabled; // Implemented public bool CharUndeleteEnabled; // Implemented
public bool BpayStoreDisabledByParentalControls; public bool BpayStoreDisabledByParentalControls;
@@ -184,6 +194,7 @@ namespace Game.Networking.Packets
public SocialQueueConfig QuickJoinConfig; public SocialQueueConfig QuickJoinConfig;
public SquelchInfo Squelch; public SquelchInfo Squelch;
public RafSystemFeatureInfo RAFSystem; public RafSystemFeatureInfo RAFSystem;
public List<GameRuleValuePair> GameRuleValues = new();
public struct SessionAlertConfig public struct SessionAlertConfig
{ {
@@ -276,10 +287,15 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(ActiveClassTrialBoostType); _worldPacket.WriteInt32(ActiveClassTrialBoostType);
_worldPacket.WriteInt32(MinimumExpansionLevel); _worldPacket.WriteInt32(MinimumExpansionLevel);
_worldPacket.WriteInt32(MaximumExpansionLevel); _worldPacket.WriteInt32(MaximumExpansionLevel);
_worldPacket.WriteInt32(GameRuleUnknown1);
_worldPacket.WriteInt32(GameRuleValues.Count);
_worldPacket.WriteInt16(MaxPlayerNameQueriesPerPacket);
foreach (var sourceRegion in LiveRegionCharacterCopySourceRegions) foreach (var sourceRegion in LiveRegionCharacterCopySourceRegions)
_worldPacket.WriteInt32(sourceRegion); _worldPacket.WriteInt32(sourceRegion);
foreach (GameRuleValuePair gameRuleValue in GameRuleValues)
gameRuleValue.Write(_worldPacket);
} }
public bool BpayStoreAvailable; // NYI public bool BpayStoreAvailable; // NYI
@@ -310,6 +326,9 @@ namespace Game.Networking.Packets
public int MinimumExpansionLevel; public int MinimumExpansionLevel;
public int MaximumExpansionLevel; public int MaximumExpansionLevel;
public uint KioskSessionMinutes; public uint KioskSessionMinutes;
public int GameRuleUnknown1;
public List<GameRuleValuePair> GameRuleValues = new();
public short MaxPlayerNameQueriesPerPacket = 50;
} }
public class MOTD : ServerPacket public class MOTD : ServerPacket
@@ -383,4 +402,16 @@ namespace Game.Networking.Packets
ThrottleState.Write(data); ThrottleState.Write(data);
} }
} }
public struct GameRuleValuePair
{
public int Rule;
public int Value;
public void Write(WorldPacket data)
{
data.WriteInt32(Rule);
data.WriteInt32(Value);
}
}
} }