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
+14
View File
@@ -123,4 +123,18 @@ namespace Framework.Constants
public const uint GossipSenderSecMailbox = 9; public const uint GossipSenderSecMailbox = 9;
public const uint GossipSenderSecStablemaster = 10; public const uint GossipSenderSecStablemaster = 10;
} }
public enum GossipOptionStatus
{
Available = 0,
Unavailable = 1,
Locked = 2,
AlreadyComplete = 3
}
public enum GossipOptionRewardType
{
Item = 0,
Currency = 1
}
} }
+6
View File
@@ -85,6 +85,12 @@ namespace Framework.Constants
FishingJunk = 22 // unsupported by client, sending LOOT_FISHING instead FishingJunk = 22 // unsupported by client, sending LOOT_FISHING instead
} }
public enum LootItemType
{
Item = 0,
Currency = 1
}
public enum LootError public enum LootError
{ {
DidntKill = 0, // You don't have permission to loot that corpse. DidntKill = 0, // You don't have permission to loot that corpse.
@@ -32,12 +32,15 @@ namespace Framework.Constants
{ {
None = 0x00, None = 0x00,
// x00-x07 used as animation Ids storage in pair with Animation flag // x00-x07 used as animation Ids storage in pair with Animation flag
Unknown0 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation Unknown_0x1 = 0x00000001, // NOT VERIFIED
Unknown_0x2 = 0x00000002, // NOT VERIFIED
Unknown_0x4 = 0x00000004, // NOT VERIFIED
Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation
FallingSlow = 0x00000010, FallingSlow = 0x00000010,
Done = 0x00000020, Done = 0x00000020,
Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag
NoSpline = 0x00000080, NoSpline = 0x00000080,
Unknown1 = 0x00000100, // NOT VERIFIED Unknown_0x100 = 0x00000100, // NOT VERIFIED
Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation
OrientationFixed = 0x00000400, // Model orientation fixed OrientationFixed = 0x00000400, // Model orientation fixed
Catmullrom = 0x00000800, // Used Catmullrom interpolation mode Catmullrom = 0x00000800, // Used Catmullrom interpolation mode
@@ -46,27 +49,28 @@ namespace Framework.Constants
Frozen = 0x00004000, // Will never arrive Frozen = 0x00004000, // Will never arrive
TransportEnter = 0x00008000, TransportEnter = 0x00008000,
TransportExit = 0x00010000, TransportExit = 0x00010000,
Unknown2 = 0x00020000, // NOT VERIFIED Unknown_0x20000 = 0x00020000, // NOT VERIFIED
Unknown3 = 0x00040000, // NOT VERIFIED Unknown_0x40000 = 0x00040000, // NOT VERIFIED
Backward = 0x00080000, Backward = 0x00080000,
SmoothGroundPath = 0x00100000, SmoothGroundPath = 0x00100000,
CanSwim = 0x00200000, CanSwim = 0x00200000,
UncompressedPath = 0x00400000, UncompressedPath = 0x00400000,
Unknown4 = 0x00800000, // NOT VERIFIED Unknown_0x800000 = 0x00800000, // NOT VERIFIED
Unknown5 = 0x01000000, // NOT VERIFIED Unknown_0x1000000 = 0x01000000, // NOT VERIFIED
Animation = 0x02000000, // Plays animation after some time passed Animation = 0x02000000, // Plays animation after some time passed
Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag
FadeObject = 0x08000000, FadeObject = 0x08000000,
Steering = 0x10000000, Steering = 0x10000000,
Unknown8 = 0x20000000, // NOT VERIFIED Unknown_0x20000000 = 0x20000000, // NOT VERIFIED
Unknown9 = 0x40000000, // NOT VERIFIED Unknown_0x40000000 = 0x40000000, // NOT VERIFIED
Unknown10 = 0x80000000, // NOT VERIFIED Unknown_0x80000000 = 0x80000000, // NOT VERIFIED
// animation ids stored here, see AnimType enum, used with Animation flag // animation ids stored here, see AnimType enum, used with Animation flag
MaskAnimations = 0x7, MaskAnimations = 0x7,
// flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably
MaskNoMonsterMove = MaskAnimations | Done, MaskNoMonsterMove = Done,
// Unused, not suported flags // Unused, not suported flags
MaskUnused = NoSpline | EnterCycle | Frozen | Unknown0 | Unknown1 | Unknown2 | Unknown3 | Unknown4 | FadeObject | Steering | Unknown8 | Unknown9 | Unknown10 MaskUnused = NoSpline | EnterCycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000
| Unknown_0x800000 | Unknown_0x1000000 | FadeObject | Steering | Unknown_0x20000000 | Unknown_0x40000000 | Unknown_0x80000000
} }
} }
File diff suppressed because it is too large Load Diff
+8
View File
@@ -305,6 +305,14 @@ namespace Framework.IO
WriteBytes(buffer.GetData()); WriteBytes(buffer.GetData());
} }
public void WriteVector4(Vector4 pos)
{
WriteFloat(pos.X);
WriteFloat(pos.Y);
WriteFloat(pos.Z);
WriteFloat(pos.W);
}
public void WriteVector3(Vector3 pos) public void WriteVector3(Vector3 pos)
{ {
WriteFloat(pos.X); WriteFloat(pos.X);
+5 -1
View File
@@ -65,7 +65,11 @@ namespace Game.AI
/// <summary> /// <summary>
/// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 /// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
/// </summary> /// </summary>
public virtual void QuestReward(Player player, Quest quest, uint opt) { } public virtual void QuestReward(Player player, Quest quest, uint opt)
{
QuestReward(player, quest, LootItemType.Item, opt);
}
public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { }
/// <summary> /// <summary>
/// Called when the dialog status between a player and the gameobject is requested. /// Called when the dialog status between a player and the gameobject is requested.
+10 -5
View File
@@ -516,12 +516,17 @@ namespace Game.AI
/// <summary> /// <summary>
/// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 /// Called when a player completes a quest and is rewarded, opt is the selected item's index or 0
/// </summary> /// </summary>
public virtual void QuestReward(Player player, Quest quest, uint opt) { } public virtual void QuestReward(Player player, Quest quest, uint opt)
{
QuestReward(player, quest, LootItemType.Item, opt);
}
public virtual void QuestReward(Player player, Quest quest, LootItemType type, uint opt) { }
/// <summary>
/// Called when a game event starts or ends /// <summary>
/// </summary> /// Called when a game event starts or ends
public virtual void OnGameEvent(bool start, ushort eventId) { } /// </summary>
public virtual void OnGameEvent(bool start, ushort eventId) { }
// Called when the dialog status between a player and the creature is requested. // Called when the dialog status between a player and the creature is requested.
public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedNoStatus; } public virtual QuestGiverStatus GetDialogStatus(Player player) { return QuestGiverStatus.ScriptedNoStatus; }
+3 -3
View File
@@ -257,12 +257,12 @@ namespace Game.Chat.Commands
var poiData = Global.ObjectMgr.GetQuestPOIData(questID); var poiData = Global.ObjectMgr.GetQuestPOIData(questID);
if (poiData != null) if (poiData != null)
{ {
var data = poiData.QuestPOIBlobDataStats[0]; var data = poiData.Blobs[0];
mapId = (uint)data.MapID; mapId = (uint)data.MapID;
x = data.QuestPOIBlobPointStats[0].X; x = data.Points[0].X;
y = data.QuestPOIBlobPointStats[0].Y; y = data.Points[0].Y;
} }
else else
{ {
@@ -175,6 +175,18 @@ namespace Game.Entities
public float ZOffset; public float ZOffset;
} }
public struct AreaTriggerMovementScriptInfo
{
public uint SpellScriptID;
public Vector3 Center;
public void Write(WorldPacket data)
{
data.WriteUInt32(SpellScriptID);
data.WriteVector3(Center);
}
}
public class AreaTriggerTemplate : AreaTriggerData public class AreaTriggerTemplate : AreaTriggerData
{ {
public unsafe void InitMaxSearchRadius() public unsafe void InitMaxSearchRadius()
+10 -13
View File
@@ -275,9 +275,8 @@ namespace Game.Misc
{ {
ClientGossipText text = new ClientGossipText(); ClientGossipText text = new ClientGossipText();
text.QuestID = (int)questID; text.QuestID = (int)questID;
text.ContentTuningID = quest.ContentTuningId;
text.QuestType = item.QuestIcon; text.QuestType = item.QuestIcon;
text.QuestLevel = quest.Level;
text.QuestMaxScalingLevel = quest.MaxScalingLevel;
text.QuestFlags = (int)quest.Flags; text.QuestFlags = (int)quest.Flags;
text.QuestFlagsEx = (int)quest.FlagsEx; text.QuestFlagsEx = (int)quest.FlagsEx;
text.Repeatable = quest.IsRepeatable(); text.Repeatable = quest.IsRepeatable();
@@ -365,24 +364,22 @@ namespace Game.Misc
Quest quest = Global.ObjectMgr.GetQuestTemplate(questID); Quest quest = Global.ObjectMgr.GetQuestTemplate(questID);
if (quest != null) if (quest != null)
{ {
string title = quest.LogTitle; ClientGossipText text = new ClientGossipText();
text.QuestID = questID;
text.ContentTuningID = quest.ContentTuningId;
text.QuestType = questMenuItem.QuestIcon;
text.QuestFlags = (uint)quest.Flags;
text.QuestFlagsEx = (uint)quest.FlagsEx;
text.Repeatable = quest.IsRepeatable();
text.QuestTitle = quest.LogTitle;
if (localeConstant != Locale.enUS) if (localeConstant != Locale.enUS)
{ {
QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id); QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id);
if (localeData != null) if (localeData != null)
ObjectManager.GetLocaleString(localeData.LogTitle, localeConstant, ref title); ObjectManager.GetLocaleString(localeData.LogTitle, localeConstant, ref text.QuestTitle);
} }
GossipText text = new GossipText();
text.QuestID = questID;
text.QuestType = questMenuItem.QuestIcon;
text.QuestLevel = (uint)quest.Level;
text.QuestMaxScalingLevel = (uint)quest.MaxScalingLevel;
text.QuestFlags = (uint)quest.Flags;
text.QuestFlagsEx = (uint)quest.FlagsEx;
text.Repeatable = false; // NYI
text.QuestTitle = title;
questList.QuestDataText.Add(text); questList.QuestDataText.Add(text);
} }
} }
+8 -3
View File
@@ -323,11 +323,11 @@ namespace Game.Entities
data.WriteBits((uint)unit.GetUnitMovementFlags(), 30); data.WriteBits((uint)unit.GetUnitMovementFlags(), 30);
data.WriteBits((uint)unit.GetUnitMovementFlags2(), 18); data.WriteBits((uint)unit.GetUnitMovementFlags2(), 18);
data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport data.WriteBit(!unit.m_movementInfo.transport.guid.IsEmpty()); // HasTransport
data.WriteBit(HasFall); // HasFall data.WriteBit(HasFall); // HasFall
data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement data.WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
data.WriteBit(0); // HeightChangeFailed data.WriteBit(false); // HeightChangeFailed
data.WriteBit(0); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
if (!unit.m_movementInfo.transport.guid.IsEmpty()) if (!unit.m_movementInfo.transport.guid.IsEmpty())
MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport); MovementExtensions.WriteTransportInfo(data, unit.m_movementInfo.transport);
@@ -467,6 +467,7 @@ namespace Game.Entities
bool hasAreaTriggerCylinder = areaTriggerTemplate.IsCylinder(); bool hasAreaTriggerCylinder = areaTriggerTemplate.IsCylinder();
bool hasAreaTriggerSpline = areaTrigger.HasSplines(); bool hasAreaTriggerSpline = areaTrigger.HasSplines();
bool hasOrbit = areaTrigger.HasOrbit(); bool hasOrbit = areaTrigger.HasOrbit();
bool hasMovementScript = false;
data.WriteBit(hasAbsoluteOrientation); data.WriteBit(hasAbsoluteOrientation);
data.WriteBit(hasDynamicShape); data.WriteBit(hasDynamicShape);
@@ -489,6 +490,7 @@ namespace Game.Entities
data.WriteBit(hasAreaTriggerCylinder); data.WriteBit(hasAreaTriggerCylinder);
data.WriteBit(hasAreaTriggerSpline); data.WriteBit(hasAreaTriggerSpline);
data.WriteBit(hasOrbit); data.WriteBit(hasOrbit);
data.WriteBit(hasMovementScript);
if (hasUnk3) if (hasUnk3)
data.WriteBit(0); data.WriteBit(0);
@@ -571,6 +573,9 @@ namespace Game.Entities
data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffsetTarget); data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffsetTarget);
} }
//if (hasMovementScript)
// *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo
if (hasOrbit) if (hasOrbit)
areaTrigger.GetCircularMovementInfo().Value.Write(data); areaTrigger.GetCircularMovementInfo().Value.Write(data);
} }
@@ -497,6 +497,8 @@ namespace Game.Entities
public Array<ObjectGuid> Pieces = new Array<ObjectGuid>(EquipmentSlot.End); public Array<ObjectGuid> Pieces = new Array<ObjectGuid>(EquipmentSlot.End);
public Array<int> Appearances = new Array<int>(EquipmentSlot.End); // ItemModifiedAppearanceID public Array<int> Appearances = new Array<int>(EquipmentSlot.End); // ItemModifiedAppearanceID
public Array<int> Enchants = new Array<int>(2); // SpellItemEnchantmentID public Array<int> Enchants = new Array<int>(2); // SpellItemEnchantmentID
public int Unknown901_1;
public int Unknown901_2;
} }
public enum EquipmentSetType public enum EquipmentSetType
@@ -1335,10 +1335,6 @@ namespace Game.Entities
if (thisPlayer != null) if (thisPlayer != null)
thisPlayer.SendMovementSetCollisionHeight(thisPlayer.GetCollisionHeight(false)); thisPlayer.SendMovementSetCollisionHeight(thisPlayer.GetCollisionHeight(false));
Dismount data = new Dismount();
data.Guid = GetGUID();
SendMessageToSet(data, true);
// dismount as a vehicle // dismount as a vehicle
if (IsTypeId(TypeId.Player) && GetVehicleKit() != null) if (IsTypeId(TypeId.Player) && GetVehicleKit() != null)
{ {
+4 -4
View File
@@ -581,9 +581,9 @@ namespace Game.Garrisons
_owner.SendPacket(data); _owner.SendPacket(data);
} }
public void SendBuildingLandmarks(Player receiver) public void SendMapData(Player receiver)
{ {
GarrisonBuildingLandmarks buildingLandmarks = new GarrisonBuildingLandmarks(); GarrisonMapDataResponse mapData = new GarrisonMapDataResponse();
foreach (var plot in _plots.Values) foreach (var plot in _plots.Values)
{ {
@@ -591,11 +591,11 @@ namespace Game.Garrisons
{ {
uint garrBuildingPlotInstId = Global.GarrisonMgr.GetGarrBuildingPlotInst(plot.BuildingInfo.PacketInfo.Value.GarrBuildingID, plot.GarrSiteLevelPlotInstId); uint garrBuildingPlotInstId = Global.GarrisonMgr.GetGarrBuildingPlotInst(plot.BuildingInfo.PacketInfo.Value.GarrBuildingID, plot.GarrSiteLevelPlotInstId);
if (garrBuildingPlotInstId != 0) if (garrBuildingPlotInstId != 0)
buildingLandmarks.Landmarks.Add(new GarrisonBuildingLandmark(garrBuildingPlotInstId, plot.PacketInfo.PlotPos)); mapData.Buildings.Add(new GarrisonBuildingMapData(garrBuildingPlotInstId, plot.PacketInfo.PlotPos));
} }
} }
receiver.SendPacket(buildingLandmarks); receiver.SendPacket(mapData);
} }
Map FindMap() Map FindMap()
+38 -31
View File
@@ -7544,7 +7544,7 @@ namespace Game
_questPOIStorage[questID] = new QuestPOIData(questID); _questPOIStorage[questID] = new QuestPOIData(questID);
QuestPOIData poiData = _questPOIStorage[questID]; QuestPOIData poiData = _questPOIStorage[questID];
poiData.QuestPOIBlobDataStats.Add(new QuestPOIBlobData(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapId, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, POIs[questID][idx1], alwaysAllowMergingBlobs)); poiData.Blobs.Add(new QuestPOIBlobData(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapId, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, POIs[questID][idx1], alwaysAllowMergingBlobs));
++count; ++count;
} while (result.NextRow()); } while (result.NextRow());
@@ -10490,8 +10490,23 @@ namespace Game
public class QuestPOIBlobData public class QuestPOIBlobData
{ {
public int BlobIndex;
public int ObjectiveIndex;
public int QuestObjectiveID;
public int QuestObjectID;
public int MapID;
public int UiMapID;
public int Priority;
public int Flags;
public int WorldEffectID;
public int PlayerConditionID;
public int NavigationPlayerConditionID;
public int SpawnTrackingID;
public List<QuestPOIBlobPoint> Points;
public bool AlwaysAllowMergingBlobs;
public QuestPOIBlobData(int blobIndex, int objectiveIndex, int questObjectiveID, int questObjectID, int mapID, int uiMapID, int priority, int flags, public QuestPOIBlobData(int blobIndex, int objectiveIndex, int questObjectiveID, int questObjectID, int mapID, int uiMapID, int priority, int flags,
int worldEffectID, int playerConditionID, int spawnTrackingID, List<QuestPOIBlobPoint> questPOIBlobPointStats, bool alwaysAllowMergingBlobs) int worldEffectID, int playerConditionID, int spawnTrackingID, List<QuestPOIBlobPoint> points, bool alwaysAllowMergingBlobs)
{ {
BlobIndex = blobIndex; BlobIndex = blobIndex;
ObjectiveIndex = objectiveIndex; ObjectiveIndex = objectiveIndex;
@@ -10504,46 +10519,36 @@ namespace Game
WorldEffectID = worldEffectID; WorldEffectID = worldEffectID;
PlayerConditionID = playerConditionID; PlayerConditionID = playerConditionID;
SpawnTrackingID = spawnTrackingID; SpawnTrackingID = spawnTrackingID;
QuestPOIBlobPointStats = questPOIBlobPointStats; Points = points;
AlwaysAllowMergingBlobs = alwaysAllowMergingBlobs; AlwaysAllowMergingBlobs = alwaysAllowMergingBlobs;
} }
public int BlobIndex;
public int ObjectiveIndex;
public int QuestObjectiveID;
public int QuestObjectID;
public int MapID;
public int UiMapID;
public int Priority;
public int Flags;
public int WorldEffectID;
public int PlayerConditionID;
public int SpawnTrackingID;
public List<QuestPOIBlobPoint> QuestPOIBlobPointStats;
public bool AlwaysAllowMergingBlobs;
} }
public class QuestPOIBlobPoint public class QuestPOIBlobPoint
{ {
public QuestPOIBlobPoint(int _x, int _y)
{
X = _x;
Y = _y;
}
public int X; public int X;
public int Y; public int Y;
public int Z;
public QuestPOIBlobPoint(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
} }
public class QuestPOIData public class QuestPOIData
{ {
public uint QuestID; public uint QuestID;
public List<QuestPOIBlobData> QuestPOIBlobDataStats = new List<QuestPOIBlobData>(); public List<QuestPOIBlobData> Blobs;
public ByteBuffer QueryDataBuffer = new ByteBuffer(); public ByteBuffer QueryDataBuffer;
public QuestPOIData(uint questId) public QuestPOIData(uint questId)
{ {
QuestID = questId; QuestID = questId;
Blobs = new List<QuestPOIBlobData>();
QueryDataBuffer = new ByteBuffer();
} }
public void InitializeQueryData() public void InitializeQueryData()
@@ -10554,9 +10559,9 @@ namespace Game
public void Write(ByteBuffer data) public void Write(ByteBuffer data)
{ {
data.WriteUInt32(QuestID); data.WriteUInt32(QuestID);
data.WriteInt32(QuestPOIBlobDataStats.Count); data.WriteInt32(Blobs.Count);
foreach (QuestPOIBlobData questPOIBlobData in QuestPOIBlobDataStats) foreach (QuestPOIBlobData questPOIBlobData in Blobs)
{ {
data.WriteInt32(questPOIBlobData.BlobIndex); data.WriteInt32(questPOIBlobData.BlobIndex);
data.WriteInt32(questPOIBlobData.ObjectiveIndex); data.WriteInt32(questPOIBlobData.ObjectiveIndex);
@@ -10568,13 +10573,15 @@ namespace Game
data.WriteInt32(questPOIBlobData.Flags); data.WriteInt32(questPOIBlobData.Flags);
data.WriteInt32(questPOIBlobData.WorldEffectID); data.WriteInt32(questPOIBlobData.WorldEffectID);
data.WriteInt32(questPOIBlobData.PlayerConditionID); data.WriteInt32(questPOIBlobData.PlayerConditionID);
data.WriteInt32(questPOIBlobData.NavigationPlayerConditionID);
data.WriteInt32(questPOIBlobData.SpawnTrackingID); data.WriteInt32(questPOIBlobData.SpawnTrackingID);
data.WriteInt32(questPOIBlobData.QuestPOIBlobPointStats.Count); data.WriteInt32(questPOIBlobData.Points.Count);
foreach (QuestPOIBlobPoint questPOIBlobPoint in questPOIBlobData.QuestPOIBlobPointStats) foreach (QuestPOIBlobPoint questPOIBlobPoint in questPOIBlobData.Points)
{ {
data.WriteInt32(questPOIBlobPoint.X); data.WriteInt16((short)questPOIBlobPoint.X);
data.WriteInt32(questPOIBlobPoint.Y); data.WriteInt16((short)questPOIBlobPoint.Y);
data.WriteInt16((short)questPOIBlobPoint.Z);
} }
data.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs); data.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs);
+5 -5
View File
@@ -1107,11 +1107,11 @@ namespace Game.Guilds
else else
member.RemoveFlag(GuildMemberFlags.DND); member.RemoveFlag(GuildMemberFlags.DND);
GuildEventAwayChange awayChange = new GuildEventAwayChange(); GuildEventStatusChange statusChange = new GuildEventStatusChange();
awayChange.Guid = memberGuid; statusChange.Guid = memberGuid;
awayChange.AFK = afk; statusChange.AFK = afk;
awayChange.DND = dnd; statusChange.DND = dnd;
BroadcastPacket(awayChange); BroadcastPacket(statusChange);
} }
void SendEventBankMoneyChanged() void SendEventBankMoneyChanged()
+2 -2
View File
@@ -578,8 +578,8 @@ namespace Game
reportedPlayer.ReportedAfkBy(GetPlayer()); reportedPlayer.ReportedAfkBy(GetPlayer());
} }
[WorldPacketHandler(ClientOpcodes.RequestRatedBattlefieldInfo)] [WorldPacketHandler(ClientOpcodes.RequestRatedPvpInfo)]
void HandleRequestRatedBattlefieldInfo(RequestRatedBattlefieldInfo packet) void HandleRequestRatedPvpInfo(RequestRatedPvpInfo packet)
{ {
RatedPvpInfo ratedPvpInfo = new RatedPvpInfo(); RatedPvpInfo ratedPvpInfo = new RatedPvpInfo();
SendPacket(ratedPvpInfo); SendPacket(ratedPvpInfo);
+30 -30
View File
@@ -108,12 +108,12 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(GetPlayer().GetGUID(), CalendarError.EventInvalid); Global.CalendarMgr.SendCalendarCommandResult(GetPlayer().GetGUID(), CalendarError.EventInvalid);
} }
[WorldPacketHandler(ClientOpcodes.CalendarCommunityFilter)] [WorldPacketHandler(ClientOpcodes.CalendarCommunityInviteRequest)]
void HandleCalendarCommunityFilter(CalendarCommunityFilter calendarCommunityFilter) void HandleCalendarCommunityInvite(CalendarCommunityInviteRequest calendarCommunityInvite)
{ {
Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId()); Guild guild = Global.GuildMgr.GetGuildById(GetPlayer().GetGuildId());
if (guild) if (guild)
guild.MassInviteToEvent(this, calendarCommunityFilter.MinLevel, calendarCommunityFilter.MaxLevel, calendarCommunityFilter.MaxRankOrder); guild.MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder);
} }
[WorldPacketHandler(ClientOpcodes.CalendarAddEvent)] [WorldPacketHandler(ClientOpcodes.CalendarAddEvent)]
@@ -234,8 +234,8 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid); Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid);
} }
[WorldPacketHandler(ClientOpcodes.CalendarEventInvite)] [WorldPacketHandler(ClientOpcodes.CalendarInvite)]
void HandleCalendarEventInvite(CalendarEventInvite calendarEventInvite) void HandleCalendarInvite(CalendarInvitePkt calendarInvite)
{ {
ObjectGuid playerGuid = GetPlayer().GetGUID(); ObjectGuid playerGuid = GetPlayer().GetGUID();
@@ -243,10 +243,10 @@ namespace Game
Team inviteeTeam = 0; Team inviteeTeam = 0;
ulong inviteeGuildId = 0; ulong inviteeGuildId = 0;
if (!ObjectManager.NormalizePlayerName(ref calendarEventInvite.Name)) if (!ObjectManager.NormalizePlayerName(ref calendarInvite.Name))
return; return;
Player player = Global.ObjAccessor.FindPlayerByName(calendarEventInvite.Name); Player player = Global.ObjAccessor.FindPlayerByName(calendarInvite.Name);
if (player) if (player)
{ {
// Invitee is online // Invitee is online
@@ -257,7 +257,7 @@ namespace Game
else else
{ {
// Invitee offline, get data from database // Invitee offline, get data from database
ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(calendarEventInvite.Name); ObjectGuid guid = Global.CharacterCacheStorage.GetCharacterGuidByName(calendarInvite.Name);
if (!guid.IsEmpty()) if (!guid.IsEmpty())
{ {
CharacterCacheEntry characterInfo = Global.CharacterCacheStorage.GetCharacterCacheByGuid(guid); CharacterCacheEntry characterInfo = Global.CharacterCacheStorage.GetCharacterCacheByGuid(guid);
@@ -288,14 +288,14 @@ namespace Game
if (Convert.ToBoolean(result1.Read<byte>(0) & (byte)SocialFlag.Ignored)) if (Convert.ToBoolean(result1.Read<byte>(0) & (byte)SocialFlag.Ignored))
{ {
Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarEventInvite.Name); Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.IgnoringYouS, calendarInvite.Name);
return; return;
} }
} }
if (!calendarEventInvite.Creating) if (!calendarInvite.Creating)
{ {
CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventInvite.EventID); CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarInvite.EventID);
if (calendarEvent != null) if (calendarEvent != null)
{ {
if (calendarEvent.IsGuildEvent() && calendarEvent.GuildId == inviteeGuildId) if (calendarEvent.IsGuildEvent() && calendarEvent.GuildId == inviteeGuildId)
@@ -305,7 +305,7 @@ namespace Game
return; return;
} }
CalendarInvite invite = new CalendarInvite(Global.CalendarMgr.GetFreeInviteId(), calendarEventInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); CalendarInvite invite = new CalendarInvite(Global.CalendarMgr.GetFreeInviteId(), calendarInvite.EventID, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, "");
Global.CalendarMgr.AddInvite(calendarEvent, invite); Global.CalendarMgr.AddInvite(calendarEvent, invite);
} }
else else
@@ -313,13 +313,13 @@ namespace Game
} }
else else
{ {
if (calendarEventInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId()) if (calendarInvite.IsSignUp && inviteeGuildId == GetPlayer().GetGuildId())
{ {
Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites); Global.CalendarMgr.SendCalendarCommandResult(playerGuid, CalendarError.NoGuildInvites);
return; return;
} }
CalendarInvite invite = new CalendarInvite(calendarEventInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, ""); CalendarInvite invite = new CalendarInvite(calendarInvite.EventID, 0, inviteeGuid, playerGuid, SharedConst.CalendarDefaultResponseTime, CalendarInviteStatus.Invited, CalendarModerationRank.Player, "");
Global.CalendarMgr.SendCalendarEventInvite(invite); Global.CalendarMgr.SendCalendarEventInvite(invite);
} }
} }
@@ -347,25 +347,25 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid); Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventInvalid);
} }
[WorldPacketHandler(ClientOpcodes.CalendarEventRsvp)] [WorldPacketHandler(ClientOpcodes.CalendarRsvp)]
void HandleCalendarEventRsvp(CalendarEventRSVP calendarEventRSVP) void HandleCalendarRsvp(HandleCalendarRsvp calendarRSVP)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); ObjectGuid guid = GetPlayer().GetGUID();
CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventRSVP.EventID); CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarRSVP.EventID);
if (calendarEvent != null) if (calendarEvent != null)
{ {
// i think we still should be able to remove self from locked events // i think we still should be able to remove self from locked events
if (calendarEventRSVP.Status != CalendarInviteStatus.Removed && calendarEvent.IsLocked()) if (calendarRSVP.Status != CalendarInviteStatus.Removed && calendarEvent.IsLocked())
{ {
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventLocked); Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventLocked);
return; return;
} }
CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventRSVP.InviteID); CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarRSVP.InviteID);
if (invite != null) if (invite != null)
{ {
invite.Status = calendarEventRSVP.Status; invite.Status = calendarRSVP.Status;
invite.ResponseTime = Time.UnixTime; invite.ResponseTime = Time.UnixTime;
Global.CalendarMgr.UpdateInvite(invite); Global.CalendarMgr.UpdateInvite(invite);
@@ -399,22 +399,22 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite); Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite);
} }
[WorldPacketHandler(ClientOpcodes.CalendarEventStatus)] [WorldPacketHandler(ClientOpcodes.CalendarStatus)]
void HandleCalendarEventStatus(CalendarEventStatus calendarEventStatus) void HandleCalendarStatus(CalendarStatus calendarStatus)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); ObjectGuid guid = GetPlayer().GetGUID();
CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventStatus.EventID); CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarStatus.EventID);
if (calendarEvent != null) if (calendarEvent != null)
{ {
CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventStatus.InviteID); CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarStatus.InviteID);
if (invite != null) if (invite != null)
{ {
invite.Status = (CalendarInviteStatus)calendarEventStatus.Status; invite.Status = (CalendarInviteStatus)calendarStatus.Status;
Global.CalendarMgr.UpdateInvite(invite); Global.CalendarMgr.UpdateInvite(invite);
Global.CalendarMgr.SendCalendarEventStatus(calendarEvent, invite); Global.CalendarMgr.SendCalendarEventStatus(calendarEvent, invite);
Global.CalendarMgr.SendCalendarClearPendingAction(calendarEventStatus.Guid); Global.CalendarMgr.SendCalendarClearPendingAction(calendarStatus.Guid);
} }
else else
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite); // correct? Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.NoInvite); // correct?
@@ -424,17 +424,17 @@ namespace Game
} }
[WorldPacketHandler(ClientOpcodes.CalendarEventModeratorStatus)] [WorldPacketHandler(ClientOpcodes.CalendarEventModeratorStatus)]
void HandleCalendarEventModeratorStatus(CalendarEventModeratorStatus calendarEventModeratorStatus) void HandleCalendarModeratorStatus(CalendarModeratorStatusQuery calendarModeratorStatus)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); ObjectGuid guid = GetPlayer().GetGUID();
CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarEventModeratorStatus.EventID); CalendarEvent calendarEvent = Global.CalendarMgr.GetEvent(calendarModeratorStatus.EventID);
if (calendarEvent != null) if (calendarEvent != null)
{ {
CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarEventModeratorStatus.InviteID); CalendarInvite invite = Global.CalendarMgr.GetInvite(calendarModeratorStatus.InviteID);
if (invite != null) if (invite != null)
{ {
invite.Rank = (CalendarModerationRank)calendarEventModeratorStatus.Status; invite.Rank = (CalendarModerationRank)calendarModeratorStatus.Status;
Global.CalendarMgr.UpdateInvite(invite); Global.CalendarMgr.UpdateInvite(invite);
Global.CalendarMgr.SendCalendarEventModeratorStatusAlert(calendarEvent, invite); Global.CalendarMgr.SendCalendarEventModeratorStatusAlert(calendarEvent, invite);
} }
+35 -36
View File
@@ -54,11 +54,6 @@ namespace Game
void HandleCharEnumCallback(SQLResult result) void HandleCharEnumCallback(SQLResult result)
{ {
byte demonHunterCount = 0; // We use this counter to allow multiple demon hunter creations when allowed in config
bool canAlwaysCreateDemonHunter = HasPermission(RBACPermissions.SkipCheckCharacterCreationDemonHunter);
if (WorldConfig.GetIntValue(WorldCfg.CharacterCreatingMinLevelForDemonHunter) == 0) // char level = 0 means this check is disabled, so always true
canAlwaysCreateDemonHunter = true;
EnumCharactersResult charResult = new EnumCharactersResult(); EnumCharactersResult charResult = new EnumCharactersResult();
charResult.Success = true; charResult.Success = true;
charResult.IsDeletedCharacters = false; charResult.IsDeletedCharacters = false;
@@ -101,14 +96,6 @@ namespace Game
if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet.
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, false); Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, false);
if (charInfo.ClassId == Class.DemonHunter)
demonHunterCount++;
if (demonHunterCount >= WorldConfig.GetIntValue(WorldCfg.DemonHuntersPerRealm) && !canAlwaysCreateDemonHunter)
charResult.HasDemonHunterOnRealm = true;
else
charResult.HasDemonHunterOnRealm = false;
charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel); charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel);
charResult.Characters.Add(charInfo); charResult.Characters.Add(charInfo);
@@ -116,8 +103,6 @@ namespace Game
while (result.NextRow()); while (result.NextRow());
} }
charResult.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter;
charResult.IsDemonHunterCreationAllowed = GetAccountExpansion() >= Expansion.Legion || canAlwaysCreateDemonHunter;
charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth; charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth;
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements()) foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
@@ -360,25 +345,10 @@ namespace Game
if (result1 != null && !result1.IsEmpty()) if (result1 != null && !result1.IsEmpty())
{ {
Team team = Player.TeamForRace(createInfo.RaceId); Team team = Player.TeamForRace(createInfo.RaceId);
int freeDemonHunterSlots = WorldConfig.GetIntValue(WorldCfg.DemonHuntersPerRealm);
byte accRace = result1.Read<byte>(1); byte accRace = result1.Read<byte>(1);
if (checkDemonHunterReqs) if (checkDemonHunterReqs)
{ {
byte accClass = result1.Read<byte>(2);
if (accClass == (byte)Class.DemonHunter)
{
if (freeDemonHunterSlots > 0)
--freeDemonHunterSlots;
if (freeDemonHunterSlots == 0)
{
SendCharCreate(ResponseCodes.CharCreateFailed);
return;
}
}
if (!hasDemonHunterReqLevel) if (!hasDemonHunterReqLevel)
{ {
byte accLevel = result1.Read<byte>(0); byte accLevel = result1.Read<byte>(0);
@@ -1079,6 +1049,40 @@ namespace Game
GetPlayer().GetReputationMgr().SetInactive(packet.Index, packet.State); GetPlayer().GetReputationMgr().SetInactive(packet.Index, packet.State);
} }
[WorldPacketHandler(ClientOpcodes.CheckCharacterNameAvailability)]
void HandleCheckCharacterNameAvailability(CheckCharacterNameAvailability checkCharacterNameAvailability)
{
// prevent character rename to invalid name
if (!ObjectManager.NormalizePlayerName(ref checkCharacterNameAvailability.Name))
{
SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, ResponseCodes.CharNameNoName));
return;
}
ResponseCodes res = ObjectManager.CheckPlayerName(checkCharacterNameAvailability.Name, GetSessionDbcLocale(), true);
if (res != ResponseCodes.CharNameSuccess)
{
SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, res));
return;
}
// check name limitations
if (!HasPermission(RBACPermissions.SkipCheckCharacterCreationReservedname) && Global.ObjectMgr.IsReservedName(checkCharacterNameAvailability.Name))
{
SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, ResponseCodes.CharNameReserved));
return;
}
// Ensure that there is no character with the desired new name
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHECK_NAME);
stmt.AddValue(0, checkCharacterNameAvailability.Name);
_queryProcessor.AddCallback(DB.Characters.AsyncQuery(stmt).WithCallback(result =>
{
SendPacket(new CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, !result.IsEmpty() ? ResponseCodes.CharCreateNameInUse : ResponseCodes.Success));
}));
}
[WorldPacketHandler(ClientOpcodes.RequestForcedReactions)] [WorldPacketHandler(ClientOpcodes.RequestForcedReactions)]
void HandleRequestForcedReactions(RequestForcedReactions requestForcedReactions) void HandleRequestForcedReactions(RequestForcedReactions requestForcedReactions)
{ {
@@ -2455,13 +2459,8 @@ namespace Game
packet.Display.HasValue = true; packet.Display.HasValue = true;
packet.Display.Value.Name = factionChangeInfo.Name; packet.Display.Value.Name = factionChangeInfo.Name;
packet.Display.Value.SexID = (byte)factionChangeInfo.SexID; packet.Display.Value.SexID = (byte)factionChangeInfo.SexID;
packet.Display.Value.SkinID = factionChangeInfo.SkinID; packet.Display.Value.Customizations = factionChangeInfo.Customizations;
packet.Display.Value.HairColorID = factionChangeInfo.HairColorID;
packet.Display.Value.HairStyleID = factionChangeInfo.HairStyleID;
packet.Display.Value.FacialHairStyleID = factionChangeInfo.FacialHairStyleID;
packet.Display.Value.FaceID = factionChangeInfo.FaceID;
packet.Display.Value.RaceID = (byte)factionChangeInfo.RaceID; packet.Display.Value.RaceID = (byte)factionChangeInfo.RaceID;
packet.Display.Value.CustomDisplay = factionChangeInfo.CustomDisplay;
} }
SendPacket(packet); SendPacket(packet);
+3 -3
View File
@@ -62,12 +62,12 @@ namespace Game
garrison.SendBlueprintAndSpecializationData(); garrison.SendBlueprintAndSpecializationData();
} }
[WorldPacketHandler(ClientOpcodes.GarrisonGetBuildingLandmarks)] [WorldPacketHandler(ClientOpcodes.GarrisonGetMapData)]
void HandleGarrisonGetBuildingLandmarks(GarrisonGetBuildingLandmarks garrisonGetBuildingLandmarks) void HandleGarrisonGetMapData(GarrisonGetMapData garrisonGetMapData)
{ {
Garrison garrison = _player.GetGarrison(); Garrison garrison = _player.GetGarrison();
if (garrison != null) if (garrison != null)
garrison.SendBuildingLandmarks(_player); garrison.SendMapData(_player);
} }
} }
} }
+1 -1
View File
@@ -43,7 +43,7 @@ namespace Game
if (store.HasRecord(record.RecordID)) if (store.HasRecord(record.RecordID))
{ {
dbReply.Allow = true; dbReply.Status = 1;
dbReply.Timestamp = (uint)GameTime.GetGameTime(); dbReply.Timestamp = (uint)GameTime.GetGameTime();
store.WriteRecord(record.RecordID, GetSessionDbcLocale(), dbReply.Data); store.WriteRecord(record.RecordID, GetSessionDbcLocale(), dbReply.Data);
} }
+6 -4
View File
@@ -150,7 +150,7 @@ namespace Game
// Get player locked Dungeons // Get player locked Dungeons
foreach (var locked in Global.LFGMgr.GetLockedDungeons(_player.GetGUID())) foreach (var locked in Global.LFGMgr.GetLockedDungeons(_player.GetGUID()))
lfgPlayerInfo.BlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel)); lfgPlayerInfo.BlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel, 0));
foreach (var slot in randomDungeons) foreach (var slot in randomDungeons)
{ {
@@ -231,7 +231,7 @@ namespace Game
LFGBlackList lfgBlackList = new LFGBlackList(); LFGBlackList lfgBlackList = new LFGBlackList();
lfgBlackList.PlayerGuid.Set(pguid); lfgBlackList.PlayerGuid.Set(pguid);
foreach (var locked in Global.LFGMgr.GetLockedDungeons(pguid)) foreach (var locked in Global.LFGMgr.GetLockedDungeons(pguid))
lfgBlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel)); lfgBlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel, 0));
lfgPartyInfo.Player.Add(lfgBlackList); lfgPartyInfo.Player.Add(lfgBlackList);
} }
@@ -353,7 +353,7 @@ namespace Game
foreach (var it in joinData.lockmap) foreach (var it in joinData.lockmap)
{ {
var blackList = new LFGJoinBlackList(); var blackList = new LFGBlackListPkt();
blackList.PlayerGuid = it.Key; blackList.PlayerGuid = it.Key;
foreach (var lockInfo in it.Value) foreach (var lockInfo in it.Value)
@@ -361,8 +361,10 @@ namespace Game
Log.outTrace(LogFilter.Lfg, "SendLfgJoinResult:: {0} DungeonID: {1} Lock status: {2} Required itemLevel: {3} Current itemLevel: {4}", Log.outTrace(LogFilter.Lfg, "SendLfgJoinResult:: {0} DungeonID: {1} Lock status: {2} Required itemLevel: {3} Current itemLevel: {4}",
it.Key.ToString(), (lockInfo.Key & 0x00FFFFFF), lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, lockInfo.Value.currentItemLevel); it.Key.ToString(), (lockInfo.Key & 0x00FFFFFF), lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, lockInfo.Value.currentItemLevel);
blackList.Slots.Add(new LFGJoinBlackListSlot((int)lockInfo.Key, (int)lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, (int)lockInfo.Value.currentItemLevel)); blackList.Slot.Add(new LFGBlackListSlot(lockInfo.Key, (uint)lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, (int)lockInfo.Value.currentItemLevel, 0));
} }
lfgJoinResult.BlackList.Add(blackList);
} }
SendPacket(lfgJoinResult); SendPacket(lfgJoinResult);
+2 -2
View File
@@ -732,8 +732,8 @@ namespace Game
GetPlayer().SetPendingBind(0, 0); GetPlayer().SetPendingBind(0, 0);
} }
[WorldPacketHandler(ClientOpcodes.WardenData)] [WorldPacketHandler(ClientOpcodes.Warden3Data)]
void HandleWardenDataOpcode(WardenData packet) void HandleWarden3Data(WardenData packet)
{ {
if (_warden == null || packet.Data.GetSize() == 0) if (_warden == null || packet.Data.GetSize() == 0)
return; return;
+1 -1
View File
@@ -429,7 +429,7 @@ namespace Game
NewWorld packet = new NewWorld(); NewWorld packet = new NewWorld();
packet.MapID = loc.GetMapId(); packet.MapID = loc.GetMapId();
packet.Pos = loc; packet.Loc.Pos = loc;
packet.Reason = (uint)(!_player.IsBeingTeleportedSeamlessly() ? NewWorldReason.Normal : NewWorldReason.Seamless); packet.Reason = (uint)(!_player.IsBeingTeleportedSeamlessly() ? NewWorldReason.Normal : NewWorldReason.Seamless);
SendPacket(packet); SendPacket(packet);
+12 -9
View File
@@ -242,10 +242,13 @@ namespace Game
if (quest == null) if (quest == null)
return; return;
// This is Real Item Entry, not slot id as pre 5.x // TODO: currency choice items
if (packet.Choice.LootItemType != LootItemType.Item)
return;
if (packet.ItemChoiceID != 0) if (packet.ItemChoiceID != 0)
{ {
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.ItemChoiceID); ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID);
if (rewardProto == null) if (rewardProto == null)
{ {
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID); Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
@@ -255,7 +258,7 @@ namespace Game
bool itemValid = false; bool itemValid = false;
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i) for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
{ {
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.ItemChoiceID) if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
{ {
itemValid = true; itemValid = true;
break; break;
@@ -269,7 +272,7 @@ namespace Game
{ {
foreach (var questPackageItem in questPackageItems) foreach (var questPackageItem in questPackageItems)
{ {
if (questPackageItem.ItemID != packet.ItemChoiceID) if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
continue; continue;
if (_player.CanSelectQuestPackageItem(questPackageItem)) if (_player.CanSelectQuestPackageItem(questPackageItem))
@@ -287,7 +290,7 @@ namespace Game
{ {
foreach (var questPackageItem in questPackageItems1) foreach (var questPackageItem in questPackageItems1)
{ {
if (questPackageItem.ItemID != packet.ItemChoiceID) if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
continue; continue;
itemValid = true; itemValid = true;
@@ -324,9 +327,9 @@ namespace Game
return; return;
} }
if (GetPlayer().CanRewardQuest(quest, packet.ItemChoiceID, true)) if (GetPlayer().CanRewardQuest(quest, packet.Choice.Item.ItemID, true))
{ {
GetPlayer().RewardQuest(quest, packet.ItemChoiceID, obj); GetPlayer().RewardQuest(quest, packet.Choice.Item.ItemID, obj);
switch (obj.GetTypeId()) switch (obj.GetTypeId())
{ {
@@ -350,7 +353,7 @@ namespace Game
} }
_player.PlayerTalkClass.ClearMenus(); _player.PlayerTalkClass.ClearMenus();
creatureQGiver.GetAI().QuestReward(_player, quest, packet.ItemChoiceID); creatureQGiver.GetAI().QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
break; break;
} }
case TypeId.GameObject: case TypeId.GameObject:
@@ -371,7 +374,7 @@ namespace Game
} }
_player.PlayerTalkClass.ClearMenus(); _player.PlayerTalkClass.ClearMenus();
questGiver.GetAI().QuestReward(_player, quest, packet.ItemChoiceID); questGiver.GetAI().QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
break; break;
} }
default: default:
+2 -7
View File
@@ -531,13 +531,8 @@ namespace Game
Guild guild = player.GetGuild(); Guild guild = player.GetGuild();
mirrorImageComponentedData.SkinColor = player.m_playerData.SkinID; foreach (var customization in player.m_playerData.Customizations)
mirrorImageComponentedData.FaceVariation = player.m_playerData.FaceID; mirrorImageComponentedData.Customizations.Add(new ChrCustomizationChoice(customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID));
mirrorImageComponentedData.HairVariation = player.m_playerData.HairStyleID;
mirrorImageComponentedData.HairColor = player.m_playerData.HairColorID;
mirrorImageComponentedData.BeardVariation = player.m_playerData.FacialHairStyleID;
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
mirrorImageComponentedData.CustomDisplay[i] = player.m_playerData.CustomDisplayOption[i];
mirrorImageComponentedData.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty); mirrorImageComponentedData.GuildGUID = (guild ? guild.GetGUID() : ObjectGuid.Empty);
byte[] itemSlots = byte[] itemSlots =
+22 -21
View File
@@ -43,32 +43,33 @@ namespace Game
SendPacket(response); SendPacket(response);
} }
[WorldPacketHandler(ClientOpcodes.SupportTicketSubmitBug)] [WorldPacketHandler(ClientOpcodes.SubmitUserFeedback)]
void HandleSupportTicketSubmitBug(SupportTicketSubmitBug packet) void HandleSubmitUserFeedback(SubmitUserFeedback userFeedback)
{ {
if (!Global.SupportMgr.GetBugSystemStatus()) if (userFeedback.IsSuggestion)
return; {
if (!Global.SupportMgr.GetSuggestionSystemStatus())
return;
BugTicket ticket = new BugTicket(GetPlayer()); SuggestionTicket ticket = new SuggestionTicket(GetPlayer());
ticket.SetPosition(packet.Header.MapID, packet.Header.Position); ticket.SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position);
ticket.SetFacing(packet.Header.Facing); ticket.SetFacing(userFeedback.Header.Facing);
ticket.SetNote(packet.Note); ticket.SetNote(userFeedback.Note);
Global.SupportMgr.AddTicket(ticket); Global.SupportMgr.AddTicket(ticket);
} }
else
{
if (!Global.SupportMgr.GetBugSystemStatus())
return;
[WorldPacketHandler(ClientOpcodes.SupportTicketSubmitSuggestion)] BugTicket ticket = new BugTicket(GetPlayer());
void HandleSupportTicketSubmitSuggestion(SupportTicketSubmitSuggestion packet) ticket.SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position);
{ ticket.SetFacing(userFeedback.Header.Facing);
if (!Global.SupportMgr.GetSuggestionSystemStatus()) ticket.SetNote(userFeedback.Note);
return;
SuggestionTicket ticket = new SuggestionTicket(GetPlayer()); Global.SupportMgr.AddTicket(ticket);
ticket.SetPosition(packet.Header.MapID, packet.Header.Position); }
ticket.SetFacing(packet.Header.Facing);
ticket.SetNote(packet.Note);
Global.SupportMgr.AddTicket(ticket);
} }
[WorldPacketHandler(ClientOpcodes.SupportTicketSubmitComplaint)] [WorldPacketHandler(ClientOpcodes.SupportTicketSubmitComplaint)]
+3 -1
View File
@@ -51,6 +51,7 @@ namespace Game.Movement
vertical_acceleration = 0.0f; vertical_acceleration = 0.0f;
effect_start_time = 0; effect_start_time = 0;
spell_effect_extra = args.spellEffectExtra; spell_effect_extra = args.spellEffectExtra;
anim_tier = args.animTier;
splineIsFacingOnly = args.path.Length == 2 && args.facing.type != MonsterMoveType.Normal && ((args.path[1] - args.path[0]).GetLength() < 0.1f); splineIsFacingOnly = args.path.Length == 2 && args.facing.type != MonsterMoveType.Normal && ((args.path[1] - args.path[0]).GetLength() < 0.1f);
// Check if its a stop spline // Check if its a stop spline
@@ -155,7 +156,7 @@ namespace Game.Movement
} }
else else
{ {
if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0)) if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0x8))
{ {
Vector3 hermite; Vector3 hermite;
spline.Evaluate_Derivative(point_Idx, u, out hermite); spline.Evaluate_Derivative(point_Idx, u, out hermite);
@@ -309,6 +310,7 @@ namespace Game.Movement
public int point_Idx; public int point_Idx;
public int point_Idx_offset; public int point_Idx_offset;
public Optional<SpellEffectExtraData> spell_effect_extra; public Optional<SpellEffectExtraData> spell_effect_extra;
public Optional<AnimTierTransition> anim_tier;
#endregion #endregion
public class CommonInitializer : IInitializer public class CommonInitializer : IInitializer
+3 -4
View File
@@ -29,7 +29,6 @@ namespace Game.Movement
public bool IsSmooth() { return Flags.HasAnyFlag(SplineFlag.Catmullrom); } public bool IsSmooth() { return Flags.HasAnyFlag(SplineFlag.Catmullrom); }
public bool IsLinear() { return !IsSmooth(); } public bool IsLinear() { return !IsSmooth(); }
public byte GetAnimTier() { return animTier; }
public bool HasAllFlags(SplineFlag f) { return (Flags & f) == f; } public bool HasAllFlags(SplineFlag f) { return (Flags & f) == f; }
public bool HasFlag(SplineFlag f) { return (Flags & f) != 0; } public bool HasFlag(SplineFlag f) { return (Flags & f) != 0; }
@@ -41,10 +40,10 @@ namespace Game.Movement
Flags &= ~f; Flags &= ~f;
} }
public void EnableAnimation(uint anim) { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Falling | SplineFlag.Parabolic | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Animation | ((SplineFlag)anim & SplineFlag.MaskAnimations); } public void EnableAnimation() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Parabolic | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Animation; }
public void EnableParabolic() { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Falling | SplineFlag.Animation | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Parabolic; } public void EnableParabolic() { Flags = (Flags & ~(SplineFlag.Falling | SplineFlag.Animation | SplineFlag.FallingSlow | SplineFlag.FadeObject)) | SplineFlag.Parabolic; }
public void EnableFlying() { Flags = (Flags & ~SplineFlag.Falling) | SplineFlag.Flying; } public void EnableFlying() { Flags = (Flags & ~SplineFlag.Falling) | SplineFlag.Flying; }
public void EnableFalling() { Flags = (Flags & ~(SplineFlag.MaskAnimations | SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.Flying)) | SplineFlag.Falling; } public void EnableFalling() { Flags = (Flags & ~(SplineFlag.Parabolic | SplineFlag.Animation | SplineFlag.Flying)) | SplineFlag.Falling; }
public void EnableCatmullRom() { Flags = (Flags & ~SplineFlag.SmoothGroundPath) | SplineFlag.Catmullrom; } public void EnableCatmullRom() { Flags = (Flags & ~SplineFlag.SmoothGroundPath) | SplineFlag.Catmullrom; }
public void EnableTransportEnter() { Flags = (Flags & ~SplineFlag.TransportExit) | SplineFlag.TransportEnter; } public void EnableTransportEnter() { Flags = (Flags & ~SplineFlag.TransportExit) | SplineFlag.TransportEnter; }
public void EnableTransportExit() { Flags = (Flags & ~SplineFlag.TransportEnter) | SplineFlag.TransportExit; } public void EnableTransportExit() { Flags = (Flags & ~SplineFlag.TransportEnter) | SplineFlag.TransportExit; }
+3 -1
View File
@@ -285,7 +285,9 @@ namespace Game.Movement
public void SetAnimation(AnimType anim) public void SetAnimation(AnimType anim)
{ {
args.time_perc = 0.0f; args.time_perc = 0.0f;
args.flags.EnableAnimation((byte)anim); args.animTier.emplace();
args.animTier.AnimTier = anim;
args.flags.EnableAnimation();
} }
public void SetFacing(Vector3 spot) public void SetFacing(Vector3 spot)
@@ -47,6 +47,7 @@ namespace Game.Movement
public uint splineId; public uint splineId;
public float initialOrientation; public float initialOrientation;
public Optional<SpellEffectExtraData> spellEffectExtra; public Optional<SpellEffectExtraData> spellEffectExtra;
public Optional<AnimTierTransition> animTier;
public bool walk; public bool walk;
public bool HasVelocity; public bool HasVelocity;
public bool TransformForTransport; public bool TransformForTransport;
@@ -92,4 +93,10 @@ namespace Game.Movement
public uint ProgressCurveId; public uint ProgressCurveId;
public uint ParabolicCurveId; public uint ParabolicCurveId;
} }
public class AnimTierTransition
{
public uint TierTransitionId;
public byte AnimTier;
}
} }
-98
View File
@@ -1,98 +0,0 @@
/*
* Copyright (C) 2012-2020 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
namespace Game.Networking
{
public class CompactArray
{
public void Insert(int index, int value)
{
Cypher.Assert(index < 0x20);
_mask |= 1u << index;
if (_contents.Length <= index)
Array.Resize(ref _contents, index + 1);
_contents[index] = value;
}
void Clear()
{
_mask = 0;
_contents = new int[1];
}
public void Read(WorldPacket data)
{
uint mask = data.ReadUInt32();
for (int index = 0; mask != 0; mask >>= 1, ++index)
{
if ((mask & 1) != 0)
{
int value = data.ReadInt32();
Insert(index, value);
}
}
}
public void Write(WorldPacket data)
{
uint mask = GetMask();
data.WriteUInt32(mask);
for (int i = 0; i < GetSize(); ++i)
{
if (Convert.ToBoolean(mask & (1 << i)))
data.WriteInt32(this[i]);
}
}
public override int GetHashCode()
{
return _mask.GetHashCode() ^ _contents.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj is CompactArray)
return (CompactArray)obj == this;
return false;
}
public static bool operator ==(CompactArray left, CompactArray right)
{
if (left._mask != right._mask)
return false;
return left._contents == right._contents;
}
public static bool operator !=(CompactArray left, CompactArray right)
{
return !(left == right);
}
uint GetMask() { return _mask; }
public int this[int index] { get { return _contents[index]; } }
int GetSize() { return _contents.Length; }
uint _mask;
int[] _contents = new int[1];
}
}
@@ -72,17 +72,22 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(AreaTriggerSpline.HasValue); _worldPacket.WriteBit(AreaTriggerSpline.HasValue);
_worldPacket.WriteBit(AreaTriggerOrbit.HasValue); _worldPacket.WriteBit(AreaTriggerOrbit.HasValue);
_worldPacket.WriteBit(AreaTriggerMovementScript.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (AreaTriggerSpline.HasValue) if (AreaTriggerSpline.HasValue)
AreaTriggerSpline.Value.Write(_worldPacket); AreaTriggerSpline.Value.Write(_worldPacket);
if (AreaTriggerMovementScript.HasValue)
AreaTriggerMovementScript.Value.Write(_worldPacket);
if (AreaTriggerOrbit.HasValue) if (AreaTriggerOrbit.HasValue)
AreaTriggerOrbit.Value.Write(_worldPacket); AreaTriggerOrbit.Value.Write(_worldPacket);
} }
public Optional<AreaTriggerSplineInfo> AreaTriggerSpline; public Optional<AreaTriggerSplineInfo> AreaTriggerSpline;
public Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit; public Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit;
public Optional<AreaTriggerMovementScriptInfo> AreaTriggerMovementScript;
public ObjectGuid TriggerGUID; public ObjectGuid TriggerGUID;
} }
@@ -616,6 +616,9 @@ namespace Game.Networking.Packets
foreach (AuctionItem item in Items) foreach (AuctionItem item in Items)
item.Write(_worldPacket); item.Write(_worldPacket);
foreach (AuctionItem item in SoldItems)
item.Write(_worldPacket);
} }
} }
@@ -857,10 +860,12 @@ namespace Game.Networking.Packets
public AuctionBucketKey Key; public AuctionBucketKey Key;
public int TotalQuantity; public int TotalQuantity;
public ulong MinPrice; public ulong MinPrice;
public int RequiredLevel;
public List<uint> ItemModifiedAppearanceIDs = new List<uint>(); public List<uint> ItemModifiedAppearanceIDs = new List<uint>();
public Optional<byte> MaxBattlePetQuality; public Optional<byte> MaxBattlePetQuality;
public Optional<byte> MaxBattlePetLevel; public Optional<byte> MaxBattlePetLevel;
public Optional<byte> BattlePetBreedID; public Optional<byte> BattlePetBreedID;
public Optional<uint> Unk901_1;
public bool ContainsOwnerItem; public bool ContainsOwnerItem;
public bool ContainsOnlyCollectedAppearances; public bool ContainsOnlyCollectedAppearances;
@@ -868,6 +873,7 @@ namespace Game.Networking.Packets
{ {
Key.Write(data); Key.Write(data);
data.WriteInt32(TotalQuantity); data.WriteInt32(TotalQuantity);
data.WriteInt32(RequiredLevel);
data.WriteUInt64(MinPrice); data.WriteUInt64(MinPrice);
data.WriteInt32(ItemModifiedAppearanceIDs.Count); data.WriteInt32(ItemModifiedAppearanceIDs.Count);
if (!ItemModifiedAppearanceIDs.Empty()) if (!ItemModifiedAppearanceIDs.Empty())
@@ -879,6 +885,7 @@ namespace Game.Networking.Packets
data.WriteBit(MaxBattlePetQuality.HasValue); data.WriteBit(MaxBattlePetQuality.HasValue);
data.WriteBit(MaxBattlePetLevel.HasValue); data.WriteBit(MaxBattlePetLevel.HasValue);
data.WriteBit(BattlePetBreedID.HasValue); data.WriteBit(BattlePetBreedID.HasValue);
data.WriteBit(Unk901_1.HasValue);
data.WriteBit(ContainsOwnerItem); data.WriteBit(ContainsOwnerItem);
data.WriteBit(ContainsOnlyCollectedAppearances); data.WriteBit(ContainsOnlyCollectedAppearances);
data.FlushBits(); data.FlushBits();
@@ -891,6 +898,9 @@ namespace Game.Networking.Packets
if (BattlePetBreedID.HasValue) if (BattlePetBreedID.HasValue)
data.WriteUInt8(BattlePetBreedID.Value); data.WriteUInt8(BattlePetBreedID.Value);
if (Unk901_1.HasValue)
data.WriteUInt32(Unk901_1.Value);
} }
} }
@@ -153,13 +153,13 @@ namespace Game.Networking.Packets
_worldPacket.FlushBits(); _worldPacket.FlushBits();
{ {
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.BillingPlan); _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.BillingPlan);
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.TimeRemain); _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.TimeRemain);
_worldPacket.WriteUInt32(SuccessInfo.Value.Billing.Unknown735); _worldPacket.WriteUInt32(SuccessInfo.Value.GameTimeInfo.Unknown735);
// 3x same bit is not a mistake - preserves legacy client behavior of BillingPlanFlags::SESSION_IGR // 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.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.Billing.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan _worldPacket.WriteBit(SuccessInfo.Value.GameTimeInfo.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); // not used anywhere in the client
_worldPacket.FlushBits(); _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 CurrencyID; // this is probably used for the ingame shop. @todo implement
public uint Time; 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<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 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<ushort> NumPlayersAlliance; // number of alliance players in this realm. @todo implement
public Optional<int> ExpansionTrialExpiration; // expansion trial expiration unix timestamp public Optional<int> ExpansionTrialExpiration; // expansion trial expiration unix timestamp
public struct BillingInfo public struct GameTime
{ {
public uint BillingPlan; public uint BillingPlan;
public uint TimeRemain; public uint TimeRemain;
@@ -33,13 +33,18 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(MythicPlusSeasonID); _worldPacket.WriteInt32(MythicPlusSeasonID);
_worldPacket.WriteInt32(CurrentSeason); _worldPacket.WriteInt32(CurrentSeason);
_worldPacket.WriteInt32(PreviousSeason); _worldPacket.WriteInt32(PreviousSeason);
_worldPacket.WriteInt32(ConquestWeeklyProgressCurrencyID);
_worldPacket.WriteInt32(PvpSeasonID); _worldPacket.WriteInt32(PvpSeasonID);
_worldPacket.WriteBit(WeeklyRewardChestsEnabled);
_worldPacket.FlushBits();
} }
public int MythicPlusSeasonID; public int MythicPlusSeasonID;
public int PreviousSeason; public int PreviousSeason;
public int CurrentSeason; public int CurrentSeason;
public int PvpSeasonID; public int PvpSeasonID;
public int ConquestWeeklyProgressCurrencyID;
public bool WeeklyRewardChestsEnabled;
} }
public class AreaSpiritHealerQuery : ClientPacket public class AreaSpiritHealerQuery : ClientPacket
@@ -435,9 +440,9 @@ namespace Game.Networking.Packets
public uint RandomMaxRewardPointsThisWeek; 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() { } public override void Read() { }
} }
@@ -42,9 +42,9 @@ namespace Game.Networking.Packets
public ulong EventID; 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() public override void Read()
{ {
@@ -260,9 +260,9 @@ namespace Game.Networking.Packets
public string EventName; 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() public override void Read()
{ {
@@ -285,9 +285,9 @@ namespace Game.Networking.Packets
public string Name; 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() public override void Read()
{ {
@@ -502,9 +502,9 @@ namespace Game.Networking.Packets
public ulong InviteID; 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() public override void Read()
{ {
@@ -538,9 +538,9 @@ namespace Game.Networking.Packets
public uint DifficultyID; 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() public override void Read()
{ {
@@ -115,7 +115,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 11); _worldPacket.WriteBits(ChannelWelcomeMsg.GetByteCount(), 11);
_worldPacket.WriteUInt32((uint)ChannelFlags); _worldPacket.WriteUInt32((uint)ChannelFlags);
_worldPacket.WriteInt32(ChatChannelID); _worldPacket.WriteInt32(ChatChannelID);
_worldPacket.WriteUInt64((ulong)InstanceID); _worldPacket.WriteUInt64(InstanceID);
_worldPacket.WritePackedGuid(ChannelGUID); _worldPacket.WritePackedGuid(ChannelGUID);
_worldPacket.WriteString(Channel); _worldPacket.WriteString(Channel);
_worldPacket.WriteString(ChannelWelcomeMsg); _worldPacket.WriteString(ChannelWelcomeMsg);
@@ -123,7 +123,7 @@ namespace Game.Networking.Packets
public string ChannelWelcomeMsg = ""; public string ChannelWelcomeMsg = "";
public int ChatChannelID; public int ChatChannelID;
public int InstanceID; public ulong InstanceID;
public ChannelFlags ChannelFlags; public ChannelFlags ChannelFlags;
public string Channel = ""; public string Channel = "";
public ObjectGuid ChannelGUID; public ObjectGuid ChannelGUID;
+111 -118
View File
@@ -41,9 +41,8 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteBit(Success); _worldPacket.WriteBit(Success);
_worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsDeletedCharacters);
_worldPacket.WriteBit(IsTestDemonHunterCreationAllowed); _worldPacket.WriteBit(IsNewPlayerRestrictionSkipped);
_worldPacket.WriteBit(HasDemonHunterOnRealm); _worldPacket.WriteBit(IsNewPlayer);
_worldPacket.WriteBit(IsDemonHunterCreationAllowed);
_worldPacket.WriteBit(DisabledClassesMask.HasValue); _worldPacket.WriteBit(DisabledClassesMask.HasValue);
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket.WriteInt32(Characters.Count); _worldPacket.WriteInt32(Characters.Count);
@@ -66,9 +65,8 @@ namespace Game.Networking.Packets
public bool Success; public bool Success;
public bool IsDeletedCharacters; // used for character undelete list 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 IsNewPlayerRestrictionSkipped = false; // allows client to skip new player restrictions
public bool HasDemonHunterOnRealm = false; public bool IsNewPlayer = false; // forbids hero classes and allied races
public bool IsDemonHunterCreationAllowed = false; //used for demon hunter early access
public bool IsAlliedRacesCreationAllowed = false; public bool IsAlliedRacesCreationAllowed = false;
public int MaxCharacterLevel = 1; public int MaxCharacterLevel = 1;
@@ -187,14 +185,7 @@ namespace Game.Networking.Packets
data.WriteUInt8(RaceId); data.WriteUInt8(RaceId);
data.WriteUInt8((byte)ClassId); data.WriteUInt8((byte)ClassId);
data.WriteUInt8(SexId); data.WriteUInt8(SexId);
data.WriteUInt8(SkinId); data.WriteInt32(Customizations.Count);
data.WriteUInt8(FaceId);
data.WriteUInt8(HairStyle);
data.WriteUInt8(HairColor);
data.WriteUInt8(FacialHair);
foreach (var display in CustomDisplay)
data.WriteUInt8(display);
data.WriteUInt8(ExperienceLevel); data.WriteUInt8(ExperienceLevel);
data.WriteUInt32(ZoneId); data.WriteUInt32(ZoneId);
@@ -219,18 +210,23 @@ namespace Game.Networking.Packets
data.WriteUInt32(Unknown703); data.WriteUInt32(Unknown703);
data.WriteUInt32(LastLoginVersion); data.WriteUInt32(LastLoginVersion);
data.WriteUInt32(Flags4); 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.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin); data.WriteBit(FirstLogin);
data.WriteBit(BoostInProgress); data.WriteBit(BoostInProgress);
data.WriteBits(unkWod61x, 5); data.WriteBits(unkWod61x, 5);
foreach (string str in Unknown830) foreach (string str in MailSenders)
data.WriteBits(str.GetByteCount() + 1, 6); data.WriteBits(str.GetByteCount() + 1, 6);
data.FlushBits(); data.FlushBits();
foreach (string str in Unknown830) foreach (string str in MailSenders)
if (!str.IsEmpty()) if (!str.IsEmpty())
data.WriteCString(str); data.WriteCString(str);
@@ -244,12 +240,7 @@ namespace Game.Networking.Packets
public byte RaceId; public byte RaceId;
public Class ClassId; public Class ClassId;
public byte SexId; public byte SexId;
public byte SkinId; public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public byte FaceId;
public byte HairStyle;
public byte HairColor;
public byte FacialHair;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public byte ExperienceLevel; public byte ExperienceLevel;
public uint ZoneId; public uint ZoneId;
public uint MapId; public uint MapId;
@@ -265,14 +256,14 @@ namespace Game.Networking.Packets
public ushort SpecID; public ushort SpecID;
public uint Unknown703; public uint Unknown703;
public uint LastLoginVersion; public uint LastLoginVersion;
public uint OverrideSelectScreenFileDataID;
public uint PetCreatureDisplayId; public uint PetCreatureDisplayId;
public uint PetExperienceLevel; public uint PetExperienceLevel;
public uint PetCreatureFamilyId; public uint PetCreatureFamilyId;
public bool BoostInProgress; // @todo public bool BoostInProgress; // @todo
public uint[] ProfessionIds = new uint[2]; // @todo public uint[] ProfessionIds = new uint[2]; // @todo
public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.BagEnd]; public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.BagEnd];
public List<string> Unknown830 = new List<string>(); // Something with character names, same length limit as name, public List<string> MailSenders = new List<string>();
// client accepts unlimited number of these in packet but only uses first 3
public struct VisualItemInfo public struct VisualItemInfo
{ {
@@ -280,12 +271,14 @@ namespace Game.Networking.Packets
{ {
data.WriteUInt32(DisplayId); data.WriteUInt32(DisplayId);
data.WriteUInt32(DisplayEnchantId); data.WriteUInt32(DisplayEnchantId);
data.WriteInt32(ItemModifiedAppearanceID);
data.WriteUInt8(InvType); data.WriteUInt8(InvType);
data.WriteUInt8(Subclass); data.WriteUInt8(Subclass);
} }
public uint DisplayId; public uint DisplayId;
public uint DisplayEnchantId; public uint DisplayEnchantId;
public int ItemModifiedAppearanceID; // also -1 is some special value
public byte InvType; public byte InvType;
public byte Subclass; 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 class CreateCharacter : ClientPacket
{ {
public CreateCharacter(WorldPacket packet) : base(packet) { } public CreateCharacter(WorldPacket packet) : base(packet) { }
@@ -338,23 +363,19 @@ namespace Game.Networking.Packets
uint nameLength = _worldPacket.ReadBits<uint>(6); uint nameLength = _worldPacket.ReadBits<uint>(6);
bool hasTemplateSet = _worldPacket.HasBit(); bool hasTemplateSet = _worldPacket.HasBit();
CreateInfo.IsTrialBoost = _worldPacket.HasBit(); CreateInfo.IsTrialBoost = _worldPacket.HasBit();
CreateInfo.UseNPE = _worldPacket.HasBit();
CreateInfo.RaceId = (Race)_worldPacket.ReadUInt8(); CreateInfo.RaceId = (Race)_worldPacket.ReadUInt8();
CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8(); CreateInfo.ClassId = (Class)_worldPacket.ReadUInt8();
CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8(); CreateInfo.Sex = (Gender)_worldPacket.ReadUInt8();
CreateInfo.Skin = _worldPacket.ReadUInt8(); var customizationCount = _worldPacket.ReadUInt32();
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();
CreateInfo.Name = _worldPacket.ReadString(nameLength); CreateInfo.Name = _worldPacket.ReadString(nameLength);
if (CreateInfo.TemplateSet.HasValue) if (CreateInfo.TemplateSet.HasValue)
CreateInfo.TemplateSet.Set(_worldPacket.ReadUInt32()); CreateInfo.TemplateSet.Set(_worldPacket.ReadUInt32());
for (var i = 0; i < customizationCount; ++i)
CreateInfo.Customizations[i].Read(_worldPacket);
} }
public CharacterCreateInfo CreateInfo; public CharacterCreateInfo CreateInfo;
@@ -446,14 +467,10 @@ namespace Game.Networking.Packets
CustomizeInfo = new CharCustomizeInfo(); CustomizeInfo = new CharCustomizeInfo();
CustomizeInfo.CharGUID = _worldPacket.ReadPackedGuid(); CustomizeInfo.CharGUID = _worldPacket.ReadPackedGuid();
CustomizeInfo.SexID = (Gender)_worldPacket.ReadUInt8(); CustomizeInfo.SexID = (Gender)_worldPacket.ReadUInt8();
CustomizeInfo.SkinID = _worldPacket.ReadUInt8(); var customizationCount = _worldPacket.ReadUInt32();
CustomizeInfo.HairColorID = _worldPacket.ReadUInt8();
CustomizeInfo.HairStyleID = _worldPacket.ReadUInt8();
CustomizeInfo.FacialHairStyleID = _worldPacket.ReadUInt8();
CustomizeInfo.FaceID = _worldPacket.ReadUInt8();
for (var i = 0; i < CustomizeInfo.CustomDisplay.GetLimit(); ++i) for (var i = 0; i < customizationCount; ++i)
CustomizeInfo.CustomDisplay[i] = _worldPacket.ReadUInt8(); CustomizeInfo.Customizations[i].Read(_worldPacket);
CustomizeInfo.CharName = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(6)); CustomizeInfo.CharName = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(6));
} }
@@ -478,17 +495,11 @@ namespace Game.Networking.Packets
RaceOrFactionChangeInfo.Guid = _worldPacket.ReadPackedGuid(); RaceOrFactionChangeInfo.Guid = _worldPacket.ReadPackedGuid();
RaceOrFactionChangeInfo.SexID = (Gender)_worldPacket.ReadUInt8(); RaceOrFactionChangeInfo.SexID = (Gender)_worldPacket.ReadUInt8();
RaceOrFactionChangeInfo.RaceID = (Race)_worldPacket.ReadUInt8(); RaceOrFactionChangeInfo.RaceID = (Race)_worldPacket.ReadUInt8();
var customizationCount = _worldPacket.ReadUInt32();
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();
RaceOrFactionChangeInfo.Name = _worldPacket.ReadString(nameLength); RaceOrFactionChangeInfo.Name = _worldPacket.ReadString(nameLength);
for (var i = 0; i < customizationCount; ++i)
RaceOrFactionChangeInfo.Customizations[i].Read(_worldPacket);
} }
public CharRaceOrFactionChangeInfo RaceOrFactionChangeInfo; public CharRaceOrFactionChangeInfo RaceOrFactionChangeInfo;
@@ -512,14 +523,11 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteBits(Display.Value.Name.GetByteCount(), 6); _worldPacket.WriteBits(Display.Value.Name.GetByteCount(), 6);
_worldPacket.WriteUInt8(Display.Value.SexID); _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); _worldPacket.WriteUInt8(Display.Value.RaceID);
Display.Value.CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteString(Display.Value.Name); _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 string Name;
public byte SexID; public byte SexID;
public byte SkinID;
public byte HairColorID;
public byte HairStyleID;
public byte FacialHairStyleID;
public byte FaceID;
public byte RaceID; 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 public struct ReorderInfo
{ {
@@ -660,7 +663,7 @@ namespace Game.Networking.Packets
} }
public ObjectGuid Guid; // Guid of the player that is logging in 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 public class LoginVerifyWorld : ServerPacket
@@ -706,7 +709,7 @@ namespace Game.Networking.Packets
IdleLogout = _worldPacket.HasBit(); IdleLogout = _worldPacket.HasBit();
} }
bool IdleLogout; public bool IdleLogout;
} }
public class LogoutResponse : ServerPacket public class LogoutResponse : ServerPacket
@@ -755,8 +758,8 @@ namespace Game.Networking.Packets
Showing = _worldPacket.HasBit(); Showing = _worldPacket.HasBit();
} }
int MapID = -1; public int MapID = -1;
bool Showing; public bool Showing;
} }
public class InitialSetup : ServerPacket public class InitialSetup : ServerPacket
@@ -832,22 +835,15 @@ namespace Game.Networking.Packets
public override void Read() public override void Read()
{ {
NewHairStyle = _worldPacket.ReadUInt32(); var customizationCount = _worldPacket.ReadUInt32();
NewHairColor = _worldPacket.ReadUInt32(); NewSex = _worldPacket.ReadUInt8();
NewFacialHair = _worldPacket.ReadUInt32();
NewSkinColor = _worldPacket.ReadUInt32();
NewFace = _worldPacket.ReadUInt32();
for (var i = 0; i < NewCustomDisplay.GetLimit(); ++i) for (var i = 0; i < customizationCount; ++i)
NewCustomDisplay[i] = _worldPacket.ReadUInt32(); Customizations[i].Read(_worldPacket);
} }
public uint NewHairStyle; public byte NewSex;
public uint NewHairColor; public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public uint NewFacialHair;
public uint NewSkinColor;
public uint NewFace;
public Array<uint> NewCustomDisplay = new Array<uint>(PlayerConst.CustomDisplaySize);
} }
public class BarberShopResult : ServerPacket public class BarberShopResult : ServerPacket
@@ -975,25 +971,18 @@ namespace Game.Networking.Packets
{ {
CharGUID = customizeInfo.CharGUID; CharGUID = customizeInfo.CharGUID;
SexID = (byte)customizeInfo.SexID; SexID = (byte)customizeInfo.SexID;
SkinID = customizeInfo.SkinID;
HairColorID = customizeInfo.HairColorID;
HairStyleID = customizeInfo.HairStyleID;
FacialHairStyleID = customizeInfo.FacialHairStyleID;
FaceID = customizeInfo.FaceID;
CharName = customizeInfo.CharName; CharName = customizeInfo.CharName;
CustomDisplay = customizeInfo.CustomDisplay; Customizations = customizeInfo.Customizations;
} }
public override void Write() public override void Write()
{ {
_worldPacket.WritePackedGuid(CharGUID); _worldPacket.WritePackedGuid(CharGUID);
_worldPacket.WriteUInt8(SexID); _worldPacket.WriteUInt8(SexID);
_worldPacket.WriteUInt8(SkinID); _worldPacket.WriteInt32(Customizations.Count);
_worldPacket.WriteUInt8(HairColorID); foreach (ChrCustomizationChoice customization in Customizations)
_worldPacket.WriteUInt8(HairStyleID); customization.Write(_worldPacket);
_worldPacket.WriteUInt8(FacialHairStyleID);
_worldPacket.WriteUInt8(FaceID);
CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteBits(CharName.GetByteCount(), 6); _worldPacket.WriteBits(CharName.GetByteCount(), 6);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
_worldPacket.WriteString(CharName); _worldPacket.WriteString(CharName);
@@ -1002,12 +991,7 @@ namespace Game.Networking.Packets
ObjectGuid CharGUID; ObjectGuid CharGUID;
string CharName = ""; string CharName = "";
byte SexID; byte SexID;
byte SkinID; Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
byte HairColorID;
byte HairStyleID;
byte FacialHairStyleID;
byte FaceID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
} }
class CharCustomizeFailure : ServerPacket class CharCustomizeFailure : ServerPacket
@@ -1063,21 +1047,40 @@ namespace Game.Networking.Packets
} }
//Structs //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 public class CharacterCreateInfo
{ {
// User specified variables // User specified variables
public Race RaceId = Race.None; public Race RaceId = Race.None;
public Class ClassId = Class.None; public Class ClassId = Class.None;
public Gender Sex = Gender.None; public Gender Sex = Gender.None;
public byte Skin; public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
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 Optional<uint> TemplateSet = new Optional<uint>(); public Optional<uint> TemplateSet = new Optional<uint>();
public bool IsTrialBoost; public bool IsTrialBoost;
public bool UseNPE;
public string Name; public string Name;
// Server side data // Server side data
@@ -1092,30 +1095,20 @@ namespace Game.Networking.Packets
public class CharCustomizeInfo public class CharCustomizeInfo
{ {
public byte HairStyleID;
public byte FaceID;
public ObjectGuid CharGUID; public ObjectGuid CharGUID;
public Gender SexID = Gender.None; public Gender SexID = Gender.None;
public string CharName; public string CharName;
public byte HairColorID; public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public byte FacialHairStyleID;
public byte SkinID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
} }
public class CharRaceOrFactionChangeInfo public class CharRaceOrFactionChangeInfo
{ {
public byte HairColorID;
public Race RaceID = Race.None; public Race RaceID = Race.None;
public Gender SexID = Gender.None; public Gender SexID = Gender.None;
public byte SkinID;
public byte FacialHairStyleID;
public ObjectGuid Guid; public ObjectGuid Guid;
public bool FactionChange; public bool FactionChange;
public string Name; public string Name;
public byte FaceID; public Array<ChrCustomizationChoice> Customizations = new Array<ChrCustomizationChoice>(50);
public byte HairStyleID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
} }
public class CharacterUndeleteInfo public class CharacterUndeleteInfo
@@ -224,7 +224,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Prefix.GetByteCount(), 5); _worldPacket.WriteBits(Prefix.GetByteCount(), 5);
_worldPacket.WriteBits(Channel.GetByteCount(), 7); _worldPacket.WriteBits(Channel.GetByteCount(), 7);
_worldPacket.WriteBits(ChatText.GetByteCount(), 12); _worldPacket.WriteBits(ChatText.GetByteCount(), 12);
_worldPacket.WriteBits((byte)_ChatFlags, 11); _worldPacket.WriteBits((byte)_ChatFlags, 14);
_worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(HideChatLog);
_worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteBit(FakeSenderName);
_worldPacket.WriteBit(Unused_801.HasValue); _worldPacket.WriteBit(Unused_801.HasValue);
@@ -18,6 +18,7 @@
using Framework.Constants; using Framework.Constants;
using Framework.IO; using Framework.IO;
using Game.Entities; using Game.Entities;
using System.Collections.Generic;
namespace Game.Networking.Packets namespace Game.Networking.Packets
{ {
@@ -29,13 +30,13 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(PlayerGuid); _worldPacket.WritePackedGuid(PlayerGuid);
_worldPacket.WriteUInt32(ServerTime); _worldPacket.WriteUInt32(ServerTime);
for (int i = 0; i < (int)AccountDataTypes.Max; ++i) foreach (var accounttime in AccountTimes)
_worldPacket.WriteUInt32(AccountTimes[i]); _worldPacket.WriteUInt32(accounttime);
} }
public ObjectGuid PlayerGuid; public ObjectGuid PlayerGuid;
public uint ServerTime = 0; 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 public class ClientCacheVersion : ServerPacket
@@ -66,7 +66,7 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WritePackedGuid(CastID); _worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteInt32(SpellID); _worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID); Visual.Write(_worldPacket);
_worldPacket.WriteInt32(Damage); _worldPacket.WriteInt32(Damage);
_worldPacket.WriteInt32(OriginalDamage); _worldPacket.WriteInt32(OriginalDamage);
_worldPacket.WriteInt32(Overkill); _worldPacket.WriteInt32(Overkill);
@@ -90,7 +90,7 @@ namespace Game.Networking.Packets
public ObjectGuid CasterGUID; public ObjectGuid CasterGUID;
public ObjectGuid CastID; public ObjectGuid CastID;
public int SpellID; public int SpellID;
public int SpellXSpellVisualID; public SpellCastVisual Visual;
public int Damage; public int Damage;
public int OriginalDamage; public int OriginalDamage;
public int Overkill = -1; public int Overkill = -1;
@@ -578,8 +578,8 @@ namespace Game.Networking.Packets
attackRoundInfo.WriteUInt8(ContentTuning.TargetMaxScalingLevel); attackRoundInfo.WriteUInt8(ContentTuning.TargetMaxScalingLevel);
attackRoundInfo.WriteInt16(ContentTuning.PlayerLevelDelta); attackRoundInfo.WriteInt16(ContentTuning.PlayerLevelDelta);
attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta); attackRoundInfo.WriteInt8(ContentTuning.TargetScalingLevelDelta);
attackRoundInfo.WriteUInt16(ContentTuning.PlayerItemLevel); attackRoundInfo.WriteFloat(ContentTuning.PlayerItemLevel);
attackRoundInfo.WriteUInt16(ContentTuning.TargetItemLevel); attackRoundInfo.WriteFloat(ContentTuning.TargetItemLevel);
attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID); attackRoundInfo.WriteUInt16(ContentTuning.ScalingHealthItemLevelCurveID);
attackRoundInfo.WriteUInt8((byte)(ContentTuning.ScalesWithItemLevel ? 1 : 0)); attackRoundInfo.WriteUInt8((byte)(ContentTuning.ScalesWithItemLevel ? 1 : 0));
@@ -62,6 +62,9 @@ namespace Game.Networking.Packets
foreach (var id in equipSet.Enchants) foreach (var id in equipSet.Enchants)
_worldPacket.WriteInt32(id); _worldPacket.WriteInt32(id);
_worldPacket.WriteInt32(equipSet.Unknown901_1);
_worldPacket.WriteInt32(equipSet.Unknown901_2);
_worldPacket.WriteBit(equipSet.AssignedSpecIndex != -1); _worldPacket.WriteBit(equipSet.AssignedSpecIndex != -1);
_worldPacket.WriteBits(equipSet.SetName.GetByteCount(), 8); _worldPacket.WriteBits(equipSet.SetName.GetByteCount(), 8);
_worldPacket.WriteBits(equipSet.SetIcon.GetByteCount(), 9); _worldPacket.WriteBits(equipSet.SetIcon.GetByteCount(), 9);
@@ -100,6 +103,9 @@ namespace Game.Networking.Packets
Set.Enchants[0] = _worldPacket.ReadInt32(); Set.Enchants[0] = _worldPacket.ReadInt32();
Set.Enchants[1] = _worldPacket.ReadInt32(); Set.Enchants[1] = _worldPacket.ReadInt32();
Set.Unknown901_1 = _worldPacket.ReadInt32();
Set.Unknown901_2 = _worldPacket.ReadInt32();
bool hasSpecIndex = _worldPacket.HasBit(); bool hasSpecIndex = _worldPacket.HasBit();
uint setNameLength = _worldPacket.ReadBits<uint>(8); uint setNameLength = _worldPacket.ReadBits<uint>(8);
+111 -17
View File
@@ -20,6 +20,7 @@ using Game.DataStorage;
using Game.Entities; using Game.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Framework.Dynamic;
namespace Game.Networking.Packets namespace Game.Networking.Packets
{ {
@@ -223,25 +224,25 @@ namespace Game.Networking.Packets
public List<uint> BlueprintsKnown = null; 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() { } 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() public override void Write()
{ {
_worldPacket.WriteInt32(Landmarks.Count); _worldPacket.WriteInt32(Buildings.Count);
foreach (GarrisonBuildingLandmark landmark in Landmarks) foreach (GarrisonBuildingMapData landmark in Buildings)
landmark.Write(_worldPacket); landmark.Write(_worldPacket);
} }
public List<GarrisonBuildingLandmark> Landmarks = new List<GarrisonBuildingLandmark>(); public List<GarrisonBuildingMapData> Buildings = new List<GarrisonBuildingMapData>();
} }
class GarrisonPlotPlaced : ServerPacket class GarrisonPlotPlaced : ServerPacket
@@ -369,6 +370,9 @@ namespace Game.Networking.Packets
data.WriteInt32(AbilityID.Count); data.WriteInt32(AbilityID.Count);
data.WriteUInt32(ZoneSupportSpellID); data.WriteUInt32(ZoneSupportSpellID);
data.WriteUInt32(FollowerStatus); data.WriteUInt32(FollowerStatus);
data.WriteInt32(Health);
data .WriteInt8(BoardIndex);
data .WriteInt32(HealingTimestamp);
AbilityID.ForEach(ability => data.WriteUInt32(ability.Id)); AbilityID.ForEach(ability => data.WriteUInt32(ability.Id));
@@ -390,6 +394,9 @@ namespace Game.Networking.Packets
public List<GarrAbilityRecord> AbilityID = new List<GarrAbilityRecord>(); public List<GarrAbilityRecord> AbilityID = new List<GarrAbilityRecord>();
public uint ZoneSupportSpellID; public uint ZoneSupportSpellID;
public uint FollowerStatus; public uint FollowerStatus;
public int Health;
public int HealingTimestamp;
public sbyte BoardIndex;
public string CustomName = ""; public string CustomName = "";
} }
@@ -405,8 +412,9 @@ namespace Game.Networking.Packets
data.WriteUInt32(TravelDuration); data.WriteUInt32(TravelDuration);
data.WriteUInt32(MissionDuration); data.WriteUInt32(MissionDuration);
data.WriteUInt32(MissionState); data.WriteUInt32(MissionState);
data.WriteUInt32(Unknown1); data.WriteUInt32(SuccessChance);
data.WriteUInt32(Unknown2); data.WriteUInt32(Flags);
data.WriteFloat(MissionScalar);
} }
public ulong DbID; public ulong DbID;
@@ -417,8 +425,9 @@ namespace Game.Networking.Packets
public uint TravelDuration; public uint TravelDuration;
public uint MissionDuration; public uint MissionDuration;
public uint MissionState; public uint MissionState;
public uint Unknown1 = 0; public uint SuccessChance;
public uint Unknown2 = 0; public uint Flags;
public float MissionScalar = 1.0f;
} }
struct GarrisonMissionReward struct GarrisonMissionReward
@@ -455,6 +464,18 @@ namespace Game.Networking.Packets
public long StartTime; public long StartTime;
} }
struct GarrisonTalentSocketData
{
public int SoulbindConduitID;
public int SoulbindConduitRank;
public void Write(WorldPacket data)
{
data.WriteInt32(SoulbindConduitID);
data.WriteInt32(SoulbindConduitRank);
}
}
struct GarrisonTalent struct GarrisonTalent
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
@@ -463,12 +484,70 @@ namespace Game.Networking.Packets
data.WriteInt32(Rank); data.WriteInt32(Rank);
data.WriteUInt32((uint)ResearchStartTime); data.WriteUInt32((uint)ResearchStartTime);
data.WriteInt32(Flags); data.WriteInt32(Flags);
data.WriteBit(Socket.HasValue);
data.FlushBits();
if (Socket.HasValue)
Socket.Value.Write(data);
} }
public int GarrTalentID; public int GarrTalentID;
public int Rank; public int Rank;
public long ResearchStartTime; public long ResearchStartTime;
public int Flags; 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 class GarrisonInfo
@@ -481,11 +560,14 @@ namespace Game.Networking.Packets
data.WriteInt32(Buildings.Count); data.WriteInt32(Buildings.Count);
data.WriteInt32(Plots.Count); data.WriteInt32(Plots.Count);
data.WriteInt32(Followers.Count); data.WriteInt32(Followers.Count);
data.WriteInt32(AutoTroops.Count);
data.WriteInt32(Missions.Count); data.WriteInt32(Missions.Count);
data.WriteInt32(MissionRewards.Count); data.WriteInt32(MissionRewards.Count);
data.WriteInt32(MissionOvermaxRewards.Count); data.WriteInt32(MissionOvermaxRewards.Count);
data.WriteInt32(MissionAreaBonuses.Count); data.WriteInt32(MissionAreaBonuses.Count);
data.WriteInt32(Talents.Count); data.WriteInt32(Talents.Count);
data.WriteInt32(Collections.Count);
data.WriteInt32(EventLists.Count);
data.WriteInt32(CanStartMission.Count); data.WriteInt32(CanStartMission.Count);
data.WriteInt32(ArchivedMissions.Count); data.WriteInt32(ArchivedMissions.Count);
data.WriteUInt32(NumFollowerActivationsRemaining); data.WriteUInt32(NumFollowerActivationsRemaining);
@@ -514,11 +596,14 @@ namespace Game.Networking.Packets
foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses) foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses)
areaBonus.Write(data); areaBonus.Write(data);
foreach (GarrisonTalent talent in Talents) foreach (GarrisonCollection collection in Collections)
talent.Write(data); collection.Write(data);
foreach(var id in ArchivedMissions) foreach (GarrisonEventList eventList in EventLists)
data.WriteInt32(id); eventList.Write(data);
foreach (var id in ArchivedMissions)
data.WriteInt32(id);
foreach (GarrisonBuildingInfo building in Buildings) foreach (GarrisonBuildingInfo building in Buildings)
building.Write(data); building.Write(data);
@@ -530,6 +615,12 @@ namespace Game.Networking.Packets
foreach (GarrisonFollower follower in Followers) foreach (GarrisonFollower follower in Followers)
follower.Write(data); follower.Write(data);
foreach (GarrisonFollower follower in AutoTroops)
follower.Write(data);
foreach (GarrisonTalent talent in Talents)
talent.Write(data);
} }
public GarrisonType GarrTypeID; public GarrisonType GarrTypeID;
@@ -540,11 +631,14 @@ namespace Game.Networking.Packets
public List<GarrisonPlotInfo> Plots = new List<GarrisonPlotInfo>(); public List<GarrisonPlotInfo> Plots = new List<GarrisonPlotInfo>();
public List<GarrisonBuildingInfo> Buildings = new List<GarrisonBuildingInfo>(); public List<GarrisonBuildingInfo> Buildings = new List<GarrisonBuildingInfo>();
public List<GarrisonFollower> Followers = new List<GarrisonFollower>(); public List<GarrisonFollower> Followers = new List<GarrisonFollower>();
public List<GarrisonFollower> AutoTroops = new List<GarrisonFollower>();
public List<GarrisonMission> Missions = new List<GarrisonMission>(); public List<GarrisonMission> Missions = new List<GarrisonMission>();
public List<List<GarrisonMissionReward>> MissionRewards = new List<List<GarrisonMissionReward>>(); public List<List<GarrisonMissionReward>> MissionRewards = new List<List<GarrisonMissionReward>>();
public List<List<GarrisonMissionReward>> MissionOvermaxRewards = new List<List<GarrisonMissionReward>>(); public List<List<GarrisonMissionReward>> MissionOvermaxRewards = new List<List<GarrisonMissionReward>>();
public List<GarrisonMissionBonusAbility> MissionAreaBonuses = new List<GarrisonMissionBonusAbility>(); public List<GarrisonMissionBonusAbility> MissionAreaBonuses = new List<GarrisonMissionBonusAbility>();
public List<GarrisonTalent> Talents = new List<GarrisonTalent>(); 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<bool> CanStartMission = new List<bool>();
public List<int> ArchivedMissions = new List<int>(); public List<int> ArchivedMissions = new List<int>();
} }
@@ -593,9 +687,9 @@ namespace Game.Networking.Packets
public List<GarrisonRemoteBuildingInfo> Buildings = new List<GarrisonRemoteBuildingInfo>(); 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; GarrBuildingPlotInstID = buildingPlotInstId;
Pos = pos; Pos = pos;
@@ -278,9 +278,9 @@ namespace Game.Networking.Packets
public string OldGuildName; 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() public override void Write()
{ {
@@ -426,7 +426,6 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteBit(Removed); _worldPacket.WriteBit(Removed);
_worldPacket.WriteBits(LeaverName.GetByteCount(), 6); _worldPacket.WriteBits(LeaverName.GetByteCount(), 6);
_worldPacket.FlushBits();
if (Removed) if (Removed)
{ {
@@ -63,7 +63,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(TableHash); _worldPacket.WriteUInt32(TableHash);
_worldPacket.WriteUInt32(RecordID); _worldPacket.WriteUInt32(RecordID);
_worldPacket.WriteUInt32(Timestamp); _worldPacket.WriteUInt32(Timestamp);
_worldPacket.WriteBit(Allow); _worldPacket.WriteBits(Status, 2);
_worldPacket.WriteUInt32(Data.GetSize()); _worldPacket.WriteUInt32(Data.GetSize());
_worldPacket.WriteBytes(Data.GetData()); _worldPacket.WriteBytes(Data.GetData());
} }
@@ -71,7 +71,7 @@ namespace Game.Networking.Packets
public uint TableHash; public uint TableHash;
public uint Timestamp; public uint Timestamp;
public uint RecordID; public uint RecordID;
public bool Allow; public byte Status = 3;
public ByteBuffer Data = new ByteBuffer(); public ByteBuffer Data = new ByteBuffer();
} }
@@ -147,12 +147,12 @@ namespace Game.Networking.Packets
if (Size.HasValue) if (Size.HasValue)
{ {
data.WriteUInt32(Size.Value); data.WriteUInt32(Size.Value);
data.WriteBit(true); data.WriteBits(1, 2);
} }
else else
{ {
data.WriteUInt32(0); data.WriteUInt32(0);
data.WriteBit(false); data.WriteBits(3, 2);
} }
data.FlushBits(); data.FlushBits();
} }
@@ -224,14 +224,9 @@ namespace Game.Networking.Packets
public string Name; public string Name;
public uint SpecializationID; public uint SpecializationID;
public byte GenderID; public byte GenderID;
public byte Skin;
public byte HairColor;
public byte HairStyle;
public byte FacialHairStyle;
public byte Face;
public byte Race; public byte Race;
public byte ClassID; public byte ClassID;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize); public List<ChrCustomizationChoice> Customizations = new List<ChrCustomizationChoice>();
public void Initialize(Player player) public void Initialize(Player player)
{ {
@@ -239,14 +234,11 @@ namespace Game.Networking.Packets
SpecializationID = player.GetPrimarySpecialization(); SpecializationID = player.GetPrimarySpecialization();
Name = player.GetName(); Name = player.GetName();
GenderID = player.m_playerData.NativeSex; 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(); Race = (byte)player.GetRace();
ClassID = (byte)player.GetClass(); 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) for (byte i = 0; i < EquipmentSlot.End; ++i)
{ {
@@ -263,17 +255,14 @@ namespace Game.Networking.Packets
data.WriteInt32(Items.Count); data.WriteInt32(Items.Count);
data.WriteBits(Name.GetByteCount(), 6); data.WriteBits(Name.GetByteCount(), 6);
data.WriteUInt8(GenderID); data.WriteUInt8(GenderID);
data.WriteUInt8(Skin);
data.WriteUInt8(HairColor);
data.WriteUInt8(HairStyle);
data.WriteUInt8(FacialHairStyle);
data.WriteUInt8(Face);
data.WriteUInt8(Race); data.WriteUInt8(Race);
data.WriteUInt8(ClassID); data.WriteUInt8(ClassID);
CustomDisplay.ForEach(id => data.WriteUInt8(id)); data.WriteInt32(Customizations.Count);
data.WriteString(Name); data.WriteString(Name);
foreach (var customization in Customizations)
customization.Write(data);
foreach (InspectItemData item in Items) foreach (InspectItemData item in Items)
item.Write(data); item.Write(data);
} }
+130 -40
View File
@@ -52,7 +52,7 @@ namespace Game.Networking.Packets
Muid = _worldPacket.ReadUInt32(); Muid = _worldPacket.ReadUInt32();
Slot = _worldPacket.ReadUInt32(); Slot = _worldPacket.ReadUInt32();
Item.Read(_worldPacket); Item.Read(_worldPacket);
ItemType = (ItemVendorType)_worldPacket.ReadBits<int>(2); ItemType = (ItemVendorType)_worldPacket.ReadBits<int>(3);
} }
public ObjectGuid VendorGUID; public ObjectGuid VendorGUID;
@@ -678,7 +678,7 @@ namespace Game.Networking.Packets
} }
//Structs //Structs
public class ItemBonusInstanceData public class ItemBonuses
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
@@ -708,13 +708,13 @@ namespace Game.Networking.Packets
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (obj is ItemBonusInstanceData) if (obj is ItemBonuses)
return (ItemBonusInstanceData)obj == this; return (ItemBonuses)obj == this;
return false; return false;
} }
public static bool operator ==(ItemBonusInstanceData left, ItemBonusInstanceData right) public static bool operator ==(ItemBonuses left, ItemBonuses right)
{ {
if (left.Context != right.Context) if (left.Context != right.Context)
return false; return false;
@@ -725,7 +725,7 @@ namespace Game.Networking.Packets
return left.BonusListIDs.SequenceEqual(right.BonusListIDs); 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); return !(left == right);
} }
@@ -734,8 +734,118 @@ namespace Game.Networking.Packets
public List<uint> BonusListIDs = new List<uint>(); 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 class ItemInstance
{ {
public uint ItemID;
public Optional<ItemBonuses> ItemBonus;
public ItemModList Modifications = new ItemModList();
public ItemInstance() { } public ItemInstance() { }
public ItemInstance(Item item) public ItemInstance(Item item)
@@ -749,17 +859,8 @@ namespace Game.Networking.Packets
ItemBonus.Value.Context = item.GetContext(); ItemBonus.Value.Context = item.GetContext();
} }
uint mask = item.m_itemData.ModifiersMask; foreach (var mod in item.m_itemData.Modifiers.Values)
if (mask != 0) Modifications.Values.Add(mod.Value, (ItemModifier)mod.Type);
{
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));
}
}
} }
public ItemInstance(Loots.LootItem lootItem) public ItemInstance(Loots.LootItem lootItem)
@@ -780,14 +881,11 @@ namespace Game.Networking.Packets
{ {
ItemID = voidItem.ItemEntry; ItemID = voidItem.ItemEntry;
if (voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0) if (voidItem.FixedScalingLevel != 0)
{ Modifications.Values.Add(new ItemMod(voidItem.FixedScalingLevel, ItemModifier.TimewalkerLevel));
Modifications.HasValue = true;
if (voidItem.FixedScalingLevel != 0) if (voidItem.ArtifactKnowledgeLevel != 0)
Modifications.Value.Insert((int)ItemModifier.TimewalkerLevel, (int)voidItem.FixedScalingLevel); Modifications.Values.Add(new ItemMod(voidItem.ArtifactKnowledgeLevel, ItemModifier.ArtifactKnowledgeLevel));
if (voidItem.ArtifactKnowledgeLevel != 0)
Modifications.Value.Insert((int)ItemModifier.ArtifactKnowledgeLevel, (int)voidItem.ArtifactKnowledgeLevel);
}
if (!voidItem.BonusListIDs.Empty()) if (!voidItem.BonusListIDs.Empty())
{ {
@@ -801,7 +899,7 @@ namespace Game.Networking.Packets
{ {
ItemID = gem.ItemId; ItemID = gem.ItemId;
ItemBonusInstanceData bonus = new ItemBonusInstanceData(); ItemBonuses bonus = new ItemBonuses();
bonus.Context = (ItemContext)(byte)gem.Context; bonus.Context = (ItemContext)(byte)gem.Context;
foreach (ushort bonusListId in gem.BonusListIDs) foreach (ushort bonusListId in gem.BonusListIDs)
if (bonusListId != 0) if (bonusListId != 0)
@@ -816,14 +914,12 @@ namespace Game.Networking.Packets
data.WriteUInt32(ItemID); data.WriteUInt32(ItemID);
data.WriteBit(ItemBonus.HasValue); data.WriteBit(ItemBonus.HasValue);
data.WriteBit(Modifications.HasValue);
data.FlushBits(); data.FlushBits();
Modifications.Write(data);
if (ItemBonus.HasValue) if (ItemBonus.HasValue)
ItemBonus.Value.Write(data); ItemBonus.Value.Write(data);
if (Modifications.HasValue)
Modifications.Value.Write(data);
} }
public void Read(WorldPacket data) public void Read(WorldPacket data)
@@ -831,14 +927,12 @@ namespace Game.Networking.Packets
ItemID = data.ReadUInt32(); ItemID = data.ReadUInt32();
ItemBonus.HasValue = data.HasBit(); ItemBonus.HasValue = data.HasBit();
Modifications.HasValue = data.HasBit();
data.ResetBitPos(); data.ResetBitPos();
Modifications.Read(data);
if (ItemBonus.HasValue) if (ItemBonus.HasValue)
ItemBonus.Value.Read(data); ItemBonus.Value.Read(data);
if (Modifications.HasValue)
Modifications.Value.Read(data);
} }
public override int GetHashCode() public override int GetHashCode()
@@ -859,10 +953,10 @@ namespace Game.Networking.Packets
if (left.ItemID != right.ItemID) if (left.ItemID != right.ItemID)
return false; return false;
if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue) if (left.ItemBonus.HasValue != right.ItemBonus.HasValue)
return false; return false;
if (left.Modifications.HasValue && left.Modifications.Value != right.Modifications.Value) if (left.Modifications != right.Modifications)
return false; return false;
if (left.ItemBonus.HasValue && left.ItemBonus.Value != right.ItemBonus.Value) if (left.ItemBonus.HasValue && left.ItemBonus.Value != right.ItemBonus.Value)
@@ -875,10 +969,6 @@ namespace Game.Networking.Packets
{ {
return !(left == right); return !(left == right);
} }
public uint ItemID;
public Optional<ItemBonusInstanceData> ItemBonus;
public Optional<CompactArray> Modifications;
} }
public class ItemEnchantData public class ItemEnchantData
+33 -45
View File
@@ -278,7 +278,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(BlackList.Count); _worldPacket.WriteInt32(BlackList.Count);
_worldPacket.WriteInt32(BlackListNames.Count); _worldPacket.WriteInt32(BlackListNames.Count);
foreach (LFGJoinBlackList blackList in BlackList) foreach (LFGBlackListPkt blackList in BlackList)
blackList.Write(_worldPacket); blackList.Write(_worldPacket);
foreach (string str in BlackListNames) foreach (string str in BlackListNames)
@@ -292,7 +292,7 @@ namespace Game.Networking.Packets
public RideTicket Ticket = new RideTicket(); public RideTicket Ticket = new RideTicket();
public byte Result; public byte Result;
public byte ResultDetail; public byte ResultDetail;
public List<LFGJoinBlackList> BlackList = new List<LFGJoinBlackList>(); public List<LFGBlackListPkt> BlackList = new List<LFGBlackListPkt>();
public List<string> BlackListNames = new List<string>(); public List<string> BlackListNames = new List<string>();
} }
@@ -441,22 +441,36 @@ namespace Game.Networking.Packets
//Structs //Structs
public class LFGBlackListSlot 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; Slot = slot;
Reason = reason; Reason = reason;
SubReason1 = subReason1; SubReason1 = subReason1;
SubReason2 = subReason2; SubReason2 = subReason2;
SoftLock = softLock;
} }
public uint Slot { get; set; } public void Write(WorldPacket data)
public uint Reason { get; set; } {
public int SubReason1 { get; set; } data.WriteUInt32(Slot);
public int SubReason2 { get; set; } data.WriteUInt32(Reason);
data.WriteInt32(SubReason1);
data.WriteInt32(SubReason2);
data.WriteUInt32(SoftLock);
}
} }
public class LFGBlackList public class LFGBlackList
{ {
public Optional<ObjectGuid> PlayerGuid;
public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteBit(PlayerGuid.HasValue); data.WriteBit(PlayerGuid.HasValue);
@@ -464,17 +478,9 @@ namespace Game.Networking.Packets
if (PlayerGuid.HasValue) if (PlayerGuid.HasValue)
data.WritePackedGuid(PlayerGuid.Value); data.WritePackedGuid(PlayerGuid.Value);
foreach (LFGBlackListSlot lfgBlackListSlot in Slot) foreach (LFGBlackListSlot slot in Slot)
{ slot.Write(data);
data.WriteUInt32(lfgBlackListSlot.Slot);
data.WriteUInt32(lfgBlackListSlot.Reason);
data.WriteInt32(lfgBlackListSlot.SubReason1);
data.WriteInt32(lfgBlackListSlot.SubReason2);
}
} }
public Optional<ObjectGuid> PlayerGuid;
public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
} }
public struct LfgPlayerQuestRewardItem public struct LfgPlayerQuestRewardItem
@@ -639,40 +645,22 @@ namespace Game.Networking.Packets
public bool RoleCheckComplete; public bool RoleCheckComplete;
} }
public struct LFGJoinBlackListSlot public class LFGBlackListPkt
{
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 void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WritePackedGuid(PlayerGuid); data.WriteBit(PlayerGuid.HasValue);
data.WriteInt32(Slots.Count); data.WriteInt32(Slot.Count);
foreach (LFGJoinBlackListSlot lfgBlackListSlot in Slots) if (PlayerGuid.HasValue)
{ data.WritePackedGuid(PlayerGuid.Value);
data.WriteInt32(lfgBlackListSlot.Slot);
data.WriteInt32(lfgBlackListSlot.Reason); foreach (LFGBlackListSlot slot in Slot)
data.WriteInt32(lfgBlackListSlot.SubReason1); slot.Write(data);
data.WriteInt32(lfgBlackListSlot.SubReason2);
}
} }
public ObjectGuid PlayerGuid; public Optional<ObjectGuid> PlayerGuid;
public List<LFGJoinBlackListSlot> Slots = new List<LFGJoinBlackListSlot>(); public List<LFGBlackListSlot> Slot = new List<LFGBlackListSlot>();
} }
public struct LFGPlayerRewards public struct LFGPlayerRewards
+21 -20
View File
@@ -124,6 +124,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(WeeklyQuantity.HasValue); _worldPacket.WriteBit(WeeklyQuantity.HasValue);
_worldPacket.WriteBit(TrackedQuantity.HasValue); _worldPacket.WriteBit(TrackedQuantity.HasValue);
_worldPacket.WriteBit(MaxQuantity.HasValue); _worldPacket.WriteBit(MaxQuantity.HasValue);
_worldPacket.WriteBit(Unused901.HasValue);
_worldPacket.WriteBit(SuppressChatLog); _worldPacket.WriteBit(SuppressChatLog);
_worldPacket.WriteBit(QuantityChange.HasValue); _worldPacket.WriteBit(QuantityChange.HasValue);
_worldPacket.WriteBit(QuantityGainSource.HasValue); _worldPacket.WriteBit(QuantityGainSource.HasValue);
@@ -139,6 +140,9 @@ namespace Game.Networking.Packets
if (MaxQuantity.HasValue) if (MaxQuantity.HasValue)
_worldPacket.WriteInt32(MaxQuantity.Value); _worldPacket.WriteInt32(MaxQuantity.Value);
if (Unused901.HasValue)
_worldPacket.WriteInt32(Unused901.Value);
if (QuantityChange.HasValue) if (QuantityChange.HasValue)
_worldPacket.WriteInt32(QuantityChange.Value); _worldPacket.WriteInt32(QuantityChange.Value);
@@ -155,6 +159,7 @@ namespace Game.Networking.Packets
public Optional<int> WeeklyQuantity; public Optional<int> WeeklyQuantity;
public Optional<int> TrackedQuantity; public Optional<int> TrackedQuantity;
public Optional<int> MaxQuantity; public Optional<int> MaxQuantity;
public Optional<int> Unused901;
public Optional<int> QuantityChange; public Optional<int> QuantityChange;
public Optional<int> QuantityGainSource; public Optional<int> QuantityGainSource;
public Optional<int> QuantityLostSource; public Optional<int> QuantityLostSource;
@@ -204,6 +209,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(data.MaxWeeklyQuantity.HasValue); _worldPacket.WriteBit(data.MaxWeeklyQuantity.HasValue);
_worldPacket.WriteBit(data.TrackedQuantity.HasValue); _worldPacket.WriteBit(data.TrackedQuantity.HasValue);
_worldPacket.WriteBit(data.MaxQuantity.HasValue); _worldPacket.WriteBit(data.MaxQuantity.HasValue);
_worldPacket.WriteBit(data.Unused901.HasValue);
_worldPacket.WriteBits(data.Flags, 5); _worldPacket.WriteBits(data.Flags, 5);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -215,6 +221,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(data.TrackedQuantity.Value); _worldPacket.WriteUInt32(data.TrackedQuantity.Value);
if (data.MaxQuantity.HasValue) if (data.MaxQuantity.HasValue)
_worldPacket.WriteInt32(data.MaxQuantity.Value); _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> MaxWeeklyQuantity; // Weekly Currency cap.
public Optional<uint> TrackedQuantity; public Optional<uint> TrackedQuantity;
public Optional<int> MaxQuantity; public Optional<int> MaxQuantity;
public Optional<int> Unused901;
public byte Flags; // 0 = none, public byte Flags; // 0 = none,
} }
} }
@@ -366,7 +375,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(RestrictedAccountMaxLevel.Value); _worldPacket.WriteUInt32(RestrictedAccountMaxLevel.Value);
if (RestrictedAccountMaxMoney.HasValue) if (RestrictedAccountMaxMoney.HasValue)
_worldPacket.WriteUInt32(RestrictedAccountMaxMoney.Value); _worldPacket.WriteUInt64(RestrictedAccountMaxMoney.Value);
if (InstanceGroupSize.HasValue) if (InstanceGroupSize.HasValue)
_worldPacket.WriteUInt32(InstanceGroupSize.Value); _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 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 // 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> RestrictedAccountMaxLevel;
public Optional<uint> RestrictedAccountMaxMoney; public Optional<ulong> RestrictedAccountMaxMoney;
public Optional<uint> InstanceGroupSize; public Optional<uint> InstanceGroupSize;
} }
@@ -864,12 +873,14 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(SourceObjectGUID); _worldPacket.WritePackedGuid(SourceObjectGUID);
_worldPacket.WritePackedGuid(TargetObjectGUID); _worldPacket.WritePackedGuid(TargetObjectGUID);
_worldPacket.WriteVector3(Position); _worldPacket.WriteVector3(Position);
_worldPacket.WriteInt32(BroadcastTextID);
} }
ObjectGuid TargetObjectGUID; public ObjectGuid TargetObjectGUID;
ObjectGuid SourceObjectGUID; public ObjectGuid SourceObjectGUID;
uint SoundKitID; public uint SoundKitID;
Vector3 Position; public Vector3 Position;
public int BroadcastTextID;
} }
class PlaySound : ServerPacket class PlaySound : ServerPacket
@@ -884,10 +895,12 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteUInt32(SoundKitID); _worldPacket.WriteUInt32(SoundKitID);
_worldPacket.WritePackedGuid(SourceObjectGuid); _worldPacket.WritePackedGuid(SourceObjectGuid);
_worldPacket.WriteInt32(BroadcastTextID);
} }
ObjectGuid SourceObjectGuid; public ObjectGuid SourceObjectGuid;
uint SoundKitID; public uint SoundKitID;
public int BroadcastTextID;
} }
class PlaySpeakerBoxSound : ServerPacket class PlaySpeakerBoxSound : ServerPacket
@@ -948,18 +961,6 @@ namespace Game.Networking.Packets
public bool Enable; public bool Enable;
} }
class Dismount : ServerPacket
{
public Dismount() : base(ServerOpcodes.Dismount) { }
public override void Write()
{
_worldPacket.WritePackedGuid(Guid);
}
public ObjectGuid Guid;
}
class SaveCUFProfiles : ClientPacket class SaveCUFProfiles : ClientPacket
{ {
public SaveCUFProfiles(WorldPacket packet) : base(packet) { } public SaveCUFProfiles(WorldPacket packet) : base(packet) { }
+112 -27
View File
@@ -161,8 +161,8 @@ namespace Game.Networking.Packets
data.WriteBit(hasTransportData); data.WriteBit(hasTransportData);
data.WriteBit(hasFallData); data.WriteBit(hasFallData);
data.WriteBit(hasSpline); data.WriteBit(hasSpline);
data.WriteBit(0); // HeightChangeFailed data.WriteBit(false); // HeightChangeFailed
data.WriteBit(0); // RemoteTimeValid data.WriteBit(false); // RemoteTimeValid
data.FlushBits(); data.FlushBits();
if (hasTransportData) if (hasTransportData)
@@ -206,10 +206,11 @@ namespace Game.Networking.Packets
data.WriteBits((byte)moveSpline.facing.type, 2); // Face data.WriteBits((byte)moveSpline.facing.type, 2); // Face
bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration()); bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.FadeObject) && moveSpline.effect_start_time < moveSpline.Duration());
data.WriteBits(moveSpline.GetPath().Length, 16); data.WriteBits(moveSpline.GetPath().Length, 16);
data.WriteBits((byte)moveSpline.spline.m_mode, 2); // Mode data.WriteBit(false); // HasSplineFilter
data.WriteBit(0); // HasSplineFilter
data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData data.WriteBit(moveSpline.spell_effect_extra.HasValue); // HasSpellEffectExtraData
data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic)); // HasJumpExtraData data.WriteBit(moveSpline.splineflags.HasFlag(SplineFlag.Parabolic)); // HasJumpExtraData
data.WriteBit(moveSpline.anim_tier.HasValue); // HasAnimationTierTransition
data.WriteBit(false); // HasUnknown901
data.FlushBits(); data.FlushBits();
//if (HasSplineFilterKey) //if (HasSplineFilterKey)
@@ -258,6 +259,25 @@ namespace Game.Networking.Packets
data.WriteInt32(moveSpline.effect_start_time); data.WriteInt32(moveSpline.effect_start_time);
data.WriteUInt32(0); // Duration (override) 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)) if (splineFlags.HasFlag(SplineFlag.Animation))
{ {
movementSpline.AnimTier = splineFlags.GetAnimTier(); movementSpline.AnimTierTransition.HasValue = true;
movementSpline.TierTransStartTime = (uint)moveSpline.effect_start_time; 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(); movementSpline.MoveTime = (uint)moveSpline.Duration();
@@ -562,14 +584,14 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32(MapID); _worldPacket.WriteUInt32(MapID);
_worldPacket.WriteXYZO(Pos); Loc.Write(_worldPacket);
_worldPacket.WriteUInt32(Reason); _worldPacket.WriteUInt32(Reason);
_worldPacket.WriteXYZ(MovementOffset); _worldPacket.WriteXYZ(MovementOffset);
} }
public uint MapID; public uint MapID;
public uint Reason; public uint Reason;
public Position Pos; public TeleportLocation Loc = new TeleportLocation();
public Position MovementOffset; // Adjusts all pending movement events by this offset public Position MovementOffset; // Adjusts all pending movement events by this offset
} }
@@ -894,10 +916,9 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(SequenceIndex); _worldPacket.WriteUInt32(SequenceIndex);
_worldPacket.WriteFloat(Height); _worldPacket.WriteFloat(Height);
_worldPacket.WriteFloat(Scale); _worldPacket.WriteFloat(Scale);
_worldPacket.WriteUInt8((byte)Reason);
_worldPacket.WriteUInt32(MountDisplayID); _worldPacket.WriteUInt32(MountDisplayID);
_worldPacket.WriteInt32(ScaleDuration); _worldPacket.WriteInt32(ScaleDuration);
_worldPacket.WriteBits((uint)Reason, 2);
_worldPacket.FlushBits();
} }
public float Scale = 1.0f; public float Scale = 1.0f;
@@ -934,7 +955,7 @@ namespace Game.Networking.Packets
Data.Read(_worldPacket); Data.Read(_worldPacket);
Height = _worldPacket.ReadFloat(); Height = _worldPacket.ReadFloat();
MountDisplayID = _worldPacket.ReadUInt32(); MountDisplayID = _worldPacket.ReadUInt32();
Reason = (UpdateCollisionHeightReason)_worldPacket.ReadBits<uint>(2); Reason = (UpdateCollisionHeightReason)_worldPacket.ReadUInt8();
} }
public MovementAck Data; public MovementAck Data;
@@ -1118,13 +1139,10 @@ namespace Game.Networking.Packets
data.WriteBit(MovementForceGUID.HasValue); data.WriteBit(MovementForceGUID.HasValue);
data.FlushBits(); data.FlushBits();
if (CollisionHeight.HasValue) if (MovementForce_.HasValue)
{ MovementForce_.Value.Write(data);
data.WriteFloat(CollisionHeight.Value.Height);
data.WriteFloat(CollisionHeight.Value.Scale);
data.WriteBits(CollisionHeight.Value.Reason, 2);
data.FlushBits();
}
if (Speed.HasValue) if (Speed.HasValue)
data.WriteFloat(Speed.Value); data.WriteFloat(Speed.Value);
@@ -1139,11 +1157,16 @@ namespace Game.Networking.Packets
if (VehicleRecID.HasValue) if (VehicleRecID.HasValue)
data.WriteInt32(VehicleRecID.Value); 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) if (MovementForceGUID.HasValue)
data.WritePackedGuid(MovementForceGUID.Value); data.WritePackedGuid(MovementForceGUID.Value);
if (MovementForce_.HasValue)
MovementForce_.Value.Write(data);
} }
public ServerOpcodes MessageID; 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 class MovementSpline
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt32(Flags); data.WriteUInt32(Flags);
data.WriteUInt8(AnimTier);
data.WriteUInt32(TierTransStartTime);
data.WriteInt32(Elapsed); data.WriteInt32(Elapsed);
data.WriteUInt32(MoveTime); data.WriteUInt32(MoveTime);
data.WriteUInt32(FadeObjectTime); data.WriteUInt32(FadeObjectTime);
data.WriteUInt8(Mode); data.WriteUInt8(Mode);
data.WriteUInt8(VehicleExitVoluntary);
data.WritePackedGuid(TransportGUID); data.WritePackedGuid(TransportGUID);
data.WriteInt8(VehicleSeat); data.WriteInt8(VehicleSeat);
data.WriteBits((byte)Face, 2); data.WriteBits((byte)Face, 2);
data.WriteBits(Points.Count, 16); data.WriteBits(Points.Count, 16);
data.WriteBit(VehicleExitVoluntary);
data.WriteBit(Interpolate);
data.WriteBits(PackedDeltas.Count, 16); data.WriteBits(PackedDeltas.Count, 16);
data.WriteBit(SplineFilter.HasValue); data.WriteBit(SplineFilter.HasValue);
data.WriteBit(SpellEffectExtraData.HasValue); data.WriteBit(SpellEffectExtraData.HasValue);
data.WriteBit(JumpExtraData.HasValue); data.WriteBit(JumpExtraData.HasValue);
data.WriteBit(AnimTierTransition.HasValue);
data.WriteBit(Unknown901.HasValue);
data.FlushBits(); data.FlushBits();
if (SplineFilter.HasValue) if (SplineFilter.HasValue)
@@ -1288,24 +1366,31 @@ namespace Game.Networking.Packets
if (JumpExtraData.HasValue) if (JumpExtraData.HasValue)
JumpExtraData.Value.Write(data); JumpExtraData.Value.Write(data);
if (AnimTierTransition.HasValue)
AnimTierTransition.Value.Write(data);
if (Unknown901.HasValue)
Unknown901.Value.Write(data);
} }
public uint Flags; // Spline flags public uint Flags; // Spline flags
public MonsterMoveType Face; // Movement direction (see MonsterMoveType enum) public MonsterMoveType Face; // Movement direction (see MonsterMoveType enum)
public byte AnimTier;
public uint TierTransStartTime;
public int Elapsed; public int Elapsed;
public uint MoveTime; public uint MoveTime;
public uint FadeObjectTime; public uint FadeObjectTime;
public List<Vector3> Points = new List<Vector3>(); // Spline path 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 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 ObjectGuid TransportGUID;
public sbyte VehicleSeat = -1; public sbyte VehicleSeat = -1;
public List<Vector3> PackedDeltas = new List<Vector3>(); public List<Vector3> PackedDeltas = new List<Vector3>();
public Optional<MonsterSplineFilter> SplineFilter; public Optional<MonsterSplineFilter> SplineFilter;
public Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData; public Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData;
public Optional<MonsterSplineJumpExtraData> JumpExtraData; public Optional<MonsterSplineJumpExtraData> JumpExtraData;
public Optional<MonsterSplineAnimTierTransition> AnimTierTransition;
public Optional<MonsterSplineUnknown901> Unknown901;
public float FaceDirection; public float FaceDirection;
public ObjectGuid FaceGUID; public ObjectGuid FaceGUID;
public Vector3 FaceSpot; public Vector3 FaceSpot;
+53 -19
View File
@@ -65,27 +65,17 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(options.Text.GetByteCount(), 12); _worldPacket.WriteBits(options.Text.GetByteCount(), 12);
_worldPacket.WriteBits(options.Confirm.GetByteCount(), 12); _worldPacket.WriteBits(options.Confirm.GetByteCount(), 12);
_worldPacket.WriteBits((byte)options.Status, 2);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
options.Treasure.Write(_worldPacket);
_worldPacket.WriteString(options.Text); _worldPacket.WriteString(options.Text);
_worldPacket.WriteString(options.Confirm); _worldPacket.WriteString(options.Confirm);
} }
foreach (ClientGossipText text in GossipText) foreach (ClientGossipText text in GossipText)
{ text.Write(_worldPacket);
_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);
}
} }
public List<ClientGossipOptions> GossipOptions = new List<ClientGossipOptions>(); public List<ClientGossipOptions> GossipOptions = new List<ClientGossipOptions>();
@@ -297,26 +287,68 @@ namespace Game.Networking.Packets
} }
//Structs //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 struct ClientGossipOptions
{ {
public int ClientOption; public int ClientOption;
public byte OptionNPC; public byte OptionNPC;
public byte OptionFlags; public byte OptionFlags;
public int OptionCost; public int OptionCost;
public GossipOptionStatus Status;
public string Text; public string Text;
public string Confirm; public string Confirm;
public TreasureLootList Treasure;
} }
public class ClientGossipText public class ClientGossipText
{ {
public int QuestID; public uint QuestID;
public int ContentTuningID;
public int QuestType; public int QuestType;
public int QuestLevel;
public int QuestMaxScalingLevel;
public bool Repeatable; public bool Repeatable;
public string QuestTitle; public string QuestTitle;
public int QuestFlags; public uint QuestFlags;
public int QuestFlagsEx; 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 public class VendorItemPkt
@@ -332,6 +364,7 @@ namespace Game.Networking.Packets
data.WriteInt32(ExtendedCostID); data.WriteInt32(ExtendedCostID);
data.WriteInt32(PlayerConditionFailed); data.WriteInt32(PlayerConditionFailed);
Item.Write(data); Item.Write(data);
data.WriteBit(Locked);
data.WriteBit(DoNotFilterOnVendor); data.WriteBit(DoNotFilterOnVendor);
data.WriteBit(Refundable); data.WriteBit(Refundable);
data.FlushBits(); data.FlushBits();
@@ -346,6 +379,7 @@ namespace Game.Networking.Packets
public int StackCount; public int StackCount;
public int ExtendedCostID; public int ExtendedCostID;
public int PlayerConditionFailed; public int PlayerConditionFailed;
public bool Locked;
public bool DoNotFilterOnVendor; public bool DoNotFilterOnVendor;
public bool Refundable; public bool Refundable;
} }
+28 -21
View File
@@ -85,9 +85,8 @@ namespace Game.Networking.Packets
ProposedRoles = proposedRoles; ProposedRoles = proposedRoles;
InviterVirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress(); var realm = Global.WorldMgr.GetRealm();
InviterRealmNameActual = Global.WorldMgr.GetRealm().Name; InviterRealm = new VirtualRealmInfo(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName);
InviterRealmNameNormalized = Global.WorldMgr.GetRealm().NormalizedName;
} }
public override void Write() public override void Write()
@@ -97,15 +96,10 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(IsXRealm); _worldPacket.WriteBit(IsXRealm);
_worldPacket.WriteBit(MustBeBNetFriend); _worldPacket.WriteBit(MustBeBNetFriend);
_worldPacket.WriteBit(AllowMultipleRoles); _worldPacket.WriteBit(AllowMultipleRoles);
_worldPacket.WriteBit(QuestSessionActive);
_worldPacket.WriteBits(InviterName.GetByteCount(), 6); _worldPacket.WriteBits(InviterName.GetByteCount(), 6);
_worldPacket.WriteUInt32(InviterVirtualRealmAddress); InviterRealm.Write(_worldPacket);
_worldPacket.WriteBit(IsLocal);
_worldPacket.WriteBit(Unk2);
_worldPacket.WriteBits(InviterRealmNameActual.GetByteCount(), 8);
_worldPacket.WriteBits(InviterRealmNameNormalized.GetByteCount(), 8);
_worldPacket.WriteString(InviterRealmNameActual);
_worldPacket.WriteString(InviterRealmNameNormalized);
_worldPacket.WritePackedGuid(InviterGUID); _worldPacket.WritePackedGuid(InviterGUID);
_worldPacket.WritePackedGuid(InviterBNetAccountId); _worldPacket.WritePackedGuid(InviterBNetAccountId);
@@ -123,22 +117,19 @@ namespace Game.Networking.Packets
public bool MightCRZYou; public bool MightCRZYou;
public bool MustBeBNetFriend; public bool MustBeBNetFriend;
public bool AllowMultipleRoles; public bool AllowMultipleRoles;
public bool Unk2; public bool QuestSessionActive;
public ushort Unk1; public ushort Unk1;
public bool CanAccept; public bool CanAccept;
// Inviter // Inviter
public VirtualRealmInfo InviterRealm;
public ObjectGuid InviterGUID; public ObjectGuid InviterGUID;
public ObjectGuid InviterBNetAccountId; public ObjectGuid InviterBNetAccountId;
public string InviterName; public string InviterName;
// Realm // Realm
public bool IsXRealm; public bool IsXRealm;
public bool IsLocal = true;
public uint InviterVirtualRealmAddress;
public string InviterRealmNameActual;
public string InviterRealmNameNormalized;
// Lfg // Lfg
public uint ProposedRoles; public uint ProposedRoles;
@@ -920,20 +911,20 @@ namespace Game.Networking.Packets
class PartyMemberAuraStates class PartyMemberAuraStates
{ {
public int SpellID;
public ushort Flags;
public uint ActiveFlags;
public List<float> Points = new List<float>();
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteInt32(SpellID); data.WriteInt32(SpellID);
data.WriteUInt8(Flags); data.WriteUInt16(Flags);
data.WriteUInt32(ActiveFlags); data.WriteUInt32(ActiveFlags);
data.WriteInt32(Points.Count); data.WriteInt32(Points.Count);
foreach (float points in Points) foreach (float points in Points)
data.WriteFloat(points); data.WriteFloat(points);
} }
public int SpellID;
public byte Flags;
public uint ActiveFlags;
public List<float> Points = new List<float>();
} }
class PartyMemberPetStats class PartyMemberPetStats
@@ -962,6 +953,20 @@ namespace Game.Networking.Packets
public List<PartyMemberAuraStates> Auras = new List<PartyMemberAuraStates>(); 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 class PartyMemberStats
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
@@ -988,6 +993,7 @@ namespace Game.Networking.Packets
data.WriteInt32(Auras.Count); data.WriteInt32(Auras.Count);
Phases.Write(data); Phases.Write(data);
ChromieTime.Write(data);
foreach (PartyMemberAuraStates aura in Auras) foreach (PartyMemberAuraStates aura in Auras)
aura.Write(data); aura.Write(data);
@@ -1025,6 +1031,7 @@ namespace Game.Networking.Packets
public ushort WmoGroupID; public ushort WmoGroupID;
public uint WmoDoodadPlacementID; public uint WmoDoodadPlacementID;
public sbyte[] PartyType = new sbyte[2]; public sbyte[] PartyType = new sbyte[2];
public CTROptions ChromieTime;
} }
struct PartyPlayerInfo struct PartyPlayerInfo
@@ -132,7 +132,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Stats.RequiredExpansion); _worldPacket.WriteUInt32(Stats.RequiredExpansion);
_worldPacket.WriteUInt32(Stats.VignetteID); _worldPacket.WriteUInt32(Stats.VignetteID);
_worldPacket.WriteInt32(Stats.Class); _worldPacket.WriteInt32(Stats.Class);
_worldPacket.WriteFloat(Stats.FadeRegionRadius);
_worldPacket.WriteInt32(Stats.WidgetSetID); _worldPacket.WriteInt32(Stats.WidgetSetID);
_worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID); _worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID);
@@ -722,7 +721,6 @@ namespace Game.Networking.Packets
public uint RequiredExpansion; public uint RequiredExpansion;
public uint VignetteID; public uint VignetteID;
public int Class; public int Class;
public float FadeRegionRadius;
public int WidgetSetID; public int WidgetSetID;
public int WidgetSetUnitConditionID; public int WidgetSetUnitConditionID;
public uint[] Flags = new uint[2]; public uint[] Flags = new uint[2];
+117 -101
View File
@@ -108,7 +108,6 @@ namespace Game.Networking.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32(QuestID); _worldPacket.WriteUInt32(QuestID);
_worldPacket.WriteBit(Allow); _worldPacket.WriteBit(Allow);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -116,11 +115,8 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteUInt32(Info.QuestID); _worldPacket.WriteUInt32(Info.QuestID);
_worldPacket.WriteInt32(Info.QuestType); _worldPacket.WriteInt32(Info.QuestType);
_worldPacket.WriteInt32(Info.QuestLevel);
_worldPacket.WriteInt32(Info.QuestScalingFactionGroup);
_worldPacket.WriteInt32(Info.QuestMaxScalingLevel);
_worldPacket.WriteUInt32(Info.QuestPackageID); _worldPacket.WriteUInt32(Info.QuestPackageID);
_worldPacket.WriteInt32(Info.QuestMinLevel); _worldPacket.WriteInt32(Info.ContentTuningID);
_worldPacket.WriteInt32(Info.QuestSortID); _worldPacket.WriteInt32(Info.QuestSortID);
_worldPacket.WriteUInt32(Info.QuestInfoID); _worldPacket.WriteUInt32(Info.QuestInfoID);
_worldPacket.WriteUInt32(Info.SuggestedGroupNum); _worldPacket.WriteUInt32(Info.SuggestedGroupNum);
@@ -131,10 +127,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(Info.RewardMoneyDifficulty); _worldPacket.WriteUInt32(Info.RewardMoneyDifficulty);
_worldPacket.WriteFloat(Info.RewardMoneyMultiplier); _worldPacket.WriteFloat(Info.RewardMoneyMultiplier);
_worldPacket.WriteUInt32(Info.RewardBonusMoney); _worldPacket.WriteUInt32(Info.RewardBonusMoney);
_worldPacket.WriteInt32(Info.RewardDisplaySpell.Count);
foreach (uint id in Info.RewardDisplaySpell)
_worldPacket.WriteUInt32(id);
_worldPacket.WriteUInt32(Info.RewardSpell); _worldPacket.WriteUInt32(Info.RewardSpell);
_worldPacket.WriteUInt32(Info.RewardHonor); _worldPacket.WriteUInt32(Info.RewardHonor);
_worldPacket.WriteFloat(Info.RewardKillHonor); _worldPacket.WriteFloat(Info.RewardKillHonor);
@@ -204,6 +197,9 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(Info.ManagedWorldStateID); _worldPacket.WriteInt32(Info.ManagedWorldStateID);
_worldPacket.WriteInt32(Info.QuestSessionBonus); _worldPacket.WriteInt32(Info.QuestSessionBonus);
foreach (QuestCompleteDisplaySpell rewardDisplaySpell in Info.RewardDisplaySpell)
rewardDisplaySpell.Write(_worldPacket);
_worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9); _worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9);
_worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12); _worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12);
_worldPacket.WriteBits(Info.QuestDescription.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.PortraitTurnInText.GetByteCount(), 10);
_worldPacket.WriteBits(Info.PortraitTurnInName.GetByteCount(), 8); _worldPacket.WriteBits(Info.PortraitTurnInName.GetByteCount(), 8);
_worldPacket.WriteBits(Info.QuestCompletionLog.GetByteCount(), 11); _worldPacket.WriteBits(Info.QuestCompletionLog.GetByteCount(), 11);
_worldPacket.WriteBit(Info.ReadyForTranslation);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
foreach (QuestObjective questObjective in Info.Objectives) foreach (QuestObjective questObjective in Info.Objectives)
@@ -358,7 +355,7 @@ namespace Game.Networking.Packets
public ObjectGuid QuestGiverGUID; public ObjectGuid QuestGiverGUID;
public uint QuestID; public uint QuestID;
public uint ItemChoiceID; public QuestChoiceItem Choice;
} }
public class QuestGiverQuestComplete : ServerPacket public class QuestGiverQuestComplete : ServerPacket
@@ -627,21 +624,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Greeting.GetByteCount(), 11); _worldPacket.WriteBits(Greeting.GetByteCount(), 11);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
foreach (GossipText gossip in QuestDataText) foreach (ClientGossipText gossip in QuestDataText)
{ gossip.Write(_worldPacket);
_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);
}
_worldPacket.WriteString(Greeting); _worldPacket.WriteString(Greeting);
} }
@@ -649,7 +633,7 @@ namespace Game.Networking.Packets
public ObjectGuid QuestGiverGUID; public ObjectGuid QuestGiverGUID;
public uint GreetEmoteDelay; public uint GreetEmoteDelay;
public uint GreetEmoteType; public uint GreetEmoteType;
public List<GossipText> QuestDataText = new List<GossipText>(); public List<ClientGossipText> QuestDataText = new List<ClientGossipText>();
public string Greeting = ""; public string Greeting = "";
} }
@@ -901,6 +885,18 @@ namespace Game.Networking.Packets
public uint DisplayID; 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 class QuestInfo
{ {
public QuestInfo() public QuestInfo()
@@ -918,11 +914,8 @@ namespace Game.Networking.Packets
public uint QuestID; public uint QuestID;
public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) 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 ContentTuningID;
public int QuestScalingFactionGroup;
public int QuestMaxScalingLevel = 255;
public uint QuestPackageID; public uint QuestPackageID;
public int QuestMinLevel;
public int QuestSortID; // zone or sort to display in quest log public int QuestSortID; // zone or sort to display in quest log
public uint QuestInfoID; public uint QuestInfoID;
public uint SuggestedGroupNum; public uint SuggestedGroupNum;
@@ -933,7 +926,7 @@ namespace Game.Networking.Packets
public uint RewardMoneyDifficulty; public uint RewardMoneyDifficulty;
public float RewardMoneyMultiplier = 1.0f; public float RewardMoneyMultiplier = 1.0f;
public uint RewardBonusMoney; 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 RewardSpell;
public uint RewardHonor; public uint RewardHonor;
public float RewardKillHonor; public float RewardKillHonor;
@@ -986,16 +979,59 @@ namespace Game.Networking.Packets
public int[] RewardFactionCapIn = new int[SharedConst.QuestRewardReputationsCount]; public int[] RewardFactionCapIn = new int[SharedConst.QuestRewardReputationsCount];
public uint[] RewardCurrencyID = new uint[SharedConst.QuestRewardCurrencyCount]; public uint[] RewardCurrencyID = new uint[SharedConst.QuestRewardCurrencyCount];
public uint[] RewardCurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount]; public uint[] RewardCurrencyQty = new uint[SharedConst.QuestRewardCurrencyCount];
public bool ReadyForTranslation;
} }
public struct QuestChoiceItem public struct QuestChoiceItem
{ {
public LootItemType LootItemType;
public ItemInstance Item; public ItemInstance Item;
public uint Quantity; 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 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) public void Write(WorldPacket data)
{ {
data.WriteUInt32(ChoiceItemCount); data.WriteUInt32(ChoiceItemCount);
@@ -1038,40 +1074,12 @@ namespace Game.Networking.Packets
data.WriteUInt32(NumSkillUps); data.WriteUInt32(NumSkillUps);
data.WriteUInt32(TreasurePickerID); data.WriteUInt32(TreasurePickerID);
for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) foreach (var choice in ChoiceItems)
{ choice.Write(data);
ChoiceItems[i].Item.Write(data);
data.WriteUInt32(ChoiceItems[i].Quantity);
}
data.WriteBit(IsBoostSpell); data.WriteBit(IsBoostSpell);
data.FlushBits(); 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 public struct QuestDescEmote
@@ -1105,6 +1113,7 @@ namespace Game.Networking.Packets
} }
data.WriteBit(AutoLaunched); data.WriteBit(AutoLaunched);
data.WriteBit(false); // Unused
data.FlushBits(); data.FlushBits();
Rewards.Write(data); Rewards.Write(data);
@@ -1154,30 +1163,6 @@ namespace Game.Networking.Packets
public int Amount; 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 struct WorldQuestUpdateInfo
{ {
public WorldQuestUpdateInfo(int lastUpdate, uint questID, uint timer, int variableID, int value) 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>(); public List<PlayerChoiceResponseRewardEntry> ItemChoices = new List<PlayerChoiceResponseRewardEntry>();
} }
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 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) public void Write(WorldPacket data)
{ {
data.WriteInt32(ResponseID); data.WriteInt32(ResponseID);
data.WriteUInt16(ResponseIdentifier);
data.WriteInt32(ChoiceArtFileID); data.WriteInt32(ChoiceArtFileID);
data.WriteInt32(Flags); data.WriteInt32(Flags);
data.WriteUInt32(WidgetSetID); data.WriteUInt32(WidgetSetID);
data.WriteUInt32(UiTextureAtlasElementID); data.WriteUInt32(UiTextureAtlasElementID);
data.WriteUInt32(SoundKitID); data.WriteUInt32(SoundKitID);
data.WriteUInt8(GroupID); data.WriteUInt8(GroupID);
data.WriteInt32(UiTextureKitID);
data.WriteBits(Answer.GetByteCount(), 9); data.WriteBits(Answer.GetByteCount(), 9);
data.WriteBits(Header.GetByteCount(), 9); data.WriteBits(Header.GetByteCount(), 9);
@@ -1276,6 +1304,7 @@ namespace Game.Networking.Packets
data.WriteBit(RewardQuestID.HasValue); data.WriteBit(RewardQuestID.HasValue);
data.WriteBit(Reward.HasValue); data.WriteBit(Reward.HasValue);
data.WriteBit(MawPower.HasValue);
data.FlushBits(); data.FlushBits();
if (Reward.HasValue) if (Reward.HasValue)
@@ -1290,22 +1319,9 @@ namespace Game.Networking.Packets
if (RewardQuestID.HasValue) if (RewardQuestID.HasValue)
data.WriteUInt32(RewardQuestID.Value); data.WriteUInt32(RewardQuestID.Value);
}
public int ResponseID; if (MawPower.HasValue)
public int ChoiceArtFileID; MawPower.Value.Write(data);
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;
} }
} }
@@ -22,7 +22,7 @@ namespace Game.Networking.Packets
{ {
public class InitializeFactions : ServerPacket public class InitializeFactions : ServerPacket
{ {
const ushort FactionCount = 350; const ushort FactionCount = 400;
public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { }
@@ -147,12 +147,14 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(scenarioPOI.Flags); _worldPacket.WriteInt32(scenarioPOI.Flags);
_worldPacket.WriteInt32(scenarioPOI.WorldEffectID); _worldPacket.WriteInt32(scenarioPOI.WorldEffectID);
_worldPacket.WriteInt32(scenarioPOI.PlayerConditionID); _worldPacket.WriteInt32(scenarioPOI.PlayerConditionID);
_worldPacket.WriteInt32(scenarioPOI.NavigationPlayerConditionID);
_worldPacket.WriteInt32(scenarioPOI.Points.Count); _worldPacket.WriteInt32(scenarioPOI.Points.Count);
foreach (var scenarioPOIBlobPoint in scenarioPOI.Points) foreach (var scenarioPOIBlobPoint in scenarioPOI.Points)
{ {
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.X); _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.X);
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Y); _worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Y);
_worldPacket.WriteInt32((int)scenarioPOIBlobPoint.Z);
} }
} }
} }
@@ -47,7 +47,8 @@ namespace Game.Networking.Packets
_worldPacket.WriteBits(Contacts.Count, 8); _worldPacket.WriteBits(Contacts.Count, 8);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
Contacts.ForEach(p => p.Write(_worldPacket)); foreach (ContactInfo contact in Contacts)
contact.Write(_worldPacket);
} }
public List<ContactInfo> Contacts; public List<ContactInfo> Contacts;
+124 -53
View File
@@ -332,6 +332,7 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WriteInt32(SpellID.Count); _worldPacket.WriteInt32(SpellID.Count);
_worldPacket.WriteInt32(FavoriteSpellID.Count); _worldPacket.WriteInt32(FavoriteSpellID.Count);
_worldPacket.WriteUInt32(SpecializationID);
foreach (uint spell in SpellID) foreach (uint spell in SpellID)
_worldPacket.WriteUInt32(spell); _worldPacket.WriteUInt32(spell);
@@ -345,6 +346,7 @@ namespace Game.Networking.Packets
public List<uint> SpellID = new List<uint>(); public List<uint> SpellID = new List<uint>();
public List<int> FavoriteSpellID = new List<int>(); public List<int> FavoriteSpellID = new List<int>();
public uint SpecializationID;
public bool SuppressMessaging; public bool SuppressMessaging;
} }
@@ -357,13 +359,15 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterUnit); _worldPacket.WritePackedGuid(CasterUnit);
_worldPacket.WritePackedGuid(CastID); _worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteUInt32(SpellID); _worldPacket.WriteUInt32(SpellID);
_worldPacket.WriteUInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt16(Reason); _worldPacket.WriteUInt16(Reason);
} }
public ObjectGuid CasterUnit; public ObjectGuid CasterUnit;
public uint SpellID; public uint SpellID;
public uint SpellXSpellVisualID; public SpellCastVisual Visual;
public ushort Reason; public ushort Reason;
public ObjectGuid CastID; public ObjectGuid CastID;
} }
@@ -377,49 +381,51 @@ namespace Game.Networking.Packets
_worldPacket.WritePackedGuid(CasterUnit); _worldPacket.WritePackedGuid(CasterUnit);
_worldPacket.WritePackedGuid(CastID); _worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteUInt32(SpellID); _worldPacket.WriteUInt32(SpellID);
_worldPacket.WriteUInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt16(Reason); _worldPacket.WriteUInt16(Reason);
} }
public ObjectGuid CasterUnit; public ObjectGuid CasterUnit;
public uint SpellID; public uint SpellID;
public uint SpellXSpellVisualID; public SpellCastVisual Visual;
public ushort Reason; public ushort Reason;
public ObjectGuid CastID; 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 ObjectGuid CastID;
public int SpellID; public int SpellID;
public SpellCastVisual Visual;
public SpellCastResult Reason; public SpellCastResult Reason;
public int FailedArg1 = -1; public int FailedArg1 = -1;
public int FailedArg2 = -1; public int FailedArg2 = -1;
}
class CastFailed : CastFailedBase
{
public CastFailed() : base(ServerOpcodes.CastFailed, ConnectionType.Instance) { } public CastFailed() : base(ServerOpcodes.CastFailed, ConnectionType.Instance) { }
public override void Write() public override void Write()
{ {
_worldPacket.WritePackedGuid(CastID); _worldPacket.WritePackedGuid(CastID);
_worldPacket.WriteInt32(SpellID); _worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteInt32((int)Reason); _worldPacket.WriteInt32((int)Reason);
_worldPacket.WriteInt32(FailedArg1); _worldPacket.WriteInt32(FailedArg1);
_worldPacket.WriteInt32(FailedArg2); _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 PetCastFailed() : base(ServerOpcodes.PetCastFailed, ConnectionType.Instance) { }
public override void Write() public override void Write()
@@ -673,10 +679,13 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(Source); _worldPacket.WritePackedGuid(Source);
_worldPacket.WriteUInt32(SpellVisualKitID); _worldPacket.WriteUInt32(SpellVisualKitID);
_worldPacket.WriteBit(MountedVisual);
_worldPacket.FlushBits();
} }
public ObjectGuid Source; public ObjectGuid Source;
public uint SpellVisualKitID; public uint SpellVisualKitID;
public bool MountedVisual;
} }
class PlayOrphanSpellVisual : ServerPacket class PlayOrphanSpellVisual : ServerPacket
@@ -753,12 +762,15 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(KitRecID); _worldPacket.WriteUInt32(KitRecID);
_worldPacket.WriteUInt32(KitType); _worldPacket.WriteUInt32(KitType);
_worldPacket.WriteUInt32(Duration); _worldPacket.WriteUInt32(Duration);
_worldPacket.WriteBit(MountedVisual);
_worldPacket.FlushBits();
} }
public ObjectGuid Unit; public ObjectGuid Unit;
public uint KitRecID; public uint KitRecID;
public uint KitType; public uint KitType;
public uint Duration; public uint Duration;
public bool MountedVisual;
} }
public class CancelCast : ClientPacket public class CancelCast : ClientPacket
@@ -797,7 +809,9 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(CasterGUID); _worldPacket.WritePackedGuid(CasterGUID);
_worldPacket.WriteInt32(SpellID); _worldPacket.WriteInt32(SpellID);
_worldPacket.WriteInt32(SpellXSpellVisualID);
Visual.Write(_worldPacket);
_worldPacket.WriteUInt32(ChannelDuration); _worldPacket.WriteUInt32(ChannelDuration);
_worldPacket.WriteBit(InterruptImmunities.HasValue); _worldPacket.WriteBit(InterruptImmunities.HasValue);
_worldPacket.WriteBit(HealPrediction.HasValue); _worldPacket.WriteBit(HealPrediction.HasValue);
@@ -811,7 +825,7 @@ namespace Game.Networking.Packets
} }
public int SpellID; public int SpellID;
public int SpellXSpellVisualID; public SpellCastVisual Visual;
public Optional<SpellChannelStartInterruptImmunities> InterruptImmunities; public Optional<SpellChannelStartInterruptImmunities> InterruptImmunities;
public ObjectGuid CasterGUID; public ObjectGuid CasterGUID;
public Optional<SpellTargetedHealPrediction> HealPrediction; public Optional<SpellTargetedHealPrediction> HealPrediction;
@@ -905,35 +919,28 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(UnitGUID); _worldPacket.WritePackedGuid(UnitGUID);
_worldPacket.WriteInt32(DisplayID); _worldPacket.WriteInt32(DisplayID);
_worldPacket.WriteInt32(SpellVisualKitID);
_worldPacket.WriteUInt8(RaceID); _worldPacket.WriteUInt8(RaceID);
_worldPacket.WriteUInt8(Gender); _worldPacket.WriteUInt8(Gender);
_worldPacket.WriteUInt8(ClassID); _worldPacket.WriteUInt8(ClassID);
_worldPacket.WriteUInt8(SkinColor); _worldPacket.WriteInt32(Customizations.Count);
_worldPacket.WriteUInt8(FaceVariation);
_worldPacket.WriteUInt8(HairVariation);
_worldPacket.WriteUInt8(HairColor);
_worldPacket.WriteUInt8(BeardVariation);
CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WritePackedGuid(GuildGUID); _worldPacket.WritePackedGuid(GuildGUID);
_worldPacket.WriteInt32(ItemDisplayID.Count); _worldPacket.WriteInt32(ItemDisplayID.Count);
foreach (ChrCustomizationChoice customization in Customizations)
customization.Write(_worldPacket);
foreach (var itemDisplayId in ItemDisplayID) foreach (var itemDisplayId in ItemDisplayID)
_worldPacket.WriteInt32(itemDisplayId); _worldPacket.WriteInt32(itemDisplayId);
} }
public ObjectGuid UnitGUID; public ObjectGuid UnitGUID;
public int DisplayID; public int DisplayID;
public int SpellVisualKitID;
public byte RaceID; public byte RaceID;
public byte Gender; public byte Gender;
public byte ClassID; public byte ClassID;
public byte SkinColor; public List<ChrCustomizationChoice> Customizations = new List<ChrCustomizationChoice>();
public byte FaceVariation;
public byte HairVariation;
public byte HairColor;
public byte BeardVariation;
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
public ObjectGuid GuildGUID; public ObjectGuid GuildGUID;
public List<int> ItemDisplayID = new List<int>(); public List<int> ItemDisplayID = new List<int>();
@@ -947,10 +954,12 @@ namespace Game.Networking.Packets
{ {
_worldPacket.WritePackedGuid(UnitGUID); _worldPacket.WritePackedGuid(UnitGUID);
_worldPacket.WriteInt32(DisplayID); _worldPacket.WriteInt32(DisplayID);
_worldPacket.WriteInt32(SpellVisualKitID);
} }
public ObjectGuid UnitGUID; public ObjectGuid UnitGUID;
public int DisplayID; public int DisplayID;
public int SpellVisualKitID;
} }
class SpellClick : ClientPacket class SpellClick : ClientPacket
@@ -1300,9 +1309,9 @@ namespace Game.Networking.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteFloat(PlayerItemLevel);
data.WriteFloat(TargetItemLevel);
data.WriteInt16(PlayerLevelDelta); data.WriteInt16(PlayerLevelDelta);
data.WriteUInt16(PlayerItemLevel);
data.WriteUInt16(TargetItemLevel);
data.WriteUInt16(ScalingHealthItemLevelCurveID); data.WriteUInt16(ScalingHealthItemLevelCurveID);
data.WriteUInt8(TargetLevel); data.WriteUInt8(TargetLevel);
data.WriteUInt8(Expansion); data.WriteUInt8(Expansion);
@@ -1316,8 +1325,8 @@ namespace Game.Networking.Packets
public ContentTuningType TuningType; public ContentTuningType TuningType;
public short PlayerLevelDelta; public short PlayerLevelDelta;
public ushort PlayerItemLevel; public float PlayerItemLevel;
public ushort TargetItemLevel; public float TargetItemLevel;
public ushort ScalingHealthItemLevelCurveID; public ushort ScalingHealthItemLevelCurveID;
public byte TargetLevel; public byte TargetLevel;
public byte Expansion; 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 class AuraDataInfo
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WritePackedGuid(CastID); data.WritePackedGuid(CastID);
data.WriteInt32(SpellID); data.WriteInt32(SpellID);
data.WriteInt32(SpellXSpellVisualID);
data.WriteUInt8((byte)Flags); Visual.Write(data);
data.WriteUInt16((ushort)Flags);
data.WriteUInt32(ActiveFlags); data.WriteUInt32(ActiveFlags);
data.WriteUInt16(CastLevel); data.WriteUInt16(CastLevel);
data.WriteUInt8(Applications); data.WriteUInt8(Applications);
@@ -1379,7 +1408,7 @@ namespace Game.Networking.Packets
public ObjectGuid CastID; public ObjectGuid CastID;
public int SpellID; public int SpellID;
public int SpellXSpellVisualID; public SpellCastVisual Visual;
public AuraFlags Flags; public AuraFlags Flags;
public uint ActiveFlags; public uint ActiveFlags;
public ushort CastLevel = 1; public ushort CastLevel = 1;
@@ -1519,17 +1548,68 @@ namespace Game.Networking.Packets
public uint Quantity; public uint Quantity;
} }
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 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) public void Read(WorldPacket data)
{ {
CastID = data.ReadPackedGuid(); CastID = data.ReadPackedGuid();
Misc[0] = data.ReadUInt32(); Misc[0] = data.ReadUInt32();
Misc[1] = data.ReadUInt32(); Misc[1] = data.ReadUInt32();
SpellID = data.ReadUInt32(); SpellID = data.ReadUInt32();
SpellXSpellVisualID = data.ReadUInt32();
Visual.Read(data);
MissileTrajectory.Read(data); MissileTrajectory.Read(data);
CraftingNPC = data.ReadPackedGuid(); 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); SendCastFlags = data.ReadBits<uint>(5);
MoveUpdate.HasValue = data.HasBit(); MoveUpdate.HasValue = data.HasBit();
var weightCount = data.ReadBits<uint>(2); var weightCount = data.ReadBits<uint>(2);
@@ -1548,17 +1628,6 @@ namespace Game.Networking.Packets
Weight.Add(weight); 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 public struct SpellHitStatus
@@ -1685,7 +1754,9 @@ namespace Game.Networking.Packets
data.WritePackedGuid(CastID); data.WritePackedGuid(CastID);
data.WritePackedGuid(OriginalCastID); data.WritePackedGuid(OriginalCastID);
data.WriteInt32(SpellID); data.WriteInt32(SpellID);
data.WriteUInt32(SpellXSpellVisualID);
Visual.Read(data);
data.WriteUInt32((uint)CastFlags); data.WriteUInt32((uint)CastFlags);
data.WriteUInt32((uint)CastFlagsEx); data.WriteUInt32((uint)CastFlagsEx);
data.WriteUInt32(CastTime); data.WriteUInt32(CastTime);
@@ -1736,7 +1807,7 @@ namespace Game.Networking.Packets
public ObjectGuid CastID; public ObjectGuid CastID;
public ObjectGuid OriginalCastID; public ObjectGuid OriginalCastID;
public int SpellID; public int SpellID;
public uint SpellXSpellVisualID; public SpellCastVisual Visual;
public SpellCastFlags CastFlags; public SpellCastFlags CastFlags;
public SpellCastFlagsEx CastFlagsEx; public SpellCastFlagsEx CastFlagsEx;
public uint CastTime; public uint CastTime;
+63 -35
View File
@@ -50,6 +50,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteUInt32(TwitterPostThrottleCooldown); _worldPacket.WriteUInt32(TwitterPostThrottleCooldown);
_worldPacket.WriteUInt32(TokenPollTimeSeconds); _worldPacket.WriteUInt32(TokenPollTimeSeconds);
_worldPacket.WriteUInt32(KioskSessionMinutes);
_worldPacket.WriteInt64(TokenBalanceAmount); _worldPacket.WriteInt64(TokenBalanceAmount);
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
@@ -71,7 +72,6 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(RestrictedAccount); _worldPacket.WriteBit(RestrictedAccount);
_worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(CommerceSystemEnabled);
_worldPacket.WriteBit(TutorialsEnabled); _worldPacket.WriteBit(TutorialsEnabled);
_worldPacket.WriteBit(NPETutorialsEnabled);
_worldPacket.WriteBit(TwitterEnabled); _worldPacket.WriteBit(TwitterEnabled);
_worldPacket.WriteBit(Unk67); _worldPacket.WriteBit(Unk67);
_worldPacket.WriteBit(WillKickFromWorld); _worldPacket.WriteBit(WillKickFromWorld);
@@ -88,6 +88,7 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(QuestSessionEnabled); _worldPacket.WriteBit(QuestSessionEnabled);
_worldPacket.WriteBit(IsMuted); _worldPacket.WriteBit(IsMuted);
_worldPacket.WriteBit(ClubFinderEnabled); _worldPacket.WriteBit(ClubFinderEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
{ {
@@ -123,22 +124,12 @@ namespace Game.Networking.Packets
_worldPacket.WriteInt32(SessionAlert.Value.DisplayTime); _worldPacket.WriteInt32(SessionAlert.Value.DisplayTime);
} }
_worldPacket.WriteBit(VoiceChatManagerSettings.IsSquelched); _worldPacket.WriteBit(Squelch.IsSquelched);
_worldPacket.WritePackedGuid(VoiceChatManagerSettings.BnetAccountGuid); _worldPacket.WritePackedGuid(Squelch.BnetAccountGuid);
_worldPacket.WritePackedGuid(VoiceChatManagerSettings.GuildGuid); _worldPacket.WritePackedGuid(Squelch.GuildGuid);
if (EuropaTicketSystemStatus.HasValue) if (EuropaTicketSystemStatus.HasValue)
{ EuropaTicketSystemStatus.Value.Write(_worldPacket);
_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);
}
} }
public bool VoiceEnabled; public bool VoiceEnabled;
@@ -160,6 +151,7 @@ namespace Game.Networking.Packets
public uint BpayStoreProductDeliveryDelay; public uint BpayStoreProductDeliveryDelay;
public uint ClubsPresenceUpdateTimer; public uint ClubsPresenceUpdateTimer;
public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden
public uint KioskSessionMinutes;
public bool ItemRestorationButtonEnabled; public bool ItemRestorationButtonEnabled;
public bool CharUndeleteEnabled; // Implemented public bool CharUndeleteEnabled; // Implemented
public bool BpayStoreDisabledByParentalControls; public bool BpayStoreDisabledByParentalControls;
@@ -183,29 +175,12 @@ namespace Game.Networking.Packets
public bool QuestSessionEnabled; public bool QuestSessionEnabled;
public bool IsMuted; public bool IsMuted;
public bool ClubFinderEnabled; public bool ClubFinderEnabled;
public bool Unknown901CheckoutRelated;
public SocialQueueConfig QuickJoinConfig; public SocialQueueConfig QuickJoinConfig;
public VoiceChatProxySettings VoiceChatManagerSettings; public SquelchInfo Squelch;
public RafSystemFeatureInfo RAFSystem; 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 struct SessionAlertConfig
{ {
public int Delay; public int Delay;
@@ -240,7 +215,7 @@ namespace Game.Networking.Packets
public float ThrottleDfBestPriority; public float ThrottleDfBestPriority;
} }
public struct VoiceChatProxySettings public struct SquelchInfo
{ {
public bool IsSquelched; public bool IsSquelched;
public ObjectGuid BnetAccountGuid; public ObjectGuid BnetAccountGuid;
@@ -279,16 +254,28 @@ namespace Game.Networking.Packets
_worldPacket.WriteBit(LiveRegionCharacterListEnabled); _worldPacket.WriteBit(LiveRegionCharacterListEnabled);
_worldPacket.WriteBit(LiveRegionCharacterCopyEnabled); _worldPacket.WriteBit(LiveRegionCharacterCopyEnabled);
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled); _worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
_worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (EuropaTicketSystemStatus.HasValue)
EuropaTicketSystemStatus.Value.Write(_worldPacket);
_worldPacket.WriteUInt32(TokenPollTimeSeconds); _worldPacket.WriteUInt32(TokenPollTimeSeconds);
_worldPacket.WriteUInt32(KioskSessionMinutes);
_worldPacket.WriteInt64(TokenBalanceAmount); _worldPacket.WriteInt64(TokenBalanceAmount);
_worldPacket.WriteInt32(MaxCharactersPerRealm); _worldPacket.WriteInt32(MaxCharactersPerRealm);
_worldPacket.WriteInt32(LiveRegionCharacterCopySourceRegions.Count);
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
_worldPacket.WriteInt32(ActiveCharacterUpgradeBoostType); _worldPacket.WriteInt32(ActiveCharacterUpgradeBoostType);
_worldPacket.WriteInt32(ActiveClassTrialBoostType); _worldPacket.WriteInt32(ActiveClassTrialBoostType);
_worldPacket.WriteInt32(MinimumExpansionLevel); _worldPacket.WriteInt32(MinimumExpansionLevel);
_worldPacket.WriteInt32(MaximumExpansionLevel); _worldPacket.WriteInt32(MaximumExpansionLevel);
foreach (var sourceRegion in LiveRegionCharacterCopySourceRegions)
_worldPacket.WriteInt32(sourceRegion);
} }
public bool BpayStoreAvailable; // NYI public bool BpayStoreAvailable; // NYI
@@ -306,6 +293,10 @@ namespace Game.Networking.Packets
public bool LiveRegionCharacterListEnabled; // NYI public bool LiveRegionCharacterListEnabled; // NYI
public bool LiveRegionCharacterCopyEnabled; // NYI public bool LiveRegionCharacterCopyEnabled; // NYI
public bool LiveRegionAccountCopyEnabled; // 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 uint TokenPollTimeSeconds; // NYI
public long TokenBalanceAmount; // NYI public long TokenBalanceAmount; // NYI
public int MaxCharactersPerRealm; public int MaxCharactersPerRealm;
@@ -314,6 +305,7 @@ namespace Game.Networking.Packets
public int ActiveClassTrialBoostType; // NYI public int ActiveClassTrialBoostType; // NYI
public int MinimumExpansionLevel; public int MinimumExpansionLevel;
public int MaximumExpansionLevel; public int MaximumExpansionLevel;
public uint KioskSessionMinutes;
} }
public class MOTD : ServerPacket public class MOTD : ServerPacket
@@ -351,4 +343,40 @@ namespace Game.Networking.Packets
public string ServerTimeTZ; public string ServerTimeTZ;
public string GameTimeTZ; 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; int CaseID;
} }
public class SupportTicketSubmitBug : ClientPacket public class SubmitUserFeedback : ClientPacket
{ {
public SupportTicketHeader Header; public SupportTicketHeader Header;
public string Note; public string Note;
public bool IsSuggestion;
public SupportTicketSubmitBug(WorldPacket packet) : base(packet) { } public SubmitUserFeedback(WorldPacket packet) : base(packet) { }
public override void Read() public override void Read()
{ {
Header.Read(_worldPacket); Header.Read(_worldPacket);
Note = _worldPacket.ReadString(_worldPacket.ReadBits<uint>(10)); uint noteLength = _worldPacket.ReadBits<uint>(24);
} IsSuggestion = _worldPacket.HasBit();
}
public class SupportTicketSubmitSuggestion : ClientPacket if (noteLength != 0)
{ Note = _worldPacket.ReadString(noteLength - 1);
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));
} }
} }
@@ -91,10 +91,12 @@ namespace Game.Networking.Packets
ItemModifiedAppearanceID = data.ReadInt32(); ItemModifiedAppearanceID = data.ReadInt32();
Slot = data.ReadUInt32(); Slot = data.ReadUInt32();
SpellItemEnchantmentID = data.ReadInt32(); SpellItemEnchantmentID = data.ReadInt32();
SecondaryItemModifiedAppearanceID = data.ReadInt32();
} }
public int ItemModifiedAppearanceID; public int ItemModifiedAppearanceID;
public uint Slot; public uint Slot;
public int SpellItemEnchantmentID; public int SpellItemEnchantmentID;
public int SecondaryItemModifiedAppearanceID;
} }
} }
+10 -9
View File
@@ -242,6 +242,16 @@ namespace Game.Scenarios
public class ScenarioPOI public class ScenarioPOI
{ {
public int BlobIndex;
public int MapID;
public int UiMapID;
public int Priority;
public int Flags;
public int WorldEffectID;
public int PlayerConditionID;
public int NavigationPlayerConditionID;
public List<Vector2> Points = new List<Vector2>();
public ScenarioPOI(int blobIndex, int mapID, int uiMapID, int priority, int flags, int worldEffectID, int playerConditionID, List<Vector2> points) public ScenarioPOI(int blobIndex, int mapID, int uiMapID, int priority, int flags, int worldEffectID, int playerConditionID, List<Vector2> points)
{ {
BlobIndex = blobIndex; BlobIndex = blobIndex;
@@ -253,14 +263,5 @@ namespace Game.Scenarios
PlayerConditionID = playerConditionID; PlayerConditionID = playerConditionID;
Points = points; Points = points;
} }
public int BlobIndex;
public int MapID;
public int UiMapID;
public int Priority;
public int Flags;
public int WorldEffectID;
public int PlayerConditionID;
public List<Vector2> Points = new List<Vector2>();
} }
} }
+3 -1
View File
@@ -33,6 +33,7 @@ namespace Game.Spells
Unit, Unit,
DynObj DynObj
} }
public enum AuraRemoveMode public enum AuraRemoveMode
{ {
None = 0, None = 0,
@@ -43,6 +44,7 @@ namespace Game.Spells
Expire, // aura duration has ended Expire, // aura duration has ended
Death Death
} }
public enum AuraFlags public enum AuraFlags
{ {
None = 0x00, None = 0x00,
@@ -211,7 +213,7 @@ namespace Game.Spells
AuraDataInfo auraData = auraInfo.AuraData.Value; AuraDataInfo auraData = auraInfo.AuraData.Value;
auraData.CastID = aura.GetCastGUID(); auraData.CastID = aura.GetCastGUID();
auraData.SpellID = (int)aura.GetId(); auraData.SpellID = (int)aura.GetId();
auraData.SpellXSpellVisualID = (int)aura.GetSpellXSpellVisualId(); auraData.Visual.SpellXSpellVisualID = (int)aura.GetSpellXSpellVisualId();
auraData.Flags = GetFlags(); auraData.Flags = GetFlags();
if (aura.GetMaxDuration() > 0 && !aura.GetSpellInfo().HasAttribute(SpellAttr5.HideDuration)) if (aura.GetMaxDuration() > 0 && !aura.GetSpellInfo().HasAttribute(SpellAttr5.HideDuration))
auraData.Flags |= AuraFlags.Duration; auraData.Flags |= AuraFlags.Duration;
+7 -6
View File
@@ -3525,7 +3525,7 @@ namespace Game.Spells
result = SpellCastResult.DontReport; result = SpellCastResult.DontReport;
CastFailed castFailed = new CastFailed(); CastFailed castFailed = new CastFailed();
castFailed.SpellXSpellVisualID = (int)m_SpellVisual; castFailed.Visual.SpellXSpellVisualID = (int)m_SpellVisual;
FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2, m_caster.ToPlayer()); FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2, m_caster.ToPlayer());
m_caster.ToPlayer().SendPacket(castFailed); m_caster.ToPlayer().SendPacket(castFailed);
} }
@@ -3553,7 +3553,7 @@ namespace Game.Spells
return; return;
CastFailed packet = new CastFailed(); CastFailed packet = new CastFailed();
packet.SpellXSpellVisualID = (int)spellVisual; packet.Visual.SpellXSpellVisualID = (int)spellVisual;
FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2, caster); FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2, caster);
caster.SendPacket(packet); caster.SendPacket(packet);
} }
@@ -3610,7 +3610,7 @@ namespace Game.Spells
castData.CastID = m_castId; castData.CastID = m_castId;
castData.OriginalCastID = m_originalCastId; castData.OriginalCastID = m_originalCastId;
castData.SpellID = (int)m_spellInfo.Id; castData.SpellID = (int)m_spellInfo.Id;
castData.SpellXSpellVisualID = m_SpellVisual; castData.Visual.SpellXSpellVisualID = m_SpellVisual;
castData.CastFlags = castFlags; castData.CastFlags = castFlags;
castData.CastFlagsEx = m_castFlagsEx; castData.CastFlagsEx = m_castFlagsEx;
castData.CastTime = (uint)m_casttime; castData.CastTime = (uint)m_casttime;
@@ -3724,7 +3724,7 @@ namespace Game.Spells
castData.CastID = m_castId; castData.CastID = m_castId;
castData.OriginalCastID = m_originalCastId; castData.OriginalCastID = m_originalCastId;
castData.SpellID = (int)m_spellInfo.Id; castData.SpellID = (int)m_spellInfo.Id;
castData.SpellXSpellVisualID = m_SpellVisual; castData.Visual.SpellXSpellVisualID = m_SpellVisual;
castData.CastFlags = castFlags; castData.CastFlags = castFlags;
castData.CastFlagsEx = m_castFlagsEx; castData.CastFlagsEx = m_castFlagsEx;
castData.CastTime = Time.GetMSTime(); castData.CastTime = Time.GetMSTime();
@@ -4019,7 +4019,7 @@ namespace Game.Spells
failurePacket.CasterUnit = m_caster.GetGUID(); failurePacket.CasterUnit = m_caster.GetGUID();
failurePacket.CastID = m_castId; failurePacket.CastID = m_castId;
failurePacket.SpellID = m_spellInfo.Id; failurePacket.SpellID = m_spellInfo.Id;
failurePacket.SpellXSpellVisualID = m_SpellVisual; failurePacket.Visual.SpellXSpellVisualID = m_SpellVisual;
failurePacket.Reason = result; failurePacket.Reason = result;
m_caster.SendMessageToSet(failurePacket, true); m_caster.SendMessageToSet(failurePacket, true);
@@ -4027,6 +4027,7 @@ namespace Game.Spells
failedPacket.CasterUnit = m_caster.GetGUID(); failedPacket.CasterUnit = m_caster.GetGUID();
failedPacket.CastID = m_castId; failedPacket.CastID = m_castId;
failedPacket.SpellID = m_spellInfo.Id; failedPacket.SpellID = m_spellInfo.Id;
failedPacket.Visual.SpellXSpellVisualID = m_SpellVisual;
failedPacket.Reason = result; failedPacket.Reason = result;
m_caster.SendMessageToSet(failedPacket, true); m_caster.SendMessageToSet(failedPacket, true);
} }
@@ -4051,7 +4052,7 @@ namespace Game.Spells
SpellChannelStart spellChannelStart = new SpellChannelStart(); SpellChannelStart spellChannelStart = new SpellChannelStart();
spellChannelStart.CasterGUID = m_caster.GetGUID(); spellChannelStart.CasterGUID = m_caster.GetGUID();
spellChannelStart.SpellID = (int)m_spellInfo.Id; spellChannelStart.SpellID = (int)m_spellInfo.Id;
spellChannelStart.SpellXSpellVisualID = (int)m_SpellVisual; spellChannelStart.Visual.SpellXSpellVisualID = m_SpellVisual;
spellChannelStart.ChannelDuration = duration; spellChannelStart.ChannelDuration = duration;
uint schoolImmunityMask = m_caster.GetSchoolImmunityMask(); uint schoolImmunityMask = m_caster.GetSchoolImmunityMask();