Core/PacketIO: Updated most packet structures to 9.0.1

Port From (https://github.com/TrinityCore/TrinityCore/commit/cab4c87d2d7f6d734ef067d6bf50f4b1d338a7bc)
This commit is contained in:
hondacrx
2020-12-09 14:01:38 -05:00
parent c7d968ea74
commit c46c7ba2dc
65 changed files with 2697 additions and 2217 deletions
@@ -72,17 +72,22 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(AreaTriggerSpline.HasValue);
_worldPacket.WriteBit(AreaTriggerOrbit.HasValue);
_worldPacket.WriteBit(AreaTriggerMovementScript.HasValue);
_worldPacket.FlushBits();
if (AreaTriggerSpline.HasValue)
AreaTriggerSpline.Value.Write(_worldPacket);
if (AreaTriggerMovementScript.HasValue)
AreaTriggerMovementScript.Value.Write(_worldPacket);
if (AreaTriggerOrbit.HasValue)
AreaTriggerOrbit.Value.Write(_worldPacket);
}
public Optional<AreaTriggerSplineInfo> AreaTriggerSpline;
public Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit;
public Optional<AreaTriggerMovementScriptInfo> AreaTriggerMovementScript;
public ObjectGuid TriggerGUID;
}
@@ -616,6 +616,9 @@ namespace Game.Networking.Packets
foreach (AuctionItem item in Items)
item.Write(_worldPacket);
foreach (AuctionItem item in SoldItems)
item.Write(_worldPacket);
}
}
@@ -857,10 +860,12 @@ namespace Game.Networking.Packets
public AuctionBucketKey Key;
public int TotalQuantity;
public ulong MinPrice;
public int RequiredLevel;
public List<uint> ItemModifiedAppearanceIDs = new List<uint>();
public Optional<byte> MaxBattlePetQuality;
public Optional<byte> MaxBattlePetLevel;
public Optional<byte> BattlePetBreedID;
public Optional<uint> Unk901_1;
public bool ContainsOwnerItem;
public bool ContainsOnlyCollectedAppearances;
@@ -868,6 +873,7 @@ namespace Game.Networking.Packets
{
Key.Write(data);
data.WriteInt32(TotalQuantity);
data.WriteInt32(RequiredLevel);
data.WriteUInt64(MinPrice);
data.WriteInt32(ItemModifiedAppearanceIDs.Count);
if (!ItemModifiedAppearanceIDs.Empty())
@@ -879,6 +885,7 @@ namespace Game.Networking.Packets
data.WriteBit(MaxBattlePetQuality.HasValue);
data.WriteBit(MaxBattlePetLevel.HasValue);
data.WriteBit(BattlePetBreedID.HasValue);
data.WriteBit(Unk901_1.HasValue);
data.WriteBit(ContainsOwnerItem);
data.WriteBit(ContainsOnlyCollectedAppearances);
data.FlushBits();
@@ -891,6 +898,9 @@ namespace Game.Networking.Packets
if (BattlePetBreedID.HasValue)
data.WriteUInt8(BattlePetBreedID.Value);
if (Unk901_1.HasValue)
data.WriteUInt32(Unk901_1.Value);
}
}
@@ -153,13 +153,13 @@ namespace Game.Networking.Packets
_worldPacket.FlushBits();
{
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.BillingPlan);
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.TimeRemain);
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.Unknown735);
_worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.BillingPlan);
_worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.TimeRemain);
_worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.Unknown735);
// 3x same bit is not a mistake - preserves legacy client behavior of BillingPlanFlags::SESSION_IGR
_worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG
_worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan
_worldPacket.WriteBit(SuccessInfo.Value.Billing.InGameRoom); // not used anywhere in the client
_worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG
_worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan
_worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.InGameRoom); // not used anywhere in the client
_worldPacket.FlushBits();
}
@@ -213,7 +213,7 @@ namespace Game.Networking.Packets
public uint CurrencyID; // this is probably used for the ingame shop. @todo implement
public uint Time;
public BillingInfo Billing;
public GameTime GameTimeInfo;
public List<VirtualRealmInfo> VirtualRealms = new List<VirtualRealmInfo>(); // list of realms connected to this one (inclusive) @todo implement
public List<CharacterTemplate> Templates = new List<CharacterTemplate>(); // list of pre-made character templates. @todo implement
@@ -226,7 +226,7 @@ namespace Game.Networking.Packets
public Optional<ushort> NumPlayersAlliance; // number of alliance players in this realm. @todo implement
public Optional<int> ExpansionTrialExpiration; // expansion trial expiration unix timestamp
public struct BillingInfo
public struct GameTime
{
public uint BillingPlan;
public uint TimeRemain;
@@ -33,13 +33,18 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(MythicPlusSeasonID);
_worldPacket.WriteInt32(CurrentSeason);
_worldPacket.WriteInt32(PreviousSeason);
_worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID);
_worldPacket.WriteInt32(PvpSeasonID);
_worldPacket.WriteBit(WeeklyRewardChestsEnabled);
_worldPacket.FlushBits();
}
public int MythicPlusSeasonID;
public int PreviousSeason;
public int CurrentSeason;
public int PvpSeasonID;
public int ConquestWeeklyProgressCurrencyID;
public bool WeeklyRewardChestsEnabled;
}
public class AreaSpiritHealerQuery : ClientPacket
@@ -435,9 +440,9 @@ namespace Game.Networking.Packets
public uint RandomMaxRewardPointsThisWeek;
}
class RequestRatedBattlefieldInfo : ClientPacket
class RequestRatedPvpInfo : ClientPacket
{
public RequestRatedBattlefieldInfo(WorldPacket packet) : base(packet) { }
public RequestRatedPvpInfo(WorldPacket packet) : base(packet) { }
public override void Read() { }
}
@@ -42,9 +42,9 @@ namespace Game.Networking.Packets
public ulong EventID;
}
class CalendarCommunityFilter : ClientPacket
class CalendarCommunityInviteRequest : ClientPacket
{
public CalendarCommunityFilter(WorldPacket packet) : base(packet) { }
public CalendarCommunityInviteRequest(WorldPacket packet) : base(packet) { }
public override void Read()
{
@@ -260,9 +260,9 @@ namespace Game.Networking.Packets
public string EventName;
}
class CalendarEventInvite : ClientPacket
class CalendarInvitePkt : ClientPacket
{
public CalendarEventInvite(WorldPacket packet) : base(packet) { }
public CalendarInvitePkt(WorldPacket packet) : base(packet) { }
public override void Read()
{
@@ -285,9 +285,9 @@ namespace Game.Networking.Packets
public string Name;
}
class CalendarEventRSVP : ClientPacket
class HandleCalendarRsvp : ClientPacket
{
public CalendarEventRSVP(WorldPacket packet) : base(packet) { }
public HandleCalendarRsvp(WorldPacket packet) : base(packet) { }
public override void Read()
{
@@ -502,9 +502,9 @@ namespace Game.Networking.Packets
public ulong InviteID;
}
class CalendarEventStatus : ClientPacket
class CalendarStatus : ClientPacket
{
public CalendarEventStatus(WorldPacket packet) : base(packet) { }
public CalendarStatus(WorldPacket packet) : base(packet) { }
public override void Read()
{
@@ -538,9 +538,9 @@ namespace Game.Networking.Packets
public uint DifficultyID;
}
class CalendarEventModeratorStatus : ClientPacket
class CalendarModeratorStatusQuery : ClientPacket
{
public CalendarEventModeratorStatus(WorldPacket packet) : base(packet) { }
public CalendarModeratorStatusQuery(WorldPacket packet) : base(packet) { }
public override void Read()
{
@@ -115,7 +115,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 11);
_worldPacket.WriteUInt32((uint)ChannelFlags);
_worldPacket.WriteInt32(ChatChannelID);
_worldPacket.WriteUInt64((ulong)InstanceID);
_worldPacket.WriteUInt64(InstanceID);
_worldPacket.WritePackedGuid(ChannelGUID);
_worldPacket.WriteString(Channel);
_worldPacket.WriteString(ChannelWelcomeMsg);
@@ -123,7 +123,7 @@ namespace Game.Networking.Packets
public string ChannelWelcomeMsg = "";
public int ChatChannelID;
public int InstanceID;
public ulong InstanceID;
public ChannelFlags ChannelFlags;
public string Channel = "";
public ObjectGuid ChannelGUID;
+111 -118
View File
@@ -41,9 +41,8 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteBit(Success);
_worldPacket.WriteBit(IsDeletedCharacters);
_worldPacket.WriteBit(IsTestDemonHunterCreationAllowed);
_worldPacket.WriteBit(HasDemonHunterOnRealm);
_worldPacket.WriteBit(IsDemonHunterCreationAllowed);
_worldPacket.WriteBit(IsNewPlayerRestrictionSkipped);
_worldPacket.WriteBit(IsNewPlayer);
_worldPacket.WriteBit(DisabledClassesMask.HasValue);
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket.WriteInt32(Characters.Count);
@@ -66,9 +65,8 @@ namespace Game.Networking.Packets
public bool Success;
public bool IsDeletedCharacters; // used for character undelete list
public bool IsTestDemonHunterCreationAllowed = false; //allows client to skip 1 per realm and level 70 requirements
public bool HasDemonHunterOnRealm = false;
public bool IsDemonHunterCreationAllowed = false; //used for demon hunter early access
public bool IsNewPlayerRestrictionSkipped = false; // allows client to skip new player restrictions
public bool IsNewPlayer = false; // forbids hero classes and allied races
public bool IsAlliedRacesCreationAllowed = false;
public int MaxCharacterLevel = 1;
@@ -187,14 +185,7 @@ namespace Game.Networking.Packets
data.WriteUInt8(RaceId);
data.WriteUInt8((byte)ClassId);
data.WriteUInt8(SexId);
data.WriteUInt8(SkinId);
data.WriteUInt8(FaceId);
data.WriteUInt8(HairStyle);
data.WriteUInt8(HairColor);
data.WriteUInt8(FacialHair);
foreach (var display in CustomDisplay)
data.WriteUInt8(display);
data.WriteInt32(Customizations.Count);
data.WriteUInt8(ExperienceLevel);
data.WriteUInt32(ZoneId);
@@ -219,18 +210,23 @@ namespace Game.Networking.Packets
data.WriteUInt32(Unknown703);
data.WriteUInt32(LastLoginVersion);
data.WriteUInt32(Flags4);
data.WriteInt32(Unknown830.Count);
data.WriteInt32(MailSenders.Count);
data.WriteUInt32(OverrideSelectScreenFileDataID);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(data);
data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin);
data.WriteBit(BoostInProgress);
data.WriteBits(unkWod61x, 5);
foreach (string str in Unknown830)
foreach (string str in MailSenders)
data.WriteBits(str.GetByteCount() + 1, 6);
data.FlushBits();
foreach (string str in Unknown830)
foreach (string str in MailSenders)
if (!str.IsEmpty())
data.WriteCString(str);
@@ -244,12 +240,7 @@ namespace Game.Networking.Packets
public byte RaceId;
public Class ClassId;
public byte SexId;
public byte SkinId;
public byte FaceId;
public byte HairStyle;
public byte HairColor;
public byte FacialHair;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public byte ExperienceLevel;
public uint ZoneId;
public uint MapId;
@@ -265,14 +256,14 @@ namespace Game.Networking.Packets
public ushort SpecID;
public uint Unknown703;
public uint LastLoginVersion;
public uint OverrideSelectScreenFileDataID;
public uint PetCreatureDisplayId;
public uint PetExperienceLevel;
public uint PetCreatureFamilyId;
public bool BoostInProgress; // @todo
public uint[] ProfessionIds = new uint[2]; // @todo
public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.BagEnd];
public List<string> Unknown830 = new List<string>(); // Something with character names, same length limit as name,
// client accepts unlimited number of these in packet but only uses first 3
public List<string> MailSenders = new List<string>();
public struct VisualItemInfo
{
@@ -280,12 +271,14 @@ namespace Game.Networking.Packets
{
data.WriteUInt32(DisplayId);
data.WriteUInt32(DisplayEnchantId);
data.WriteInt32(ItemModifiedAppearanceID);
data.WriteUInt8(InvType);
data.WriteUInt8(Subclass);
}
public uint DisplayId;
public uint DisplayEnchantId;
public int ItemModifiedAppearanceID; // also -1 is some special value
public byte InvType;
public byte Subclass;
}
@@ -328,6 +321,38 @@ namespace Game.Networking.Packets
}
}
class CheckCharacterNameAvailability : ClientPacket
{
public uint SequenceIndex;
public string Name;
public CheckCharacterNameAvailability(WorldPacket packet) : base(packet) { }
public override void Read()
{
SequenceIndex = _worldPacket.ReadUInt32();
Name = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(6));
}
}
class CheckCharacterNameAvailabilityResult : ServerPacket
{
public uint SequenceIndex;
public ResponseCodes Result;
public CheckCharacterNameAvailabilityResult(uint sequenceIndex, ResponseCodes result) : base(ServerOpcodes.SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT)
{
SequenceIndex = sequenceIndex;
Result = result;
}
public override void Write()
{
_worldPacket.WriteUInt32(SequenceIndex);
_worldPacket.WriteUInt32((uint)Result);
}
}
public class CreateCharacter : ClientPacket
{
public CreateCharacter(WorldPacket packet) : base(packet) { }
@@ -338,23 +363,19 @@ namespace Game.Networking.Packets
uint nameLength = _worldPacket.ReadBits<uint>(6);
bool hasTemplateSet = _worldPacket.HasBit();
CreateInfo.IsTrialBoost = _worldPacket.HasBit();
CreateInfo.UseNPE = _worldPacket.HasBit();
CreateInfo.RaceId = (Race)_worldPacket.ReadUInt8();
CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8();
CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8();
CreateInfo.Skin = _worldPacket.ReadUInt8();
CreateInfo.Face = _worldPacket.ReadUInt8();
CreateInfo.HairStyle = _worldPacket.ReadUInt8();
CreateInfo.HairColor = _worldPacket.ReadUInt8();
CreateInfo.FacialHairStyle = _worldPacket.ReadUInt8();
CreateInfo.OutfitId = _worldPacket.ReadUInt8();
for (var i = 0; i < CreateInfo.CustomDisplay.GetLimit(); ++i)
CreateInfo.CustomDisplay[i] = _worldPacket.ReadUInt8();
var customizationCount = _worldPacket.ReadUInt32();
CreateInfo.Name = _worldPacket.ReadString(nameLength);
if (CreateInfo.TemplateSet.HasValue)
CreateInfo.TemplateSet.Set(_worldPacket.ReadUInt32());
for (var i = 0; i < customizationCount; ++i)
CreateInfo.Customizations[i].Read(_worldPacket);
}
public CharacterCreateInfo CreateInfo;
@@ -446,14 +467,10 @@ namespace Game.Networking.Packets
CustomizeInfo = new CharCustomizeInfo();
CustomizeInfo.CharGUID = _worldPacket.ReadPackedGuid();
CustomizeInfo.SexID = (Gender)_worldPacket.ReadUInt8();
CustomizeInfo.SkinID = _worldPacket.ReadUInt8();
CustomizeInfo.HairColorID = _worldPacket.ReadUInt8();
CustomizeInfo.HairStyleID = _worldPacket.ReadUInt8();
CustomizeInfo.FacialHairStyleID = _worldPacket.ReadUInt8();
CustomizeInfo.FaceID = _worldPacket.ReadUInt8();
var customizationCount = _worldPacket.ReadUInt32();
for (var i = 0; i < CustomizeInfo.CustomDisplay.GetLimit(); ++i)
CustomizeInfo.CustomDisplay[i] = _worldPacket.ReadUInt8();
for (var i = 0; i < customizationCount; ++i)
CustomizeInfo.Customizations[i].Read(_worldPacket);
CustomizeInfo.CharName = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(6));
}
@@ -478,17 +495,11 @@ namespace Game.Networking.Packets
RaceOrFactionChangeInfo.Guid = _worldPacket.ReadPackedGuid();
RaceOrFactionChangeInfo.SexID = (Gender)_worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.RaceID = (Race)_worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.SkinID = _worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.HairColorID = _worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.HairStyleID = _worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.FacialHairStyleID = _worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.FaceID = _worldPacket.ReadUInt8();
for (var i = 0; i < RaceOrFactionChangeInfo.CustomDisplay.GetLimit(); ++i)
RaceOrFactionChangeInfo.CustomDisplay[i] = _worldPacket.ReadUInt8();
var customizationCount = _worldPacket.ReadUInt32();
RaceOrFactionChangeInfo.Name = _worldPacket.ReadString(nameLength);
for (var i = 0; i < customizationCount; ++i)
RaceOrFactionChangeInfo.Customizations[i].Read(_worldPacket);
}
public CharRaceOrFactionChangeInfo RaceOrFactionChangeInfo;
@@ -512,14 +523,11 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteBits(Display.Value.Name.GetByteCount(), 6);
_worldPacket.WriteUInt8(Display.Value.SexID);
_worldPacket.WriteUInt8(Display.Value.SkinID);
_worldPacket.WriteUInt8(Display.Value.HairColorID);
_worldPacket.WriteUInt8(Display.Value.HairStyleID);
_worldPacket.WriteUInt8(Display.Value.FacialHairStyleID);
_worldPacket.WriteUInt8(Display.Value.FaceID);
_worldPacket.WriteUInt8(Display.Value.RaceID);
Display.Value.CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteString(Display.Value.Name);
foreach (ChrCustomizationChoice customization in Display.Value.Customizations)
customization.Write(_worldPacket);
}
}
@@ -531,13 +539,8 @@ namespace Game.Networking.Packets
{
public string Name;
public byte SexID;
public byte SkinID;
public byte HairColorID;
public byte HairStyleID;
public byte FacialHairStyleID;
public byte FaceID;
public byte RaceID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
}
}
@@ -587,7 +590,7 @@ namespace Game.Networking.Packets
}
}
public ReorderInfo[] Entries = new ReorderInfo[WorldConfig.GetIntValue(WorldCfg.CharactersPerRealm)];
public ReorderInfo[] Entries = new ReorderInfo[200];
public struct ReorderInfo
{
@@ -660,7 +663,7 @@ namespace Game.Networking.Packets
}
public ObjectGuid Guid; // Guid of the player that is logging in
float FarClip; // Visibility distance (for terrain)
public float FarClip; // Visibility distance (for terrain)
}
public class LoginVerifyWorld : ServerPacket
@@ -706,7 +709,7 @@ namespace Game.Networking.Packets
IdleLogout = _worldPacket.HasBit();
}
bool IdleLogout;
public bool IdleLogout;
}
public class LogoutResponse : ServerPacket
@@ -755,8 +758,8 @@ namespace Game.Networking.Packets
Showing = _worldPacket.HasBit();
}
int MapID = -1;
bool Showing;
public int MapID = -1;
public bool Showing;
}
public class InitialSetup : ServerPacket
@@ -832,22 +835,15 @@ namespace Game.Networking.Packets
public override void Read()
{
NewHairStyle = _worldPacket.ReadUInt32();
NewHairColor = _worldPacket.ReadUInt32();
NewFacialHair = _worldPacket.ReadUInt32();
NewSkinColor = _worldPacket.ReadUInt32();
NewFace = _worldPacket.ReadUInt32();
var customizationCount = _worldPacket.ReadUInt32();
NewSex = _worldPacket.ReadUInt8();
for (var i = 0; i < NewCustomDisplay.GetLimit(); ++i)
NewCustomDisplay[i] = _worldPacket.ReadUInt32();
for (var i = 0; i < customizationCount; ++i)
Customizations[i].Read(_worldPacket);
}
public uint NewHairStyle;
public uint NewHairColor;
public uint NewFacialHair;
public uint NewSkinColor;
public uint NewFace;
public Array<uint> NewCustomDisplay = new Array<uint>(PlayerConst.CustomDisplaySize);
public byte NewSex;
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
}
public class BarberShopResult : ServerPacket
@@ -975,25 +971,18 @@ namespace Game.Networking.Packets
{
CharGUID = customizeInfo.CharGUID;
SexID = (byte)customizeInfo.SexID;
SkinID = customizeInfo.SkinID;
HairColorID = customizeInfo.HairColorID;
HairStyleID = customizeInfo.HairStyleID;
FacialHairStyleID = customizeInfo.FacialHairStyleID;
FaceID = customizeInfo.FaceID;
CharName = customizeInfo.CharName;
CustomDisplay = customizeInfo.CustomDisplay;
Customizations = customizeInfo.Customizations;
}
public override void Write()
{
_worldPacket.WritePackedGuid(CharGUID);
_worldPacket.WriteUInt8(SexID);
_worldPacket.WriteUInt8(SkinID);
_worldPacket.WriteUInt8(HairColorID);
_worldPacket.WriteUInt8(HairStyleID);
_worldPacket.WriteUInt8(FacialHairStyleID);
_worldPacket.WriteUInt8(FaceID);
CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteInt32(Customizations.Count);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(_worldPacket);
_worldPacket.WriteBits(CharName.GetByteCount(), 6);
_worldPacket.FlushBits();
_worldPacket.WriteString(CharName);
@@ -1002,12 +991,7 @@ namespace Game.Networking.Packets
ObjectGuid CharGUID;
string CharName = "";
byte SexID;
byte SkinID;
byte HairColorID;
byte HairStyleID;
byte FacialHairStyleID;
byte FaceID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
}
class CharCustomizeFailure : ServerPacket
@@ -1063,21 +1047,40 @@ namespace Game.Networking.Packets
}
//Structs
public struct ChrCustomizationChoice
{
public uint ChrCustomizationOptionID;
public uint ChrCustomizationChoiceID;
public ChrCustomizationChoice(uint chrCustomizationOptionID, uint chrCustomizationChoiceID)
{
ChrCustomizationOptionID = chrCustomizationOptionID;
ChrCustomizationChoiceID = chrCustomizationChoiceID;
}
public void Write(WorldPacket data)
{
data.WriteUInt32(ChrCustomizationOptionID);
data.WriteUInt32(ChrCustomizationChoiceID);
}
public void Read(WorldPacket data)
{
ChrCustomizationOptionID = data.ReadUInt32();
ChrCustomizationChoiceID = data.ReadUInt32();
}
}
public class CharacterCreateInfo
{
// User specified variables
public Race RaceId = Race.None;
public Class ClassId = Class.None;
public Gender Sex = Gender.None;
public byte Skin;
public byte Face;
public byte HairStyle;
public byte HairColor;
public byte FacialHairStyle;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public byte OutfitId;
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public Optional<uint> TemplateSet = new Optional<uint>();
public bool IsTrialBoost;
public bool UseNPE;
public string Name;
// Server side data
@@ -1092,30 +1095,20 @@ namespace Game.Networking.Packets
public class CharCustomizeInfo
{
public byte HairStyleID;
public byte FaceID;
public ObjectGuid CharGUID;
public Gender SexID = Gender.None;
public string CharName;
public byte HairColorID;
public byte FacialHairStyleID;
public byte SkinID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
}
public class CharRaceOrFactionChangeInfo
{
public byte HairColorID;
public Race RaceID = Race.None;
public Gender SexID = Gender.None;
public byte SkinID;
public byte FacialHairStyleID;
public ObjectGuid Guid;
public bool FactionChange;
public string Name;
public byte FaceID;
public byte HairStyleID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
}
public class CharacterUndeleteInfo
@@ -224,7 +224,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Prefix.GetByteCount(), 5);
_worldPacket.WriteBits(Channel.GetByteCount(), 7);
_worldPacket.WriteBits(ChatText.GetByteCount(), 12);
_worldPacket.WriteBits((byte)_ChatFlags, 11);
_worldPacket.WriteBits((byte)_ChatFlags, 14);
_worldPacket.WriteBit(HideChatLog);
_worldPacket.WriteBit(FakeSenderName);
_worldPacket.WriteBit(Unused_801.HasValue);
@@ -18,6 +18,7 @@
using Framework.Constants;
using Framework.IO;
using Game.Entities;
using System.Collections.Generic;
namespace Game.Networking.Packets
{
@@ -29,13 +30,13 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(PlayerGuid);
_worldPacket.WriteUInt32(ServerTime);
for (int i = 0; i < (int)AccountDataTypes.Max; ++i)
_worldPacket.WriteUInt32(AccountTimes[i]);
foreach (var accounttime in AccountTimes)
_worldPacket.WriteUInt32(accounttime);
}
public ObjectGuid PlayerGuid;
public uint ServerTime = 0;
public uint[] AccountTimes = new uint[(int)AccountDataTypes.Max];
public Array<uint> AccountTimes = new Array<uint>((int)AccountDataTypes.Max);
}
public class ClientCacheVersion : ServerPacket
@@ -66,7 +66,7 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteInt32(Damage);
_worldPacket.WriteInt32(OriginalDamage);
_worldPacket.WriteInt32(Overkill);
@@ -90,7 +90,7 @@ namespace Game.Networking.Packets
public ObjectGuid CasterGUID;
public ObjectGuid CastID;
public int SpellID;
public int SpellXSpellVisualID;
public SpellCastVisual Visual;
public int Damage;
public int OriginalDamage;
public int Overkill = -1;
@@ -578,8 +578,8 @@ namespace Game.Networking.Packets
attackRoundInfo.WriteUInt8(ContentTuning.TargetMaxScalingLevel);
attackRoundInfo.WriteInt16(ContentTuning.PlayerLevelDelta);
attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta);
attackRoundInfo.WriteUInt16(ContentTuning.PlayerItemLevel);
attackRoundInfo.WriteUInt16(ContentTuning.TargetItemLevel);
attackRoundInfo.WriteFloat(ContentTuning.PlayerItemLevel);
attackRoundInfo.WriteFloat(ContentTuning.TargetItemLevel);
attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID);
attackRoundInfo.WriteUInt8((byte)(ContentTuning.ScalesWithItemLevel ? 1 : 0));
@@ -62,6 +62,9 @@ namespace Game.Networking.Packets
foreach (var id in equipSet.Enchants)
_worldPacket.WriteInt32(id);
_worldPacket.WriteInt32(equipSet.Unknown901_1);
_worldPacket.WriteInt32(equipSet.Unknown901_2);
_worldPacket.WriteBit(equipSet.AssignedSpecIndex != -1);
_worldPacket.WriteBits(equipSet.SetName.GetByteCount(), 8);
_worldPacket.WriteBits(equipSet.SetIcon.GetByteCount(), 9);
@@ -100,6 +103,9 @@ namespace Game.Networking.Packets
Set.Enchants[0] = _worldPacket.ReadInt32();
Set.Enchants[1] = _worldPacket.ReadInt32();
Set.Unknown901_1 = _worldPacket.ReadInt32();
Set.Unknown901_2 = _worldPacket.ReadInt32();
bool hasSpecIndex = _worldPacket.HasBit();
uint setNameLength = _worldPacket.ReadBits<uint>(8);
+111 -17
View File
@@ -20,6 +20,7 @@ using Game.DataStorage;
using Game.Entities;
using System;
using System.Collections.Generic;
using Framework.Dynamic;
namespace Game.Networking.Packets
{
@@ -223,25 +224,25 @@ namespace Game.Networking.Packets
public List<uint> BlueprintsKnown = null;
}
class GarrisonGetBuildingLandmarks : ClientPacket
class GarrisonGetMapData : ClientPacket
{
public GarrisonGetBuildingLandmarks(WorldPacket packet) : base(packet) { }
public GarrisonGetMapData(WorldPacket packet) : base(packet) { }
public override void Read() { }
}
class GarrisonBuildingLandmarks : ServerPacket
class GarrisonMapDataResponse : ServerPacket
{
public GarrisonBuildingLandmarks() : base(ServerOpcodes.GarrisonBuildingLandmarks, ConnectionType.Instance) { }
public GarrisonMapDataResponse() : base(ServerOpcodes.GarrisonBuildingLandmarks, ConnectionType.Instance) { }
public override void Write()
{
_worldPacket.WriteInt32(Landmarks.Count);
foreach (GarrisonBuildingLandmark landmark in Landmarks)
_worldPacket.WriteInt32(Buildings.Count);
foreach (GarrisonBuildingMapData landmark in Buildings)
landmark.Write(_worldPacket);
}
public List<GarrisonBuildingLandmark> Landmarks = new List<GarrisonBuildingLandmark>();
public List<GarrisonBuildingMapData> Buildings = new List<GarrisonBuildingMapData>();
}
class GarrisonPlotPlaced : ServerPacket
@@ -369,6 +370,9 @@ namespace Game.Networking.Packets
data.WriteInt32(AbilityID.Count);
data.WriteUInt32(ZoneSupportSpellID);
data.WriteUInt32(FollowerStatus);
data.WriteInt32(Health);
data .WriteInt8(BoardIndex);
data .WriteInt32(HealingTimestamp);
AbilityID.ForEach(ability => data.WriteUInt32(ability.Id));
@@ -390,6 +394,9 @@ namespace Game.Networking.Packets
public List<GarrAbilityRecord> AbilityID = new List<GarrAbilityRecord>();
public uint ZoneSupportSpellID;
public uint FollowerStatus;
public int Health;
public int HealingTimestamp;
public sbyte BoardIndex;
public string CustomName = "";
}
@@ -405,8 +412,9 @@ namespace Game.Networking.Packets
data.WriteUInt32(TravelDuration);
data.WriteUInt32(MissionDuration);
data.WriteUInt32(MissionState);
data.WriteUInt32(Unknown1);
data.WriteUInt32(Unknown2);
data.WriteUInt32(SuccessChance);
data.WriteUInt32(Flags);
data.WriteFloat(MissionScalar);
}
public ulong DbID;
@@ -417,8 +425,9 @@ namespace Game.Networking.Packets
public uint TravelDuration;
public uint MissionDuration;
public uint MissionState;
public uint Unknown1 = 0;
public uint Unknown2 = 0;
public uint SuccessChance;
public uint Flags;
public float MissionScalar = 1.0f;
}
struct GarrisonMissionReward
@@ -455,6 +464,18 @@ namespace Game.Networking.Packets
public long StartTime;
}
struct GarrisonTalentSocketData
{
public int SoulbindConduitID;
public int SoulbindConduitRank;
public void Write(WorldPacket data)
{
data.WriteInt32(SoulbindConduitID);
data.WriteInt32(SoulbindConduitRank);
}
}
struct GarrisonTalent
{
public void Write(WorldPacket data)
@@ -463,12 +484,70 @@ namespace Game.Networking.Packets
data.WriteInt32(Rank);
data.WriteUInt32((uint)ResearchStartTime);
data.WriteInt32(Flags);
data.WriteBit(Socket.HasValue);
data.FlushBits();
if (Socket.HasValue)
Socket.Value.Write(data);
}
public int GarrTalentID;
public int Rank;
public long ResearchStartTime;
public int Flags;
public Optional<GarrisonTalentSocketData> Socket;
}
struct GarrisonCollectionEntry
{
public int EntryID;
public int Rank;
public void Write(WorldPacket data)
{
data.WriteInt32(EntryID);
data.WriteInt32(Rank);
}
}
class GarrisonCollection
{
public int Type;
public List<GarrisonCollectionEntry> Entries = new List<GarrisonCollectionEntry>();
public void Write(WorldPacket data)
{
data.WriteInt32(Type);
data.WriteInt32(Entries.Count);
foreach (GarrisonCollectionEntry collectionEntry in Entries)
collectionEntry.Write(data);
}
}
struct GarrisonEventEntry
{
public int EntryID;
public int EventValue;
public void Write(WorldPacket data)
{
data.WriteInt32(EntryID);
data.WriteInt32(EventValue);
}
}
class GarrisonEventList
{
public int Type;
public List<GarrisonEventEntry> Events = new List<GarrisonEventEntry>();
public void Write(WorldPacket data)
{
data.WriteInt32(Type);
data.WriteInt32(Events.Count);
foreach (GarrisonEventEntry eventEntry in Events)
eventEntry.Write(data);
}
}
class GarrisonInfo
@@ -481,11 +560,14 @@ namespace Game.Networking.Packets
data.WriteInt32(Buildings.Count);
data.WriteInt32(Plots.Count);
data.WriteInt32(Followers.Count);
data.WriteInt32(AutoTroops.Count);
data.WriteInt32(Missions.Count);
data.WriteInt32(MissionRewards.Count);
data.WriteInt32(MissionOvermaxRewards.Count);
data.WriteInt32(MissionAreaBonuses.Count);
data.WriteInt32(Talents.Count);
data.WriteInt32(Collections.Count);
data.WriteInt32(EventLists.Count);
data.WriteInt32(CanStartMission.Count);
data.WriteInt32(ArchivedMissions.Count);
data.WriteUInt32(NumFollowerActivationsRemaining);
@@ -514,11 +596,14 @@ namespace Game.Networking.Packets
foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses)
areaBonus.Write(data);
foreach (GarrisonTalent talent in Talents)
talent.Write(data);
foreach (GarrisonCollection collection in Collections)
collection.Write(data);
foreach(var id in ArchivedMissions)
data.WriteInt32(id);
foreach (GarrisonEventList eventList in EventLists)
eventList.Write(data);
foreach (var id in ArchivedMissions)
data.WriteInt32(id);
foreach (GarrisonBuildingInfo building in Buildings)
building.Write(data);
@@ -530,6 +615,12 @@ namespace Game.Networking.Packets
foreach (GarrisonFollower follower in Followers)
follower.Write(data);
foreach (GarrisonFollower follower in AutoTroops)
follower.Write(data);
foreach (GarrisonTalent talent in Talents)
talent.Write(data);
}
public GarrisonType GarrTypeID;
@@ -540,11 +631,14 @@ namespace Game.Networking.Packets
public List<GarrisonPlotInfo> Plots = new List<GarrisonPlotInfo>();
public List<GarrisonBuildingInfo> Buildings = new List<GarrisonBuildingInfo>();
public List<GarrisonFollower> Followers = new List<GarrisonFollower>();
public List<GarrisonFollower> AutoTroops = new List<GarrisonFollower>();
public List<GarrisonMission> Missions = new List<GarrisonMission>();
public List<List<GarrisonMissionReward>> MissionRewards = new List<List<GarrisonMissionReward>>();
public List<List<GarrisonMissionReward>> MissionOvermaxRewards = new List<List<GarrisonMissionReward>>();
public List<GarrisonMissionBonusAbility> MissionAreaBonuses = new List<GarrisonMissionBonusAbility>();
public List<GarrisonTalent> Talents = new List<GarrisonTalent>();
public List<GarrisonCollection> Collections = new List<GarrisonCollection>();
public List<GarrisonEventList> EventLists = new List<GarrisonEventList>();
public List<bool> CanStartMission = new List<bool>();
public List<int> ArchivedMissions = new List<int>();
}
@@ -593,9 +687,9 @@ namespace Game.Networking.Packets
public List<GarrisonRemoteBuildingInfo> Buildings = new List<GarrisonRemoteBuildingInfo>();
}
struct GarrisonBuildingLandmark
struct GarrisonBuildingMapData
{
public GarrisonBuildingLandmark(uint buildingPlotInstId, Position pos)
public GarrisonBuildingMapData(uint buildingPlotInstId, Position pos)
{
GarrBuildingPlotInstID = buildingPlotInstId;
Pos = pos;
@@ -278,9 +278,9 @@ namespace Game.Networking.Packets
public string OldGuildName;
}
public class GuildEventAwayChange : ServerPacket
public class GuildEventStatusChange : ServerPacket
{
public GuildEventAwayChange() : base(ServerOpcodes.GuildEventAwayChange) { }
public GuildEventStatusChange() : base(ServerOpcodes.GuildEventAwayChange) { }
public override void Write()
{
@@ -426,7 +426,6 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteBit(Removed);
_worldPacket.WriteBits(LeaverName.GetByteCount(), 6);
_worldPacket.FlushBits();
if (Removed)
{
@@ -63,7 +63,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(TableHash);
_worldPacket.WriteUInt32(RecordID);
_worldPacket.WriteUInt32(Timestamp);
_worldPacket.WriteBit(Allow);
_worldPacket.WriteBits(Status, 2);
_worldPacket.WriteUInt32(Data.GetSize());
_worldPacket.WriteBytes(Data.GetData());
}
@@ -71,7 +71,7 @@ namespace Game.Networking.Packets
public uint TableHash;
public uint Timestamp;
public uint RecordID;
public bool Allow;
public byte Status = 3;
public ByteBuffer Data = new ByteBuffer();
}
@@ -147,12 +147,12 @@ namespace Game.Networking.Packets
if (Size.HasValue)
{
data.WriteUInt32(Size.Value);
data.WriteBit(true);
data.WriteBits(1, 2);
}
else
{
data.WriteUInt32(0);
data.WriteBit(false);
data.WriteBits(3, 2);
}
data.FlushBits();
}
@@ -224,14 +224,9 @@ namespace Game.Networking.Packets
public string Name;
public uint SpecializationID;
public byte GenderID;
public byte Skin;
public byte HairColor;
public byte HairStyle;
public byte FacialHairStyle;
public byte Face;
public byte Race;
public byte ClassID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public List<ChrCustomizationChoice> Customizations = new List<ChrCustomizationChoice>();
public void Initialize(Player player)
{
@@ -239,14 +234,11 @@ namespace Game.Networking.Packets
SpecializationID = player.GetPrimarySpecialization();
Name = player.GetName();
GenderID = player.m_playerData.NativeSex;
Skin = player.m_playerData.SkinID;
HairColor = player.m_playerData.HairColorID;
HairStyle = player.m_playerData.HairStyleID;
FacialHairStyle = player.m_playerData.FacialHairStyleID;
Face = player.m_playerData.FaceID;
Race = (byte)player.GetRace();
ClassID = (byte)player.GetClass();
CustomDisplay.AddRange(player.m_playerData.CustomDisplayOption._values);
foreach (var customization in player.m_playerData.Customizations)
Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID));
for (byte i = 0; i < EquipmentSlot.End; ++i)
{
@@ -263,17 +255,14 @@ namespace Game.Networking.Packets
data.WriteInt32(Items.Count);
data.WriteBits(Name.GetByteCount(), 6);
data.WriteUInt8(GenderID);
data.WriteUInt8(Skin);
data.WriteUInt8(HairColor);
data.WriteUInt8(HairStyle);
data.WriteUInt8(FacialHairStyle);
data.WriteUInt8(Face);
data.WriteUInt8(Race);
data.WriteUInt8(ClassID);
CustomDisplay.ForEach(id => data.WriteUInt8(id));
data.WriteInt32(Customizations.Count);
data.WriteString(Name);
foreach (var customization in Customizations)
customization.Write(data);
foreach (InspectItemData item in Items)
item.Write(data);
}
+130 -40
View File
@@ -52,7 +52,7 @@ namespace Game.Networking.Packets
Muid = _worldPacket.ReadUInt32();
Slot = _worldPacket.ReadUInt32();
Item.Read(_worldPacket);
ItemType = (ItemVendorType)_worldPacket.ReadBits<int>(2);
ItemType = (ItemVendorType)_worldPacket.ReadBits<int>(3);
}
public ObjectGuid VendorGUID;
@@ -678,7 +678,7 @@ namespace Game.Networking.Packets
}
//Structs
public class ItemBonusInstanceData
public class ItemBonuses
{
public void Write(WorldPacket data)
{
@@ -708,13 +708,13 @@ namespace Game.Networking.Packets
public override bool Equals(object obj)
{
if (obj is ItemBonusInstanceData)
return (ItemBonusInstanceData)obj == this;
if (obj is ItemBonuses)
return (ItemBonuses)obj == this;
return false;
}
public static bool operator ==(ItemBonusInstanceData left, ItemBonusInstanceData right)
public static bool operator ==(ItemBonuses left, ItemBonuses right)
{
if (left.Context != right.Context)
return false;
@@ -725,7 +725,7 @@ namespace Game.Networking.Packets
return left.BonusListIDs.SequenceEqual(right.BonusListIDs);
}
public static bool operator !=(ItemBonusInstanceData left, ItemBonusInstanceData right)
public static bool operator !=(ItemBonuses left, ItemBonuses right)
{
return !(left == right);
}
@@ -734,8 +734,118 @@ namespace Game.Networking.Packets
public List<uint> BonusListIDs = new List<uint>();
}
public class ItemMod
{
public uint Value;
public ItemModifier Type;
public ItemMod()
{
Type = ItemModifier.Max;
}
public ItemMod(uint value, ItemModifier type)
{
Value = value;
Type = type;
}
public void Read(WorldPacket data)
{
Value = data.ReadUInt32();
Type = (ItemModifier)data.ReadUInt8();
}
public void Write(WorldPacket data)
{
data.WriteUInt32(Value);
data.WriteUInt8((byte)Type);
}
public override int GetHashCode()
{
return Value.GetHashCode() ^ Type.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is ItemMod)
return (ItemMod)obj == this;
return false;
}
public static bool operator ==(ItemMod left, ItemMod right)
{
if (left.Value != right.Value)
return false;
return left.Type != right.Type;
}
public static bool operator !=(ItemMod left, ItemMod right)
{
return !(left == right);
}
}
public class ItemModList
{
public Array<ItemMod> Values = new Array<ItemMod>(ItemModifier.Max);
public void Read(WorldPacket data)
{
var itemModListCount = data.ReadBits<uint>(6);
for (var i = 0; i < itemModListCount; ++i)
{
var itemMod = new ItemMod();
itemMod.Read(data);
Values[i] = itemMod;
}
}
public void Write(WorldPacket data)
{
data.WriteBits(Values.Count, 6);
data.FlushBits();
foreach (ItemMod itemMod in Values)
itemMod.Write(data);
}
public override int GetHashCode()
{
return Values.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is ItemModList)
return (ItemModList)obj == this;
return false;
}
public static bool operator ==(ItemModList left, ItemModList right)
{
if (left.Values.Count != right.Values.Count)
return false;
return !left.Values.Except(right.Values).Any();
}
public static bool operator !=(ItemModList left, ItemModList right)
{
return !(left == right);
}
}
public class ItemInstance
{
public uint ItemID;
public Optional<ItemBonuses> ItemBonus;
public ItemModList Modifications = new ItemModList();
public ItemInstance() { }
public ItemInstance(Item item)
@@ -749,17 +859,8 @@ namespace Game.Networking.Packets
ItemBonus.Value.Context = item.GetContext();
}
uint mask = item.m_itemData.ModifiersMask;
if (mask != 0)
{
Modifications.HasValue = true;
for (int i = 0; mask != 0; mask >>= 1, ++i)
{
if ((mask & 1) != 0)
Modifications.Value.Insert(i, (int)item.GetModifier((ItemModifier)i));
}
}
foreach (var mod in item.m_itemData.Modifiers.Values)
Modifications.Values.Add(mod.Value, (ItemModifier)mod.Type);
}
public ItemInstance(Loots.LootItem lootItem)
@@ -780,14 +881,11 @@ namespace Game.Networking.Packets
{
ItemID = voidItem.ItemEntry;
if (voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0)
{
Modifications.HasValue = true;
if (voidItem.FixedScalingLevel != 0)
Modifications.Value.Insert((int)ItemModifier.TimewalkerLevel, (int)voidItem.FixedScalingLevel);
if (voidItem.ArtifactKnowledgeLevel != 0)
Modifications.Value.Insert((int)ItemModifier.ArtifactKnowledgeLevel, (int)voidItem.ArtifactKnowledgeLevel);
}
if (voidItem.FixedScalingLevel != 0)
Modifications.Values.Add(new ItemMod(voidItem.FixedScalingLevel, ItemModifier.TimewalkerLevel));
if (voidItem.ArtifactKnowledgeLevel != 0)
Modifications.Values.Add(new ItemMod(voidItem.ArtifactKnowledgeLevel, ItemModifier.ArtifactKnowledgeLevel));
if (!voidItem.BonusListIDs.Empty())
{
@@ -801,7 +899,7 @@ namespace Game.Networking.Packets
{
ItemID = gem.ItemId;
ItemBonusInstanceData bonus = new ItemBonusInstanceData();
ItemBonuses bonus = new ItemBonuses();
bonus.Context = (ItemContext)(byte)gem.Context;
foreach (ushort bonusListId in gem.BonusListIDs)
if (bonusListId != 0)
@@ -816,14 +914,12 @@ namespace Game.Networking.Packets
data.WriteUInt32(ItemID);
data.WriteBit(ItemBonus.HasValue);
data.WriteBit(Modifications.HasValue);
data.FlushBits();
Modifications.Write(data);
if (ItemBonus.HasValue)
ItemBonus.Value.Write(data);
if (Modifications.HasValue)
Modifications.Value.Write(data);
}
public void Read(WorldPacket data)
@@ -831,14 +927,12 @@ namespace Game.Networking.Packets
ItemID = data.ReadUInt32();
ItemBonus.HasValue = data.HasBit();
Modifications.HasValue = data.HasBit();
data.ResetBitPos();
Modifications.Read(data);
if (ItemBonus.HasValue)
ItemBonus.Value.Read(data);
if (Modifications.HasValue)
Modifications.Value.Read(data);
}
public override int GetHashCode()
@@ -859,10 +953,10 @@ namespace Game.Networking.Packets
if (left.ItemID != right.ItemID)
return false;
if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue)
if (left.ItemBonus.HasValue != right.ItemBonus.HasValue)
return false;
if (left.Modifications.HasValue && left.Modifications.Value != right.Modifications.Value)
if (left.Modifications != right.Modifications)
return false;
if (left.ItemBonus.HasValue && left.ItemBonus.Value != right.ItemBonus.Value)
@@ -875,10 +969,6 @@ namespace Game.Networking.Packets
{
return !(left == right);
}
public uint ItemID;
public Optional<ItemBonusInstanceData> ItemBonus;
public Optional<CompactArray> Modifications;
}
public class ItemEnchantData
+35 -47
View File
@@ -278,7 +278,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(BlackList.Count);
_worldPacket.WriteInt32(BlackListNames.Count);
foreach (LFGJoinBlackList blackList in BlackList)
foreach (LFGBlackListPkt blackList in BlackList)
blackList.Write(_worldPacket);
foreach (string str in BlackListNames)
@@ -292,7 +292,7 @@ namespace Game.Networking.Packets
public RideTicket Ticket = new RideTicket();
public byte Result;
public byte ResultDetail;
public List<LFGJoinBlackList> BlackList = new List<LFGJoinBlackList>();
public List<LFGBlackListPkt> BlackList = new List<LFGBlackListPkt>();
public List<string> BlackListNames = new List<string>();
}
@@ -440,23 +440,37 @@ namespace Game.Networking.Packets
//Structs
public class LFGBlackListSlot
{
public LFGBlackListSlot(uint slot, uint reason, int subReason1, int subReason2)
{
public uint Slot;
public uint Reason;
public int SubReason1;
public int SubReason2;
public uint SoftLock;
public LFGBlackListSlot(uint slot, uint reason, int subReason1, int subReason2, uint softLock)
{
Slot = slot;
Reason = reason;
SubReason1 = subReason1;
SubReason2 = subReason2;
SoftLock = softLock;
}
public uint Slot { get; set; }
public uint Reason { get; set; }
public int SubReason1 { get; set; }
public int SubReason2 { get; set; }
public void Write(WorldPacket data)
{
data.WriteUInt32(Slot);
data.WriteUInt32(Reason);
data.WriteInt32(SubReason1);
data.WriteInt32(SubReason2);
data.WriteUInt32(SoftLock);
}
}
public class LFGBlackList
{
{
public Optional<ObjectGuid> PlayerGuid;
public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
public void Write(WorldPacket data)
{
data.WriteBit(PlayerGuid.HasValue);
@@ -464,17 +478,9 @@ namespace Game.Networking.Packets
if (PlayerGuid.HasValue)
data.WritePackedGuid(PlayerGuid.Value);
foreach (LFGBlackListSlot lfgBlackListSlot in Slot)
{
data.WriteUInt32(lfgBlackListSlot.Slot);
data.WriteUInt32(lfgBlackListSlot.Reason);
data.WriteInt32(lfgBlackListSlot.SubReason1);
data.WriteInt32(lfgBlackListSlot.SubReason2);
}
foreach (LFGBlackListSlot slot in Slot)
slot.Write(data);
}
public Optional<ObjectGuid> PlayerGuid;
public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
}
public struct LfgPlayerQuestRewardItem
@@ -639,40 +645,22 @@ namespace Game.Networking.Packets
public bool RoleCheckComplete;
}
public struct LFGJoinBlackListSlot
{
public LFGJoinBlackListSlot(int slot, int reason, int subReason1, int subReason2)
{
Slot = slot;
Reason = reason;
SubReason1 = subReason1;
SubReason2 = subReason2;
}
public int Slot { get; set; }
public int Reason { get; set; }
public int SubReason1 { get; set; }
public int SubReason2 { get; set; }
}
public class LFGJoinBlackList
public class LFGBlackListPkt
{
public void Write(WorldPacket data)
{
data.WritePackedGuid(PlayerGuid);
data.WriteInt32(Slots.Count);
data.WriteBit(PlayerGuid.HasValue);
data.WriteInt32(Slot.Count);
foreach (LFGJoinBlackListSlot lfgBlackListSlot in Slots)
{
data.WriteInt32(lfgBlackListSlot.Slot);
data.WriteInt32(lfgBlackListSlot.Reason);
data.WriteInt32(lfgBlackListSlot.SubReason1);
data.WriteInt32(lfgBlackListSlot.SubReason2);
}
if (PlayerGuid.HasValue)
data.WritePackedGuid(PlayerGuid.Value);
foreach (LFGBlackListSlot slot in Slot)
slot.Write(data);
}
public ObjectGuid PlayerGuid;
public List<LFGJoinBlackListSlot> Slots = new List<LFGJoinBlackListSlot>();
public Optional<ObjectGuid> PlayerGuid;
public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
}
public struct LFGPlayerRewards
+21 -20
View File
@@ -124,6 +124,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(WeeklyQuantity.HasValue);
_worldPacket.WriteBit(TrackedQuantity.HasValue);
_worldPacket.WriteBit(MaxQuantity.HasValue);
_worldPacket.WriteBit(Unused901.HasValue);
_worldPacket.WriteBit(SuppressChatLog);
_worldPacket.WriteBit(QuantityChange.HasValue);
_worldPacket.WriteBit(QuantityGainSource.HasValue);
@@ -139,6 +140,9 @@ namespace Game.Networking.Packets
if (MaxQuantity.HasValue)
_worldPacket.WriteInt32(MaxQuantity.Value);
if (Unused901.HasValue)
_worldPacket.WriteInt32(Unused901.Value);
if (QuantityChange.HasValue)
_worldPacket.WriteInt32(QuantityChange.Value);
@@ -155,6 +159,7 @@ namespace Game.Networking.Packets
public Optional<int> WeeklyQuantity;
public Optional<int> TrackedQuantity;
public Optional<int> MaxQuantity;
public Optional<int> Unused901;
public Optional<int> QuantityChange;
public Optional<int> QuantityGainSource;
public Optional<int> QuantityLostSource;
@@ -204,6 +209,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(data.MaxWeeklyQuantity.HasValue);
_worldPacket.WriteBit(data.TrackedQuantity.HasValue);
_worldPacket.WriteBit(data.MaxQuantity.HasValue);
_worldPacket.WriteBit(data.Unused901.HasValue);
_worldPacket.WriteBits(data.Flags, 5);
_worldPacket.FlushBits();
@@ -215,6 +221,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(data.TrackedQuantity.Value);
if (data.MaxQuantity.HasValue)
_worldPacket.WriteInt32(data.MaxQuantity.Value);
if (data.Unused901.HasValue)
_worldPacket.WriteInt32(data.Unused901.Value);
}
}
@@ -228,6 +236,7 @@ namespace Game.Networking.Packets
public Optional<uint> MaxWeeklyQuantity; // Weekly Currency cap.
public Optional<uint> TrackedQuantity;
public Optional<int> MaxQuantity;
public Optional<int> Unused901;
public byte Flags; // 0 = none,
}
}
@@ -366,7 +375,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(RestrictedAccountMaxLevel.Value);
if (RestrictedAccountMaxMoney.HasValue)
_worldPacket.WriteUInt32(RestrictedAccountMaxMoney.Value);
_worldPacket.WriteUInt64(RestrictedAccountMaxMoney.Value);
if (InstanceGroupSize.HasValue)
_worldPacket.WriteUInt32(InstanceGroupSize.Value);
@@ -378,7 +387,7 @@ namespace Game.Networking.Packets
public bool BlockExitingLoadingScreen; // when set to true, sending SMSG_UPDATE_OBJECT with CreateObject Self bit = true will not hide loading screen
// instead it will be done after this packet is sent again with false in this bit and SMSG_UPDATE_OBJECT Values for player
public Optional<uint> RestrictedAccountMaxLevel;
public Optional<uint> RestrictedAccountMaxMoney;
public Optional<ulong> RestrictedAccountMaxMoney;
public Optional<uint> InstanceGroupSize;
}
@@ -864,12 +873,14 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(SourceObjectGUID);
_worldPacket.WritePackedGuid(TargetObjectGUID);
_worldPacket.WriteVector3(Position);
_worldPacket.WriteInt32(BroadcastTextID);
}
ObjectGuid TargetObjectGUID;
ObjectGuid SourceObjectGUID;
uint SoundKitID;
Vector3 Position;
public ObjectGuid TargetObjectGUID;
public ObjectGuid SourceObjectGUID;
public uint SoundKitID;
public Vector3 Position;
public int BroadcastTextID;
}
class PlaySound : ServerPacket
@@ -884,10 +895,12 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteUInt32(SoundKitID);
_worldPacket.WritePackedGuid(SourceObjectGuid);
_worldPacket.WriteInt32(BroadcastTextID);
}
ObjectGuid SourceObjectGuid;
uint SoundKitID;
public ObjectGuid SourceObjectGuid;
public uint SoundKitID;
public int BroadcastTextID;
}
class PlaySpeakerBoxSound : ServerPacket
@@ -948,18 +961,6 @@ namespace Game.Networking.Packets
public bool Enable;
}
class Dismount : ServerPacket
{
public Dismount() : base(ServerOpcodes.Dismount) { }
public override void Write()
{
_worldPacket.WritePackedGuid(Guid);
}
public ObjectGuid Guid;
}
class SaveCUFProfiles : ClientPacket
{
public SaveCUFProfiles(WorldPacket packet) : base(packet) { }
+112 -27
View File
@@ -161,8 +161,8 @@ namespace Game.Networking.Packets
data.WriteBit(hasTransportData);
data.WriteBit(hasFallData);
data.WriteBit(hasSpline);
data.WriteBit(0); // HeightChangeFailed
data.WriteBit(0); // RemoteTimeValid
data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid
data.FlushBits();
if (hasTransportData)
@@ -206,10 +206,11 @@ namespace Game.Networking.Packets
data.WriteBits((byte)moveSpline.facing.type, 2); // Face
bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration());
data.WriteBits(moveSpline.GetPath().Length, 16);
data.WriteBits((byte)moveSpline.spline.m_mode, 2); // Mode
data.WriteBit(0); // HasSplineFilter
data.WriteBit(false); // HasSplineFilter
data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData
data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic)); // HasJumpExtraData
data.WriteBit(moveSpline.anim_tier.HasValue); // HasAnimationTierTransition
data.WriteBit(false); // HasUnknown901
data.FlushBits();
//if (HasSplineFilterKey)
@@ -258,6 +259,25 @@ namespace Game.Networking.Packets
data.WriteInt32(moveSpline.effect_start_time);
data.WriteUInt32(0); // Duration (override)
}
if (moveSpline.anim_tier.HasValue)
{
data.WriteUInt32(moveSpline.anim_tier.Value.TierTransitionId);
data.WriteInt32(moveSpline.effect_start_time);
data.WriteUInt32(0);
data.WriteUInt8(moveSpline.anim_tier.Value.AnimTier);
}
//if (HasUnknown901)
//{
// for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) size = 16
// {
// data << int32(unkInner.Unknown_1);
// data << int32(unkInner.Unknown_2);
// data << int32(unkInner.Unknown_3);
// data << uint32(unkInner.Unknown_4);
// }
//}
}
}
@@ -353,8 +373,10 @@ namespace Game.Networking.Packets
if (splineFlags.HasFlag(SplineFlag.Animation))
{
movementSpline.AnimTier = splineFlags.GetAnimTier();
movementSpline.TierTransStartTime = (uint)moveSpline.effect_start_time;
movementSpline.AnimTierTransition.HasValue = true;
movementSpline.AnimTierTransition.Value.TierTransitionID = (int)moveSpline.anim_tier.Value.TierTransitionId;
movementSpline.AnimTierTransition.Value.StartTime = (uint)moveSpline.effect_start_time;
movementSpline.AnimTierTransition.Value.AnimTier = moveSpline.anim_tier.Value.AnimTier;
}
movementSpline.MoveTime = (uint)moveSpline.Duration();
@@ -562,14 +584,14 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt32(MapID);
_worldPacket.WriteXYZO(Pos);
Loc.Write(_worldPacket);
_worldPacket.WriteUInt32(Reason);
_worldPacket.WriteXYZ(MovementOffset);
}
public uint MapID;
public uint Reason;
public Position Pos;
public TeleportLocation Loc = new TeleportLocation();
public Position MovementOffset; // Adjusts all pending movement events by this offset
}
@@ -894,10 +916,9 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(SequenceIndex);
_worldPacket.WriteFloat(Height);
_worldPacket.WriteFloat(Scale);
_worldPacket.WriteUInt8((byte)Reason);
_worldPacket.WriteUInt32(MountDisplayID);
_worldPacket.WriteInt32(ScaleDuration);
_worldPacket.WriteBits((uint)Reason, 2);
_worldPacket.FlushBits();
}
public float Scale = 1.0f;
@@ -934,7 +955,7 @@ namespace Game.Networking.Packets
Data.Read(_worldPacket);
Height = _worldPacket.ReadFloat();
MountDisplayID = _worldPacket.ReadUInt32();
Reason = (UpdateCollisionHeightReason)_worldPacket.ReadBits<uint>(2);
Reason = (UpdateCollisionHeightReason)_worldPacket.ReadUInt8();
}
public MovementAck Data;
@@ -1118,13 +1139,10 @@ namespace Game.Networking.Packets
data.WriteBit(MovementForceGUID.HasValue);
data.FlushBits();
if (CollisionHeight.HasValue)
{
data.WriteFloat(CollisionHeight.Value.Height);
data.WriteFloat(CollisionHeight.Value.Scale);
data.WriteBits(CollisionHeight.Value.Reason, 2);
data.FlushBits();
}
if (MovementForce_.HasValue)
MovementForce_.Value.Write(data);
if (Speed.HasValue)
data.WriteFloat(Speed.Value);
@@ -1139,11 +1157,16 @@ namespace Game.Networking.Packets
if (VehicleRecID.HasValue)
data.WriteInt32(VehicleRecID.Value);
if (CollisionHeight.HasValue)
{
data.WriteFloat(CollisionHeight.Value.Height);
data.WriteFloat(CollisionHeight.Value.Scale);
data.WriteBits(CollisionHeight.Value.Reason, 2);
data.FlushBits();
}
if (MovementForceGUID.HasValue)
data.WritePackedGuid(MovementForceGUID.Value);
if (MovementForce_.HasValue)
MovementForce_.Value.Write(data);
}
public ServerOpcodes MessageID;
@@ -1238,26 +1261,81 @@ namespace Game.Networking.Packets
}
}
struct MonsterSplineAnimTierTransition
{
public int TierTransitionID;
public uint StartTime;
public uint EndTime;
public byte AnimTier;
public void Write(WorldPacket data)
{
data.WriteInt32(TierTransitionID);
data .WriteUInt32(StartTime);
data.WriteUInt32(EndTime);
data.WriteUInt8(AnimTier);
}
}
class MonsterSplineUnknown901
{
public Array<Inner> Data = new Array<Inner>(16);
public void Write(WorldPacket data)
{
foreach (var unkInner in Data)
{
data.WriteInt32(unkInner.Unknown_1);
data.WriteInt32(unkInner.Unknown_2);
data.WriteInt32(unkInner.Unknown_3);
data.WriteUInt32(unkInner.Unknown_4);
}
}
public struct Inner
{
public int Unknown_1;
public int Unknown_2;
public int Unknown_3;
public uint Unknown_4;
}
}
public class TeleportLocation
{
public Vector4 Pos;
public int Unused901_1 = -1;
public int Unused901_2 = -1;
public void Write(WorldPacket data)
{
data.WriteVector4(Pos);
data.WriteInt32(Unused901_1);
data.WriteInt32(Unused901_2);
}
}
public class MovementSpline
{
public void Write(WorldPacket data)
{
data.WriteUInt32(Flags);
data.WriteUInt8(AnimTier);
data.WriteUInt32(TierTransStartTime);
data.WriteInt32(Elapsed);
data.WriteUInt32(MoveTime);
data.WriteUInt32(FadeObjectTime);
data.WriteUInt8(Mode);
data.WriteUInt8(VehicleExitVoluntary);
data.WritePackedGuid(TransportGUID);
data.WriteInt8(VehicleSeat);
data.WriteBits((byte)Face, 2);
data.WriteBits(Points.Count, 16);
data.WriteBit(VehicleExitVoluntary);
data.WriteBit(Interpolate);
data.WriteBits(PackedDeltas.Count, 16);
data.WriteBit(SplineFilter.HasValue);
data.WriteBit(SpellEffectExtraData.HasValue);
data.WriteBit(JumpExtraData.HasValue);
data.WriteBit(AnimTierTransition.HasValue);
data.WriteBit(Unknown901.HasValue);
data.FlushBits();
if (SplineFilter.HasValue)
@@ -1288,24 +1366,31 @@ namespace Game.Networking.Packets
if (JumpExtraData.HasValue)
JumpExtraData.Value.Write(data);
if (AnimTierTransition.HasValue)
AnimTierTransition.Value.Write(data);
if (Unknown901.HasValue)
Unknown901.Value.Write(data);
}
public uint Flags; // Spline flags
public MonsterMoveType Face; // Movement direction (see MonsterMoveType enum)
public byte AnimTier;
public uint TierTransStartTime;
public int Elapsed;
public uint MoveTime;
public uint FadeObjectTime;
public List<Vector3> Points = new List<Vector3>(); // Spline path
public byte Mode; // Spline mode - actually always 0 in this packet - Catmullrom mode appears only in SMSG_UPDATE_OBJECT. In this packet it is determined by flags
public byte VehicleExitVoluntary;
public bool VehicleExitVoluntary;
public bool Interpolate;
public ObjectGuid TransportGUID;
public sbyte VehicleSeat = -1;
public List<Vector3> PackedDeltas = new List<Vector3>();
public Optional<MonsterSplineFilter> SplineFilter;
public Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData;
public Optional<MonsterSplineJumpExtraData> JumpExtraData;
public Optional<MonsterSplineAnimTierTransition> AnimTierTransition;
public Optional<MonsterSplineUnknown901> Unknown901;
public float FaceDirection;
public ObjectGuid FaceGUID;
public Vector3 FaceSpot;
+53 -19
View File
@@ -65,27 +65,17 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(options.Text.GetByteCount(), 12);
_worldPacket.WriteBits(options.Confirm.GetByteCount(), 12);
_worldPacket.WriteBits((byte)options.Status, 2);
_worldPacket.FlushBits();
options.Treasure.Write(_worldPacket);
_worldPacket.WriteString(options.Text);
_worldPacket.WriteString(options.Confirm);
}
foreach (ClientGossipText text in GossipText)
{
_worldPacket.WriteInt32(text.QuestID);
_worldPacket.WriteInt32(text.QuestType);
_worldPacket.WriteInt32(text.QuestLevel);
_worldPacket.WriteInt32(text.QuestMaxScalingLevel);
_worldPacket.WriteInt32(text.QuestFlags);
_worldPacket.WriteInt32(text.QuestFlagsEx);
_worldPacket.WriteBit(text.Repeatable);
_worldPacket.WriteBits(text.QuestTitle.GetByteCount(), 9);
_worldPacket.FlushBits();
_worldPacket.WriteString(text.QuestTitle);
}
text.Write(_worldPacket);
}
public List<ClientGossipOptions> GossipOptions = new List<ClientGossipOptions>();
@@ -297,26 +287,68 @@ namespace Game.Networking.Packets
}
//Structs
public struct TreasureItem
{
public GossipOptionRewardType Type;
public int ID;
public int Quantity;
public void Write(WorldPacket data)
{
data.WriteBits((byte)Type, 1);
data.WriteInt32(ID);
data.WriteInt32(Quantity);
}
}
public class TreasureLootList
{
public List<TreasureItem> Items = new List<TreasureItem>();
public void Write(WorldPacket data)
{
data.WriteInt32(Items.Count);
foreach (TreasureItem treasureItem in Items)
treasureItem.Write(data);
}
}
public struct ClientGossipOptions
{
public int ClientOption;
public byte OptionNPC;
public byte OptionFlags;
public int OptionCost;
public GossipOptionStatus Status;
public string Text;
public string Confirm;
public TreasureLootList Treasure;
}
public class ClientGossipText
{
public int QuestID;
public uint QuestID;
public int ContentTuningID;
public int QuestType;
public int QuestLevel;
public int QuestMaxScalingLevel;
public bool Repeatable;
public string QuestTitle;
public int QuestFlags;
public int QuestFlagsEx;
public uint QuestFlags;
public uint QuestFlagsEx;
public void Write(WorldPacket data)
{
data.WriteUInt32(QuestID);
data.WriteInt32(ContentTuningID);
data.WriteInt32(QuestType);
data.WriteUInt32(QuestFlags);
data.WriteUInt32(QuestFlagsEx);
data.WriteBit(Repeatable);
data.WriteBits(QuestTitle.GetByteCount(), 9);
data.FlushBits();
data.WriteString(QuestTitle);
}
}
public class VendorItemPkt
@@ -332,6 +364,7 @@ namespace Game.Networking.Packets
data.WriteInt32(ExtendedCostID);
data.WriteInt32(PlayerConditionFailed);
Item.Write(data);
data.WriteBit(Locked);
data.WriteBit(DoNotFilterOnVendor);
data.WriteBit(Refundable);
data.FlushBits();
@@ -346,6 +379,7 @@ namespace Game.Networking.Packets
public int StackCount;
public int ExtendedCostID;
public int PlayerConditionFailed;
public bool Locked;
public bool DoNotFilterOnVendor;
public bool Refundable;
}
+29 -22
View File
@@ -85,9 +85,8 @@ namespace Game.Networking.Packets
ProposedRoles = proposedRoles;
InviterVirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress();
InviterRealmNameActual = Global.WorldMgr.GetRealm().Name;
InviterRealmNameNormalized = Global.WorldMgr.GetRealm().NormalizedName;
var realm = Global.WorldMgr.GetRealm();
InviterRealm = new VirtualRealmInfo(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName);
}
public override void Write()
@@ -97,15 +96,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(IsXRealm);
_worldPacket.WriteBit(MustBeBNetFriend);
_worldPacket.WriteBit(AllowMultipleRoles);
_worldPacket.WriteBit(QuestSessionActive);
_worldPacket.WriteBits(InviterName.GetByteCount(), 6);
_worldPacket.WriteUInt32(InviterVirtualRealmAddress);
_worldPacket.WriteBit(IsLocal);
_worldPacket.WriteBit(Unk2);
_worldPacket.WriteBits(InviterRealmNameActual.GetByteCount(), 8);
_worldPacket.WriteBits(InviterRealmNameNormalized.GetByteCount(), 8);
_worldPacket.WriteString(InviterRealmNameActual);
_worldPacket.WriteString(InviterRealmNameNormalized);
InviterRealm.Write(_worldPacket);
_worldPacket.WritePackedGuid(InviterGUID);
_worldPacket.WritePackedGuid(InviterBNetAccountId);
@@ -123,22 +117,19 @@ namespace Game.Networking.Packets
public bool MightCRZYou;
public bool MustBeBNetFriend;
public bool AllowMultipleRoles;
public bool Unk2;
public bool QuestSessionActive;
public ushort Unk1;
public bool CanAccept;
// Inviter
public VirtualRealmInfo InviterRealm;
public ObjectGuid InviterGUID;
public ObjectGuid InviterBNetAccountId;
public string InviterName;
// Realm
public bool IsXRealm;
public bool IsLocal = true;
public uint InviterVirtualRealmAddress;
public string InviterRealmNameActual;
public string InviterRealmNameNormalized;
// Lfg
public uint ProposedRoles;
@@ -919,21 +910,21 @@ namespace Game.Networking.Packets
}
class PartyMemberAuraStates
{
{
public int SpellID;
public ushort Flags;
public uint ActiveFlags;
public List<float> Points = new List<float>();
public void Write(WorldPacket data)
{
data.WriteInt32(SpellID);
data.WriteUInt8(Flags);
data.WriteUInt16(Flags);
data.WriteUInt32(ActiveFlags);
data.WriteInt32(Points.Count);
foreach (float points in Points)
data.WriteFloat(points);
}
public int SpellID;
public byte Flags;
public uint ActiveFlags;
public List<float> Points = new List<float>();
}
class PartyMemberPetStats
@@ -962,6 +953,20 @@ namespace Game.Networking.Packets
public List<PartyMemberAuraStates> Auras = new List<PartyMemberAuraStates>();
}
public struct CTROptions
{
public uint ContentTuningConditionMask;
public int Unused901;
public uint ExpansionLevelMask;
public void Write(WorldPacket data)
{
data.WriteUInt32(ContentTuningConditionMask);
data.WriteInt32(Unused901);
data.WriteUInt32(ExpansionLevelMask);
}
}
class PartyMemberStats
{
public void Write(WorldPacket data)
@@ -988,6 +993,7 @@ namespace Game.Networking.Packets
data.WriteInt32(Auras.Count);
Phases.Write(data);
ChromieTime.Write(data);
foreach (PartyMemberAuraStates aura in Auras)
aura.Write(data);
@@ -1025,6 +1031,7 @@ namespace Game.Networking.Packets
public ushort WmoGroupID;
public uint WmoDoodadPlacementID;
public sbyte[] PartyType = new sbyte[2];
public CTROptions ChromieTime;
}
struct PartyPlayerInfo
@@ -132,7 +132,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Stats.RequiredExpansion);
_worldPacket.WriteUInt32(Stats.VignetteID);
_worldPacket.WriteInt32(Stats.Class);
_worldPacket.WriteFloat(Stats.FadeRegionRadius);
_worldPacket.WriteInt32(Stats.WidgetSetID);
_worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID);
@@ -722,7 +721,6 @@ namespace Game.Networking.Packets
public uint RequiredExpansion;
public uint VignetteID;
public int Class;
public float FadeRegionRadius;
public int WidgetSetID;
public int WidgetSetUnitConditionID;
public uint[] Flags = new uint[2];
+119 -103
View File
@@ -108,7 +108,6 @@ namespace Game.Networking.Packets
public override void Write()
{
_worldPacket.WriteUInt32(QuestID);
_worldPacket.WriteBit(Allow);
_worldPacket.FlushBits();
@@ -116,11 +115,8 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteUInt32(Info.QuestID);
_worldPacket.WriteInt32(Info.QuestType);
_worldPacket.WriteInt32(Info.QuestLevel);
_worldPacket.WriteInt32(Info.QuestScalingFactionGroup);
_worldPacket.WriteInt32(Info.QuestMaxScalingLevel);
_worldPacket.WriteUInt32(Info.QuestPackageID);
_worldPacket.WriteInt32(Info.QuestMinLevel);
_worldPacket.WriteInt32(Info.ContentTuningID);
_worldPacket.WriteInt32(Info.QuestSortID);
_worldPacket.WriteUInt32(Info.QuestInfoID);
_worldPacket.WriteUInt32(Info.SuggestedGroupNum);
@@ -131,10 +127,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Info.RewardMoneyDifficulty);
_worldPacket.WriteFloat(Info.RewardMoneyMultiplier);
_worldPacket.WriteUInt32(Info.RewardBonusMoney);
foreach (uint id in Info.RewardDisplaySpell)
_worldPacket.WriteUInt32(id);
_worldPacket.WriteInt32(Info.RewardDisplaySpell.Count);
_worldPacket.WriteUInt32(Info.RewardSpell);
_worldPacket.WriteUInt32(Info.RewardHonor);
_worldPacket.WriteFloat(Info.RewardKillHonor);
@@ -204,6 +197,9 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Info.ManagedWorldStateID);
_worldPacket.WriteInt32(Info.QuestSessionBonus);
foreach (QuestCompleteDisplaySpell rewardDisplaySpell in Info.RewardDisplaySpell)
rewardDisplaySpell.Write(_worldPacket);
_worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9);
_worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12);
_worldPacket.WriteBits(Info.QuestDescription.GetByteCount(), 12);
@@ -213,6 +209,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Info.PortraitTurnInText.GetByteCount(), 10);
_worldPacket.WriteBits(Info.PortraitTurnInName.GetByteCount(), 8);
_worldPacket.WriteBits(Info.QuestCompletionLog.GetByteCount(), 11);
_worldPacket.WriteBit(Info.ReadyForTranslation);
_worldPacket.FlushBits();
foreach (QuestObjective questObjective in Info.Objectives)
@@ -358,7 +355,7 @@ namespace Game.Networking.Packets
public ObjectGuid QuestGiverGUID;
public uint QuestID;
public uint ItemChoiceID;
public QuestChoiceItem Choice;
}
public class QuestGiverQuestComplete : ServerPacket
@@ -627,21 +624,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Greeting.GetByteCount(), 11);
_worldPacket.FlushBits();
foreach (GossipText gossip in QuestDataText)
{
_worldPacket.WriteUInt32(gossip.QuestID);
_worldPacket.WriteUInt32(gossip.QuestType);
_worldPacket.WriteUInt32(gossip.QuestLevel);
_worldPacket.WriteUInt32(gossip.QuestMaxScalingLevel);
_worldPacket.WriteUInt32(gossip.QuestFlags);
_worldPacket.WriteUInt32(gossip.QuestFlagsEx);
_worldPacket.WriteBit(gossip.Repeatable);
_worldPacket.WriteBits(gossip.QuestTitle.GetByteCount(), 9);
_worldPacket.FlushBits();
_worldPacket.WriteString(gossip.QuestTitle);
}
foreach (ClientGossipText gossip in QuestDataText)
gossip.Write(_worldPacket);
_worldPacket.WriteString(Greeting);
}
@@ -649,7 +633,7 @@ namespace Game.Networking.Packets
public ObjectGuid QuestGiverGUID;
public uint GreetEmoteDelay;
public uint GreetEmoteType;
public List<GossipText> QuestDataText = new List<GossipText>();
public List<ClientGossipText> QuestDataText = new List<ClientGossipText>();
public string Greeting = "";
}
@@ -901,6 +885,18 @@ namespace Game.Networking.Packets
public uint DisplayID;
}
public struct QuestCompleteDisplaySpell
{
public int SpellID;
public int PlayerConditionID;
public void Write(WorldPacket data)
{
data.WriteInt32(SpellID);
data.WriteInt32(PlayerConditionID);
}
}
public class QuestInfo
{
public QuestInfo()
@@ -918,11 +914,8 @@ namespace Game.Networking.Packets
public uint QuestID;
public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client)
public int QuestScalingFactionGroup;
public int QuestMaxScalingLevel = 255;
public int ContentTuningID;
public uint QuestPackageID;
public int QuestMinLevel;
public int QuestSortID; // zone or sort to display in quest log
public uint QuestInfoID;
public uint SuggestedGroupNum;
@@ -933,7 +926,7 @@ namespace Game.Networking.Packets
public uint RewardMoneyDifficulty;
public float RewardMoneyMultiplier = 1.0f;
public uint RewardBonusMoney;
public uint[] RewardDisplaySpell = new uint[SharedConst.QuestRewardDisplaySpellCount]; // reward spell, this spell will be displayed (icon)
public List<QuestCompleteDisplaySpell> RewardDisplaySpell = new List<QuestCompleteDisplaySpell>(); // reward spell, this spell will be displayed (icon)
public uint RewardSpell;
public uint RewardHonor;
public float RewardKillHonor;
@@ -986,16 +979,59 @@ namespace Game.Networking.Packets
public int[] RewardFactionCapIn = new int[SharedConst.QuestRewardReputationsCount];
public uint[] RewardCurrencyID = new uint[SharedConst.QuestRewardCurrencyCount];
public uint[] RewardCurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount];
public bool ReadyForTranslation;
}
public struct QuestChoiceItem
{
public LootItemType LootItemType;
public ItemInstance Item;
public uint Quantity;
public void Read(WorldPacket data)
{
data.ResetBitPos();
LootItemType = (LootItemType)data.ReadBits<byte>(2);
Item = new ItemInstance();
Item.Read(data);
Quantity = data.ReadUInt32();
}
public void Write(WorldPacket data)
{
data.WriteBits((byte)LootItemType, 2);
Item.Write(data);
data.WriteUInt32(Quantity);
}
}
public class QuestRewards
{
{
public uint ChoiceItemCount;
public uint ItemCount;
public uint Money;
public uint XP;
public uint ArtifactXP;
public uint ArtifactCategoryID;
public uint Honor;
public uint Title;
public uint FactionFlags;
public Array<int> SpellCompletionDisplayID = new Array<int>(SharedConst.QuestRewardDisplaySpellCount);
public uint SpellCompletionID;
public uint SkillLineID;
public uint NumSkillUps;
public uint TreasurePickerID;
public Array<QuestChoiceItem> ChoiceItems = new Array<QuestChoiceItem>(SharedConst.QuestRewardChoicesCount);
public Array<uint> ItemID = new Array<uint>(SharedConst.QuestRewardItemCount);
public Array<uint> ItemQty = new Array<uint>(SharedConst.QuestRewardItemCount);
public Array<uint> FactionID = new Array<uint>(SharedConst.QuestRewardReputationsCount);
public Array<int> FactionValue = new Array<int>(SharedConst.QuestRewardReputationsCount);
public Array<int> FactionOverride = new Array<int>(SharedConst.QuestRewardReputationsCount);
public Array<int> FactionCapIn = new Array<int>(SharedConst.QuestRewardReputationsCount);
public Array<uint> CurrencyID = new Array<uint>(SharedConst.QuestRewardCurrencyCount);
public Array<uint> CurrencyQty = new Array<uint>(SharedConst.QuestRewardCurrencyCount);
public bool IsBoostSpell;
public void Write(WorldPacket data)
{
data.WriteUInt32(ChoiceItemCount);
@@ -1038,40 +1074,12 @@ namespace Game.Networking.Packets
data.WriteUInt32(NumSkillUps);
data.WriteUInt32(TreasurePickerID);
for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
{
ChoiceItems[i].Item.Write(data);
data.WriteUInt32(ChoiceItems[i].Quantity);
}
foreach (var choice in ChoiceItems)
choice.Write(data);
data.WriteBit(IsBoostSpell);
data.FlushBits();
}
public uint ChoiceItemCount;
public uint ItemCount;
public uint Money;
public uint XP;
public uint ArtifactXP;
public uint ArtifactCategoryID;
public uint Honor;
public uint Title;
public uint FactionFlags;
public int[] SpellCompletionDisplayID = new int[SharedConst.QuestRewardDisplaySpellCount];
public uint SpellCompletionID;
public uint SkillLineID;
public uint NumSkillUps;
public uint TreasurePickerID;
public QuestChoiceItem[] ChoiceItems = new QuestChoiceItem[SharedConst.QuestRewardChoicesCount];
public uint[] ItemID = new uint[SharedConst.QuestRewardItemCount];
public uint[] ItemQty = new uint[SharedConst.QuestRewardItemCount];
public uint[] FactionID = new uint[SharedConst.QuestRewardReputationsCount];
public int[] FactionValue = new int[SharedConst.QuestRewardReputationsCount];
public int[] FactionOverride = new int[SharedConst.QuestRewardReputationsCount];
public int[] FactionCapIn = new int[SharedConst.QuestRewardReputationsCount];
public uint[] CurrencyID = new uint[SharedConst.QuestRewardCurrencyCount];
public uint[] CurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount];
public bool IsBoostSpell;
}
public struct QuestDescEmote
@@ -1105,6 +1113,7 @@ namespace Game.Networking.Packets
}
data.WriteBit(AutoLaunched);
data.WriteBit(false); // Unused
data.FlushBits();
Rewards.Write(data);
@@ -1154,30 +1163,6 @@ namespace Game.Networking.Packets
public int Amount;
}
public struct GossipText
{
public GossipText(uint questID, uint questType, uint questLevel, uint questMaxScalingLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle)
{
QuestID = questID;
QuestType = questType;
QuestLevel = questLevel;
QuestMaxScalingLevel = questMaxScalingLevel;
QuestFlags = questFlags;
QuestFlagsEx = questFlagsEx;
Repeatable = repeatable;
QuestTitle = questTitle;
}
public uint QuestID;
public uint QuestType;
public uint QuestLevel;
public uint QuestMaxScalingLevel;
public uint QuestFlags;
public uint QuestFlagsEx;
public bool Repeatable;
public string QuestTitle;
}
struct WorldQuestUpdateInfo
{
public WorldQuestUpdateInfo(int lastUpdate, uint questID, uint timer, int variableID, int value)
@@ -1255,17 +1240,60 @@ namespace Game.Networking.Packets
public List<PlayerChoiceResponseRewardEntry> ItemChoices = new List<PlayerChoiceResponseRewardEntry>();
}
class PlayerChoiceResponse
struct PlayerChoiceResponseMawPower
{
public int Unused901_1;
public int TypeArtFileID;
public int Rarity;
public uint RarityColor;
public int Unused901_2;
public int SpellID;
public int MaxStacks;
public void Write(WorldPacket data)
{
data.WriteInt32(Unused901_1);
data.WriteInt32(TypeArtFileID);
data.WriteInt32(Rarity);
data.WriteUInt32(RarityColor);
data.WriteInt32(Unused901_2);
data.WriteInt32(SpellID);
data.WriteInt32(MaxStacks);
}
}
class PlayerChoiceResponse
{
public int ResponseID;
public ushort ResponseIdentifier;
public int ChoiceArtFileID;
public int Flags;
public uint WidgetSetID;
public uint UiTextureAtlasElementID;
public uint SoundKitID;
public byte GroupID;
public int UiTextureKitID;
public string Answer;
public string Header;
public string SubHeader;
public string ButtonTooltip;
public string Description;
public string Confirmation;
public Optional<PlayerChoiceResponseReward> Reward;
public Optional<uint> RewardQuestID;
public Optional<PlayerChoiceResponseMawPower> MawPower;
public void Write(WorldPacket data)
{
data.WriteInt32(ResponseID);
data.WriteUInt16(ResponseIdentifier);
data.WriteInt32(ChoiceArtFileID);
data.WriteInt32(Flags);
data.WriteUInt32(WidgetSetID);
data.WriteUInt32(UiTextureAtlasElementID);
data.WriteUInt32(SoundKitID);
data.WriteUInt8(GroupID);
data.WriteInt32(UiTextureKitID);
data.WriteBits(Answer.GetByteCount(), 9);
data.WriteBits(Header.GetByteCount(), 9);
@@ -1276,6 +1304,7 @@ namespace Game.Networking.Packets
data.WriteBit(RewardQuestID.HasValue);
data.WriteBit(Reward.HasValue);
data.WriteBit(MawPower.HasValue);
data.FlushBits();
if (Reward.HasValue)
@@ -1290,22 +1319,9 @@ namespace Game.Networking.Packets
if (RewardQuestID.HasValue)
data.WriteUInt32(RewardQuestID.Value);
}
public int ResponseID;
public int ChoiceArtFileID;
public int Flags;
public uint WidgetSetID;
public uint UiTextureAtlasElementID;
public uint SoundKitID;
public byte GroupID;
public string Answer;
public string Header;
public string SubHeader;
public string ButtonTooltip;
public string Description;
public string Confirmation;
public Optional<PlayerChoiceResponseReward> Reward;
public Optional<uint> RewardQuestID;
if (MawPower.HasValue)
MawPower.Value.Write(data);
}
}
}
@@ -22,7 +22,7 @@ namespace Game.Networking.Packets
{
public class InitializeFactions : ServerPacket
{
const ushort FactionCount = 350;
const ushort FactionCount = 400;
public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { }
@@ -147,12 +147,14 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(scenarioPOI.Flags);
_worldPacket.WriteInt32(scenarioPOI.WorldEffectID);
_worldPacket.WriteInt32(scenarioPOI.PlayerConditionID);
_worldPacket.WriteInt32(scenarioPOI.NavigationPlayerConditionID);
_worldPacket.WriteInt32(scenarioPOI.Points.Count);
foreach (var scenarioPOIBlobPoint in scenarioPOI.Points)
{
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.X);
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Y);
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Z);
}
}
}
@@ -47,7 +47,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Contacts.Count, 8);
_worldPacket.FlushBits();
Contacts.ForEach(p => p.Write(_worldPacket));
foreach (ContactInfo contact in Contacts)
contact.Write(_worldPacket);
}
public List<ContactInfo> Contacts;
+126 -55
View File
@@ -332,6 +332,7 @@ namespace Game.Networking.Packets
{
_worldPacket.WriteInt32(SpellID.Count);
_worldPacket.WriteInt32(FavoriteSpellID.Count);
_worldPacket.WriteUInt32(SpecializationID);
foreach (uint spell in SpellID)
_worldPacket.WriteUInt32(spell);
@@ -345,6 +346,7 @@ namespace Game.Networking.Packets
public List<uint> SpellID = new List<uint>();
public List<int> FavoriteSpellID = new List<int>();
public uint SpecializationID;
public bool SuppressMessaging;
}
@@ -357,13 +359,15 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterUnit);
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteUInt32(SpellID);
_worldPacket.WriteUInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt16(Reason);
}
public ObjectGuid CasterUnit;
public uint SpellID;
public uint SpellXSpellVisualID;
public SpellCastVisual Visual;
public ushort Reason;
public ObjectGuid CastID;
}
@@ -377,49 +381,51 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterUnit);
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteUInt32(SpellID);
_worldPacket.WriteUInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt16(Reason);
}
public ObjectGuid CasterUnit;
public uint SpellID;
public uint SpellXSpellVisualID;
public SpellCastVisual Visual;
public ushort Reason;
public ObjectGuid CastID;
}
class CastFailedBase : ServerPacket
class CastFailed : ServerPacket
{
public CastFailedBase(ServerOpcodes serverOpcodes, ConnectionType connectionType) : base(serverOpcodes, connectionType) { }
public override void Write() { throw new NotImplementedException(); }
public ObjectGuid CastID;
public int SpellID;
public SpellCastVisual Visual;
public SpellCastResult Reason;
public int FailedArg1 = -1;
public int FailedArg2 = -1;
}
class CastFailed : CastFailedBase
{
public CastFailed() : base(ServerOpcodes.CastFailed, ConnectionType.Instance) { }
public override void Write()
{
_worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteInt32((int)Reason);
_worldPacket.WriteInt32(FailedArg1);
_worldPacket.WriteInt32(FailedArg2);
}
public int SpellXSpellVisualID;
}
class PetCastFailed : CastFailedBase
class PetCastFailed : ServerPacket
{
public ObjectGuid CastID;
public int SpellID;
public SpellCastResult Reason;
public int FailedArg1 = -1;
public int FailedArg2 = -1;
public PetCastFailed() : base(ServerOpcodes.PetCastFailed, ConnectionType.Instance) { }
public override void Write()
@@ -673,10 +679,13 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(Source);
_worldPacket.WriteUInt32(SpellVisualKitID);
_worldPacket.WriteBit(MountedVisual);
_worldPacket.FlushBits();
}
public ObjectGuid Source;
public uint SpellVisualKitID;
public bool MountedVisual;
}
class PlayOrphanSpellVisual : ServerPacket
@@ -753,12 +762,15 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(KitRecID);
_worldPacket.WriteUInt32(KitType);
_worldPacket.WriteUInt32(Duration);
_worldPacket.WriteBit(MountedVisual);
_worldPacket.FlushBits();
}
public ObjectGuid Unit;
public uint KitRecID;
public uint KitType;
public uint Duration;
public bool MountedVisual;
}
public class CancelCast : ClientPacket
@@ -797,7 +809,9 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt32(ChannelDuration);
_worldPacket.WriteBit(InterruptImmunities.HasValue);
_worldPacket.WriteBit(HealPrediction.HasValue);
@@ -811,7 +825,7 @@ namespace Game.Networking.Packets
}
public int SpellID;
public int SpellXSpellVisualID;
public SpellCastVisual Visual;
public Optional<SpellChannelStartInterruptImmunities> InterruptImmunities;
public ObjectGuid CasterGUID;
public Optional<SpellTargetedHealPrediction> HealPrediction;
@@ -905,35 +919,28 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(UnitGUID);
_worldPacket.WriteInt32(DisplayID);
_worldPacket.WriteInt32(SpellVisualKitID);
_worldPacket.WriteUInt8(RaceID);
_worldPacket.WriteUInt8(Gender);
_worldPacket.WriteUInt8(ClassID);
_worldPacket.WriteUInt8(SkinColor);
_worldPacket.WriteUInt8(FaceVariation);
_worldPacket.WriteUInt8(HairVariation);
_worldPacket.WriteUInt8(HairColor);
_worldPacket.WriteUInt8(BeardVariation);
CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteInt32(Customizations.Count);
_worldPacket.WritePackedGuid(GuildGUID);
_worldPacket.WriteInt32(ItemDisplayID.Count);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(_worldPacket);
foreach (var itemDisplayId in ItemDisplayID)
_worldPacket.WriteInt32(itemDisplayId);
}
public ObjectGuid UnitGUID;
public int DisplayID;
public int SpellVisualKitID;
public byte RaceID;
public byte Gender;
public byte ClassID;
public byte SkinColor;
public byte FaceVariation;
public byte HairVariation;
public byte HairColor;
public byte BeardVariation;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public List<ChrCustomizationChoice> Customizations = new List<ChrCustomizationChoice>();
public ObjectGuid GuildGUID;
public List<int> ItemDisplayID = new List<int>();
@@ -947,10 +954,12 @@ namespace Game.Networking.Packets
{
_worldPacket.WritePackedGuid(UnitGUID);
_worldPacket.WriteInt32(DisplayID);
_worldPacket.WriteInt32(SpellVisualKitID);
}
public ObjectGuid UnitGUID;
public int DisplayID;
public int SpellVisualKitID;
}
class SpellClick : ClientPacket
@@ -1299,10 +1308,10 @@ namespace Game.Networking.Packets
}
public void Write(WorldPacket data)
{
{
data.WriteFloat(PlayerItemLevel);
data.WriteFloat(TargetItemLevel);
data.WriteInt16(PlayerLevelDelta);
data.WriteUInt16(PlayerItemLevel);
data.WriteUInt16(TargetItemLevel);
data.WriteUInt16(ScalingHealthItemLevelCurveID);
data.WriteUInt8(TargetLevel);
data.WriteUInt8(Expansion);
@@ -1316,8 +1325,8 @@ namespace Game.Networking.Packets
public ContentTuningType TuningType;
public short PlayerLevelDelta;
public ushort PlayerItemLevel;
public ushort TargetItemLevel;
public float PlayerItemLevel;
public float TargetItemLevel;
public ushort ScalingHealthItemLevelCurveID;
public byte TargetLevel;
public byte Expansion;
@@ -1335,14 +1344,34 @@ namespace Game.Networking.Packets
}
}
public struct SpellCastVisual
{
public uint SpellXSpellVisualID;
public int ScriptVisualID;
public void Read(WorldPacket data)
{
SpellXSpellVisualID = data.ReadUInt32();
ScriptVisualID = data.ReadInt32();
}
public void Write(WorldPacket data)
{
data.WriteUInt32(SpellXSpellVisualID);
data.WriteInt32(ScriptVisualID);
}
}
public class AuraDataInfo
{
public void Write(WorldPacket data)
{
data.WritePackedGuid(CastID);
data.WriteInt32(SpellID);
data.WriteInt32(SpellXSpellVisualID);
data.WriteUInt8((byte)Flags);
Visual.Write(data);
data.WriteUInt16((ushort)Flags);
data.WriteUInt32(ActiveFlags);
data.WriteUInt16(CastLevel);
data.WriteUInt8(Applications);
@@ -1379,7 +1408,7 @@ namespace Game.Networking.Packets
public ObjectGuid CastID;
public int SpellID;
public int SpellXSpellVisualID;
public SpellCastVisual Visual;
public AuraFlags Flags;
public uint ActiveFlags;
public ushort CastLevel = 1;
@@ -1519,17 +1548,68 @@ namespace Game.Networking.Packets
public uint Quantity;
}
public class SpellCastRequest
public struct SpellOptionalReagent
{
public int ItemID;
public int Slot;
public int Count;
public void Read(WorldPacket data)
{
ItemID = data.ReadInt32();
Slot = data.ReadInt32();
Count = data.ReadInt32();
}
}
public struct SpellExtraCurrencyCost
{
public int CurrencyID;
public int Count;
public void Read(WorldPacket data)
{
CurrencyID = data.ReadInt32();
Count = data.ReadInt32();
}
}
public class SpellCastRequest
{
public ObjectGuid CastID;
public uint SpellID;
public SpellCastVisual Visual;
public uint SendCastFlags;
public SpellTargetData Target = new SpellTargetData();
public MissileTrajectoryRequest MissileTrajectory;
public Optional<MovementInfo> MoveUpdate;
public List<SpellWeight> Weight = new List<SpellWeight>();
public Array<SpellOptionalReagent> OptionalReagents = new Array<SpellOptionalReagent>(3);
public Array<SpellExtraCurrencyCost> OptionalCurrencies = new Array<SpellExtraCurrencyCost>(5 /*MAX_ITEM_EXT_COST_CURRENCIES*/);
public ObjectGuid CraftingNPC;
public uint[] Misc = new uint[2];
public void Read(WorldPacket data)
{
CastID = data.ReadPackedGuid();
Misc[0] = data.ReadUInt32();
Misc[1] = data.ReadUInt32();
SpellID = data.ReadUInt32();
SpellXSpellVisualID = data.ReadUInt32();
Visual.Read(data);
MissileTrajectory.Read(data);
CraftingNPC = data.ReadPackedGuid();
var optionalReagents = data.ReadUInt32();
var optionalCurrencies = data.ReadUInt32();
for (var i = 0; i < optionalReagents; ++i)
OptionalReagents[i].Read(data);
for (var i = 0; i < optionalCurrencies; ++i)
OptionalCurrencies[i].Read(data);
SendCastFlags = data.ReadBits<uint>(5);
MoveUpdate.HasValue = data.HasBit();
var weightCount = data.ReadBits<uint>(2);
@@ -1548,17 +1628,6 @@ namespace Game.Networking.Packets
Weight.Add(weight);
}
}
public ObjectGuid CastID;
public uint SpellID;
public uint SpellXSpellVisualID;
public uint SendCastFlags;
public SpellTargetData Target = new SpellTargetData();
public MissileTrajectoryRequest MissileTrajectory;
public Optional<MovementInfo> MoveUpdate;
public List<SpellWeight> Weight = new List<SpellWeight>();
public ObjectGuid CraftingNPC;
public uint[] Misc = new uint[2];
}
public struct SpellHitStatus
@@ -1685,7 +1754,9 @@ namespace Game.Networking.Packets
data.WritePackedGuid(CastID);
data.WritePackedGuid(OriginalCastID);
data.WriteInt32(SpellID);
data.WriteUInt32(SpellXSpellVisualID);
Visual.Read(data);
data.WriteUInt32((uint)CastFlags);
data.WriteUInt32((uint)CastFlagsEx);
data.WriteUInt32(CastTime);
@@ -1736,7 +1807,7 @@ namespace Game.Networking.Packets
public ObjectGuid CastID;
public ObjectGuid OriginalCastID;
public int SpellID;
public uint SpellXSpellVisualID;
public SpellCastVisual Visual;
public SpellCastFlags CastFlags;
public SpellCastFlagsEx CastFlagsEx;
public uint CastTime;
+63 -35
View File
@@ -50,6 +50,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(TwitterPostThrottleCooldown);
_worldPacket.WriteUInt32(TokenPollTimeSeconds);
_worldPacket.WriteUInt32(KioskSessionMinutes);
_worldPacket.WriteInt64(TokenBalanceAmount);
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
@@ -71,7 +72,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(RestrictedAccount);
_worldPacket.WriteBit(CommerceSystemEnabled);
_worldPacket.WriteBit(TutorialsEnabled);
_worldPacket.WriteBit(NPETutorialsEnabled);
_worldPacket.WriteBit(TwitterEnabled);
_worldPacket.WriteBit(Unk67);
_worldPacket.WriteBit(WillKickFromWorld);
@@ -88,6 +88,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(QuestSessionEnabled);
_worldPacket.WriteBit(IsMuted);
_worldPacket.WriteBit(ClubFinderEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.FlushBits();
{
@@ -123,22 +124,12 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(SessionAlert.Value.DisplayTime);
}
_worldPacket.WriteBit(VoiceChatManagerSettings.IsSquelched);
_worldPacket.WritePackedGuid(VoiceChatManagerSettings.BnetAccountGuid);
_worldPacket.WritePackedGuid(VoiceChatManagerSettings.GuildGuid);
_worldPacket.WriteBit(Squelch.IsSquelched);
_worldPacket.WritePackedGuid(Squelch.BnetAccountGuid);
_worldPacket.WritePackedGuid(Squelch.GuildGuid);
if (EuropaTicketSystemStatus.HasValue)
{
_worldPacket.WriteBit(EuropaTicketSystemStatus.Value.TicketsEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.Value.BugsEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.Value.ComplaintsEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.Value.SuggestionsEnabled);
_worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.MaxTries);
_worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.PerMilliseconds);
_worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.TryCount);
_worldPacket.WriteUInt32(EuropaTicketSystemStatus.Value.ThrottleState.LastResetTimeBeforeNow);
}
EuropaTicketSystemStatus.Value.Write(_worldPacket);
}
public bool VoiceEnabled;
@@ -160,6 +151,7 @@ namespace Game.Networking.Packets
public uint BpayStoreProductDeliveryDelay;
public uint ClubsPresenceUpdateTimer;
public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden
public uint KioskSessionMinutes;
public bool ItemRestorationButtonEnabled;
public bool CharUndeleteEnabled; // Implemented
public bool BpayStoreDisabledByParentalControls;
@@ -183,29 +175,12 @@ namespace Game.Networking.Packets
public bool QuestSessionEnabled;
public bool IsMuted;
public bool ClubFinderEnabled;
public bool Unknown901CheckoutRelated;
public SocialQueueConfig QuickJoinConfig;
public VoiceChatProxySettings VoiceChatManagerSettings;
public SquelchInfo Squelch;
public RafSystemFeatureInfo RAFSystem;
public struct SavedThrottleObjectState
{
public uint MaxTries;
public uint PerMilliseconds;
public uint TryCount;
public uint LastResetTimeBeforeNow;
}
public struct EuropaTicketConfig
{
public bool TicketsEnabled;
public bool BugsEnabled;
public bool ComplaintsEnabled;
public bool SuggestionsEnabled;
public SavedThrottleObjectState ThrottleState;
}
public struct SessionAlertConfig
{
public int Delay;
@@ -240,7 +215,7 @@ namespace Game.Networking.Packets
public float ThrottleDfBestPriority;
}
public struct VoiceChatProxySettings
public struct SquelchInfo
{
public bool IsSquelched;
public ObjectGuid BnetAccountGuid;
@@ -279,16 +254,28 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(LiveRegionCharacterListEnabled);
_worldPacket.WriteBit(LiveRegionCharacterCopyEnabled);
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
_worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
_worldPacket.FlushBits();
if (EuropaTicketSystemStatus.HasValue)
EuropaTicketSystemStatus.Value.Write(_worldPacket);
_worldPacket.WriteUInt32(TokenPollTimeSeconds);
_worldPacket.WriteUInt32(KioskSessionMinutes);
_worldPacket.WriteInt64(TokenBalanceAmount);
_worldPacket.WriteInt32(MaxCharactersPerRealm);
_worldPacket.WriteInt32(LiveRegionCharacterCopySourceRegions.Count);
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
_worldPacket.WriteInt32(ActiveCharacterUpgradeBoostType);
_worldPacket.WriteInt32(ActiveClassTrialBoostType);
_worldPacket.WriteInt32(MinimumExpansionLevel);
_worldPacket.WriteInt32(MaximumExpansionLevel);
foreach (var sourceRegion in LiveRegionCharacterCopySourceRegions)
_worldPacket.WriteInt32(sourceRegion);
}
public bool BpayStoreAvailable; // NYI
@@ -306,6 +293,10 @@ namespace Game.Networking.Packets
public bool LiveRegionCharacterListEnabled; // NYI
public bool LiveRegionCharacterCopyEnabled; // NYI
public bool LiveRegionAccountCopyEnabled; // NYI
public bool LiveRegionKeyBindingsCopyEnabled = false;
public bool Unknown901CheckoutRelated = false; // NYI
public Optional<EuropaTicketConfig> EuropaTicketSystemStatus;
public List<int> LiveRegionCharacterCopySourceRegions = new List<int>();
public uint TokenPollTimeSeconds; // NYI
public long TokenBalanceAmount; // NYI
public int MaxCharactersPerRealm;
@@ -314,6 +305,7 @@ namespace Game.Networking.Packets
public int ActiveClassTrialBoostType; // NYI
public int MinimumExpansionLevel;
public int MaximumExpansionLevel;
public uint KioskSessionMinutes;
}
public class MOTD : ServerPacket
@@ -351,4 +343,40 @@ namespace Game.Networking.Packets
public string ServerTimeTZ;
public string GameTimeTZ;
}
public struct SavedThrottleObjectState
{
public uint MaxTries;
public uint PerMilliseconds;
public uint TryCount;
public uint LastResetTimeBeforeNow;
public void Write(WorldPacket data)
{
data.WriteUInt32(MaxTries);
data.WriteUInt32(PerMilliseconds);
data.WriteUInt32(TryCount);
data.WriteUInt32(LastResetTimeBeforeNow);
}
}
public struct EuropaTicketConfig
{
public bool TicketsEnabled;
public bool BugsEnabled;
public bool ComplaintsEnabled;
public bool SuggestionsEnabled;
public SavedThrottleObjectState ThrottleState;
public void Write(WorldPacket data)
{
data.WriteBit(TicketsEnabled);
data.WriteBit(BugsEnabled);
data.WriteBit(ComplaintsEnabled);
data.WriteBit(SuggestionsEnabled);
ThrottleState.Write(data);
}
}
}
@@ -102,31 +102,22 @@ namespace Game.Networking.Packets
int CaseID;
}
public class SupportTicketSubmitBug : ClientPacket
public class SubmitUserFeedback : ClientPacket
{
public SupportTicketHeader Header;
public string Note;
public bool IsSuggestion;
public SupportTicketSubmitBug(WorldPacket packet) : base(packet) { }
public SubmitUserFeedback(WorldPacket packet) : base(packet) { }
public override void Read()
{
Header.Read(_worldPacket);
Note = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(10));
}
}
uint noteLength = _worldPacket.ReadBits<uint>(24);
IsSuggestion = _worldPacket.HasBit();
public class SupportTicketSubmitSuggestion : ClientPacket
{
public SupportTicketHeader Header;
public string Note;
public SupportTicketSubmitSuggestion(WorldPacket packet) : base(packet) { }
public override void Read()
{
Header.Read(_worldPacket);
Note = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(10));
if (noteLength != 0)
Note = _worldPacket.ReadString(noteLength - 1);
}
}
@@ -91,10 +91,12 @@ namespace Game.Networking.Packets
ItemModifiedAppearanceID = data.ReadInt32();
Slot = data.ReadUInt32();
SpellItemEnchantmentID = data.ReadInt32();
SecondaryItemModifiedAppearanceID = data.ReadInt32();
}
public int ItemModifiedAppearanceID;
public uint Slot;
public int SpellItemEnchantmentID;
public int SecondaryItemModifiedAppearanceID;
}
}