/* * Copyright (C) 2012-2020 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 . */ using Framework.Constants; using Framework.Dynamic; using Framework.GameMath; using Game.Entities; using System; using System.Collections.Generic; namespace Game.Networking.Packets { public class GMTicketGetSystemStatus : ClientPacket { public GMTicketGetSystemStatus(WorldPacket packet) : base(packet) { } public override void Read() { } } public class GMTicketSystemStatusPkt : ServerPacket { public GMTicketSystemStatusPkt() : base(ServerOpcodes.GmTicketSystemStatus) { } public override void Write() { _worldPacket.WriteInt32(Status); } public int Status; } public class GMTicketGetCaseStatus : ClientPacket { public GMTicketGetCaseStatus(WorldPacket packet) : base(packet) { } public override void Read() { } } public class GMTicketCaseStatus : ServerPacket { public GMTicketCaseStatus() : base(ServerOpcodes.GmTicketCaseStatus) { } public override void Write() { _worldPacket.WriteInt32(Cases.Count); foreach (var c in Cases) { _worldPacket.WriteInt32(c.CaseID); _worldPacket.WriteInt64(c.CaseOpened); _worldPacket.WriteInt32(c.CaseStatus); _worldPacket.WriteUInt16(c.CfgRealmID); _worldPacket.WriteUInt64(c.CharacterID); _worldPacket.WriteInt32(c.WaitTimeOverrideMinutes); _worldPacket.WriteBits(c.Url.GetByteCount(), 11); _worldPacket.WriteBits(c.WaitTimeOverrideMessage.GetByteCount(), 10); _worldPacket.WriteString(c.Url); _worldPacket.WriteString(c.WaitTimeOverrideMessage); } } public List Cases = new(); public struct GMTicketCase { public int CaseID; public long CaseOpened; public int CaseStatus; public ushort CfgRealmID; public ulong CharacterID; public int WaitTimeOverrideMinutes; public string Url; public string WaitTimeOverrideMessage; } } public class GMTicketAcknowledgeSurvey : ClientPacket { public GMTicketAcknowledgeSurvey(WorldPacket packet) : base(packet) { } public override void Read() { CaseID = _worldPacket.ReadInt32(); } int CaseID; } public class SubmitUserFeedback : ClientPacket { public SupportTicketHeader Header; public string Note; public bool IsSuggestion; public SubmitUserFeedback(WorldPacket packet) : base(packet) { } public override void Read() { Header.Read(_worldPacket); uint noteLength = _worldPacket.ReadBits(24); IsSuggestion = _worldPacket.HasBit(); if (noteLength != 0) Note = _worldPacket.ReadString(noteLength - 1); } } public class SupportTicketSubmitComplaint : ClientPacket { public SupportTicketSubmitComplaint(WorldPacket packet) : base(packet) { } public override void Read() { Header.Read(_worldPacket); TargetCharacterGUID = _worldPacket.ReadPackedGuid(); ChatLog.Read(_worldPacket); ComplaintType = _worldPacket.ReadBits(5); uint noteLength = _worldPacket.ReadBits(10); bool hasMailInfo = _worldPacket.HasBit(); bool hasCalendarInfo = _worldPacket.HasBit(); bool hasPetInfo = _worldPacket.HasBit(); bool hasGuildInfo = _worldPacket.HasBit(); bool hasLFGListSearchResult = _worldPacket.HasBit(); bool hasLFGListApplicant = _worldPacket.HasBit(); bool hasClubMessage = _worldPacket.HasBit(); bool hasClubFinderResult = _worldPacket.HasBit(); bool hasUnk910 = _worldPacket.HasBit(); _worldPacket.ResetBitPos(); if (hasClubMessage) { CommunityMessage.HasValue = true; CommunityMessage.Value.IsPlayerUsingVoice = _worldPacket.HasBit(); _worldPacket.ResetBitPos(); } HorusChatLog.Read(_worldPacket); Note = _worldPacket.ReadString(noteLength); if (hasMailInfo) { MailInfo.HasValue = true; MailInfo.Value.Read(_worldPacket); } if (hasCalendarInfo) { CalenderInfo.HasValue = true; CalenderInfo.Value.Read(_worldPacket); } if (hasPetInfo) { PetInfo.HasValue = true; PetInfo.Value.Read(_worldPacket); } if (hasGuildInfo) { GuildInfo.HasValue = true; GuildInfo.Value.Read(_worldPacket); } if (hasLFGListSearchResult) { LFGListSearchResult.HasValue = true; LFGListSearchResult.Value.Read(_worldPacket); } if (hasLFGListApplicant) { LFGListApplicant.HasValue = true; LFGListApplicant.Value.Read(_worldPacket); } if (hasClubFinderResult) { ClubFinderResult.HasValue = true; ClubFinderResult.Value.Read(_worldPacket); } if (hasUnk910) { Unused910.HasValue = true; Unused910.Value.Read(_worldPacket); } } public SupportTicketHeader Header; public SupportTicketChatLog ChatLog; public ObjectGuid TargetCharacterGUID; public byte ComplaintType; public string Note; public SupportTicketHorusChatLog HorusChatLog; public Optional MailInfo; public Optional CalenderInfo; public Optional PetInfo; public Optional GuildInfo; public Optional LFGListSearchResult; public Optional LFGListApplicant; public Optional CommunityMessage; public Optional ClubFinderResult; public Optional Unused910; public struct SupportTicketChatLine { public long Timestamp; public string Text; public SupportTicketChatLine(WorldPacket data) { Timestamp = data.ReadInt64(); Text = data.ReadString(data.ReadBits(12)); } public SupportTicketChatLine(long timestamp, string text) { Timestamp = timestamp; Text = text; } public void Read(WorldPacket data) { Timestamp = data.ReadUInt32(); Text = data.ReadString(data.ReadBits(12)); } } public class SupportTicketChatLog { public void Read(WorldPacket data) { uint linesCount = data.ReadUInt32(); ReportLineIndex.HasValue = data.HasBit(); data.ResetBitPos(); for (uint i = 0; i < linesCount; i++) Lines.Add(new SupportTicketChatLine(data)); if (ReportLineIndex.HasValue) ReportLineIndex.Value = data.ReadUInt32(); } public List Lines = new(); public Optional ReportLineIndex; } public struct SupportTicketHorusChatLine { public void Read(WorldPacket data) { Timestamp = data.ReadInt64(); AuthorGUID = data.ReadPackedGuid(); bool hasClubID = data.HasBit(); bool hasChannelGUID = data.HasBit(); bool hasRealmAddress = data.HasBit(); bool hasSlashCmd = data.HasBit(); uint textLength = data.ReadBits(12); if (hasClubID) { ClubID.HasValue = true; ClubID.Value = data.ReadUInt64(); } if (hasChannelGUID) { ChannelGUID.HasValue = true; ChannelGUID.Value = data.ReadPackedGuid(); } if (hasRealmAddress) { RealmAddress.HasValue = true; RealmAddress.Value.VirtualRealmAddress = data.ReadUInt32(); RealmAddress.Value.field_4 = data.ReadUInt16(); RealmAddress.Value.field_6 = data.ReadUInt8(); } if (hasSlashCmd) { SlashCmd.HasValue = true; SlashCmd.Value = data.ReadInt32(); } Text = data.ReadString(textLength); } public struct SenderRealm { public uint VirtualRealmAddress; public ushort field_4; public byte field_6; } public long Timestamp; public ObjectGuid AuthorGUID; public Optional ClubID; public Optional ChannelGUID; public Optional RealmAddress; public Optional SlashCmd; public string Text; } public class SupportTicketHorusChatLog { public List Lines = new(); public void Read(WorldPacket data) { uint linesCount = data.ReadUInt32(); data.ResetBitPos(); for (uint i = 0; i < linesCount; i++) { var chatLine = new SupportTicketHorusChatLine(); chatLine.Read(data); Lines.Add(chatLine); } } } public struct SupportTicketMailInfo { public void Read(WorldPacket data) { MailID = data.ReadInt32(); uint bodyLength = data.ReadBits(13); uint subjectLength = data.ReadBits(9); MailBody = data.ReadString(bodyLength); MailSubject = data.ReadString(subjectLength); } public int MailID; public string MailSubject; public string MailBody; } public struct SupportTicketCalendarEventInfo { public void Read(WorldPacket data) { EventID = data.ReadUInt64(); InviteID = data.ReadUInt64(); EventTitle = data.ReadString(data.ReadBits(8)); } public ulong EventID; public ulong InviteID; public string EventTitle; } public struct SupportTicketPetInfo { public void Read(WorldPacket data) { PetID = data.ReadPackedGuid(); PetName = data.ReadString(data.ReadBits(8)); } public ObjectGuid PetID; public string PetName; } public struct SupportTicketGuildInfo { public void Read(WorldPacket data) { byte nameLength = data.ReadBits(8); GuildID = data.ReadPackedGuid(); GuildName = data.ReadString(nameLength); } public ObjectGuid GuildID; public string GuildName; } public struct SupportTicketLFGListSearchResult { public void Read(WorldPacket data) { RideTicket = new RideTicket(); RideTicket.Read(data); GroupFinderActivityID = data.ReadUInt32(); LastTitleAuthorGuid = data.ReadPackedGuid(); LastDescriptionAuthorGuid = data.ReadPackedGuid(); LastVoiceChatAuthorGuid = data.ReadPackedGuid(); ListingCreatorGuid = data.ReadPackedGuid(); Unknown735 = data.ReadPackedGuid(); byte titleLength = data.ReadBits(10); byte descriptionLength = data.ReadBits(11); byte voiceChatLength = data.ReadBits(8); Title = data.ReadString(titleLength); Description = data.ReadString(descriptionLength); VoiceChat = data.ReadString(voiceChatLength); } public RideTicket RideTicket; public uint GroupFinderActivityID; public ObjectGuid LastTitleAuthorGuid; public ObjectGuid LastDescriptionAuthorGuid; public ObjectGuid LastVoiceChatAuthorGuid; public ObjectGuid ListingCreatorGuid; public ObjectGuid Unknown735; public string Title; public string Description; public string VoiceChat; } public struct SupportTicketLFGListApplicant { public void Read(WorldPacket data) { RideTicket = new RideTicket(); RideTicket.Read(data); Comment = data.ReadString(data.ReadBits(9)); } public RideTicket RideTicket; public string Comment; } public struct SupportTicketCommunityMessage { public bool IsPlayerUsingVoice; } public struct SupportTicketClubFinderResult { public ulong ClubFinderPostingID; public ulong ClubID; public ObjectGuid ClubFinderGUID; public string ClubName; public void Read(WorldPacket data) { ClubFinderPostingID = data.ReadUInt64(); ClubID = data.ReadUInt64(); ClubFinderGUID = data.ReadPackedGuid(); ClubName = data.ReadString(data.ReadBits(12)); } } public struct SupportTicketUnused910 { public string field_0; public ObjectGuid field_104; public void Read(WorldPacket data) { uint field_0Length = data.ReadBits(7); field_104 = data.ReadPackedGuid(); field_0 = data.ReadString(field_0Length); } } } class Complaint : ClientPacket { public Complaint(WorldPacket packet) : base(packet) { } public override void Read() { ComplaintType = (SupportSpamType)_worldPacket.ReadUInt8(); Offender.Read(_worldPacket); switch (ComplaintType) { case SupportSpamType.Mail: MailID = _worldPacket.ReadUInt32(); break; case SupportSpamType.Chat: Chat.Read(_worldPacket); break; case SupportSpamType.Calendar: EventGuid = _worldPacket.ReadUInt64(); InviteGuid = _worldPacket.ReadUInt64(); break; } } public SupportSpamType ComplaintType; ComplaintOffender Offender; uint MailID; ComplaintChat Chat; ulong EventGuid; ulong InviteGuid; struct ComplaintOffender { public void Read(WorldPacket data) { PlayerGuid = data.ReadPackedGuid(); RealmAddress = data.ReadUInt32(); TimeSinceOffence = data.ReadUInt32(); } public ObjectGuid PlayerGuid; public uint RealmAddress; public uint TimeSinceOffence; } struct ComplaintChat { public void Read(WorldPacket data) { Command = data.ReadUInt32(); ChannelID = data.ReadUInt32(); MessageLog = data.ReadString(data.ReadBits(12)); } public uint Command; public uint ChannelID; public string MessageLog; } } public class ComplaintResult : ServerPacket { public ComplaintResult() : base(ServerOpcodes.ComplaintResult) { } public override void Write() { _worldPacket.WriteUInt32((uint)ComplaintType); _worldPacket.WriteUInt8(Result); } public SupportSpamType ComplaintType; public byte Result; } class BugReport : ClientPacket { public BugReport(WorldPacket packet) : base(packet) { } public override void Read() { Type = _worldPacket.ReadBit(); uint diagLen = _worldPacket.ReadBits(12); uint textLen = _worldPacket.ReadBits(10); DiagInfo = _worldPacket.ReadString(diagLen); Text = _worldPacket.ReadString(textLen); } public uint Type; public string Text; public string DiagInfo; } //Structs public struct SupportTicketHeader { public void Read(WorldPacket packet) { MapID = packet.ReadUInt32(); Position = packet.ReadVector3(); Facing = packet.ReadFloat(); } public uint MapID; public Vector3 Position; public float Facing; } }