diff --git a/Source/Framework/Constants/Network/Opcodes.cs b/Source/Framework/Constants/Network/Opcodes.cs index eb7c8aea8..6a0abe950 100644 --- a/Source/Framework/Constants/Network/Opcodes.cs +++ b/Source/Framework/Constants/Network/Opcodes.cs @@ -1803,7 +1803,6 @@ namespace Framework.Constants // Opcodes that are not generated automatically AccountHeirloomUpdate = 0xBADD, // No Client Handler - ItemUpgradeResult = 0xBADD, // No Client Handler CompressedPacket = 0x3052, MultiplePackets = 0x3051, diff --git a/Source/Framework/Constants/PetConst.cs b/Source/Framework/Constants/PetConst.cs index 4b6753fd8..153ed9a30 100644 --- a/Source/Framework/Constants/PetConst.cs +++ b/Source/Framework/Constants/PetConst.cs @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - */ + */ namespace Framework.Constants { @@ -63,12 +63,13 @@ namespace Framework.Constants Talent = 2 } - public enum ActionFeedback + public enum PetActionFeedback { None = 0, - PetDead = 1, - NothingToAtt = 2, - CantAttTarget = 3 + Dead = 1, + NoTarget = 2, + InvalidTarget = 3, + NoPath = 4 } public enum PetTalk @@ -111,4 +112,15 @@ namespace Framework.Constants Active = 1, Inactive = 2 } + + public enum StableResult + { + NotEnoughMoney = 1, // "you don't have enough money" + InvalidSlot = 3, // "That slot is locked" + StableSuccess = 8, // stable success + UnstableSuccess = 9, // unstable/swap success + BuySlotSuccess = 10, // buy slot success + CantControlExotic = 11, // "you are unable to control exotic creatures" + InternalError = 12, // "Internal pet error" + } } diff --git a/Source/Game/Entities/Unit/Unit.Pets.cs b/Source/Game/Entities/Unit/Unit.Pets.cs index 14c1cc9c3..df43c44ce 100644 --- a/Source/Game/Entities/Unit/Unit.Pets.cs +++ b/Source/Game/Entities/Unit/Unit.Pets.cs @@ -21,6 +21,7 @@ using Game.Networking.Packets; using Game.Spells; using System.Collections.Generic; using System.Linq; +using Framework.Constants; namespace Game.Entities { @@ -691,13 +692,13 @@ namespace Game.Entities Log.outFatal(LogFilter.Unit, "Unit {0} is not able to release its charm {1}", GetEntry(), GetCharmGUID()); } - public void SendPetActionFeedback(uint spellId, ActionFeedback msg) + public void SendPetActionFeedback(PetActionFeedback msg, uint spellId) { Unit owner = GetOwner(); if (!owner || !owner.IsTypeId(TypeId.Player)) return; - PetActionFeedback petActionFeedback = new PetActionFeedback(); + PetActionFeedbackPacket petActionFeedback = new PetActionFeedbackPacket(); petActionFeedback.SpellID = spellId; petActionFeedback.Response = msg; owner.ToPlayer().SendPacket(petActionFeedback); diff --git a/Source/Game/Groups/Group.cs b/Source/Game/Groups/Group.cs index edada124f..37bdf9a5d 100644 --- a/Source/Game/Groups/Group.cs +++ b/Source/Game/Groups/Group.cs @@ -1050,8 +1050,8 @@ namespace Game.Groups public void MasterLoot(Loot loot, WorldObject pLootedObject) { - MasterLootCandidateList data = new MasterLootCandidateList(); - data.LootObj = loot.GetGUID(); + MasterLootCandidateList masterLootCandidateList = new MasterLootCandidateList(); + masterLootCandidateList.LootObj = loot.GetGUID(); for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.Next()) { @@ -1060,14 +1060,16 @@ namespace Game.Groups continue; if (looter.IsAtGroupRewardDistance(pLootedObject)) - data.Players.Add(looter.GetGUID()); + masterLootCandidateList.Players.Add(looter.GetGUID()); } + masterLootCandidateList.Write(); + for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.Next()) { Player looter = refe.GetSource(); if (looter.IsAtGroupRewardDistance(pLootedObject)) - looter.SendPacket(data); + looter.SendPacket(masterLootCandidateList); } } diff --git a/Source/Game/Handlers/BankHandler.cs b/Source/Game/Handlers/BankHandler.cs index 60f5fa807..93a08cc37 100644 --- a/Source/Game/Handlers/BankHandler.cs +++ b/Source/Game/Handlers/BankHandler.cs @@ -121,7 +121,10 @@ namespace Game void HandleBuyBankSlot(BuyBankSlot packet) { if (!CanUseBank(packet.Guid)) + { Log.outDebug(LogFilter.Network, "WORLD: HandleBuyBankSlot - {0} not found or you can't interact with him.", packet.Guid.ToString()); + return; + } uint slot = GetPlayer().GetBankBagSlotCount(); // next slot diff --git a/Source/Game/Handlers/BattleGroundHandler.cs b/Source/Game/Handlers/BattleGroundHandler.cs index 155dad317..6abc6036d 100644 --- a/Source/Game/Handlers/BattleGroundHandler.cs +++ b/Source/Game/Handlers/BattleGroundHandler.cs @@ -580,29 +580,8 @@ namespace Game [WorldPacketHandler(ClientOpcodes.RequestRatedBattlefieldInfo)] void HandleRequestRatedBattlefieldInfo(RequestRatedBattlefieldInfo packet) { - // @Todo: perfome research in this case - // The unk fields are related to arenas - WorldPacket data = new WorldPacket(ServerOpcodes.RatedBattlefieldInfo); - data.WriteInt32(0); // BgWeeklyWins20vs20 - data.WriteInt32(0); // BgWeeklyPlayed20vs20 - data.WriteInt32(0); // BgWeeklyPlayed15vs15 - data.WriteInt32(0); - data.WriteInt32(0); // BgWeeklyWins10vs10 - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); // BgWeeklyWins15vs15 - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); - data.WriteInt32(0); // BgWeeklyPlayed10vs10 - data.WriteInt32(0); - data.WriteInt32(0); - - //SendPacket(data); + RatedBattlefieldInfo ratedBattlefieldInfo = new RatedBattlefieldInfo(); + SendPacket(ratedBattlefieldInfo); } [WorldPacketHandler(ClientOpcodes.GetPvpOptionsEnabled, Processing = PacketProcessing.Inplace)] diff --git a/Source/Game/Handlers/ItemHandler.cs b/Source/Game/Handlers/ItemHandler.cs index f08ec4f5f..74e6ac4bb 100644 --- a/Source/Game/Handlers/ItemHandler.cs +++ b/Source/Game/Handlers/ItemHandler.cs @@ -613,15 +613,15 @@ namespace Game GetPlayer().StoreItem(dest, item, true); } - public void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint itemId, uint enchantId, uint slot) + public void SendEnchantmentLog(ObjectGuid owner, ObjectGuid caster, ObjectGuid itemGuid, uint itemId, uint enchantId, uint enchantSlot) { - EnchantmentLog packet = new EnchantmentLog(); - packet.Caster = caster; + EnchantmentLog packet = new EnchantmentLog(); packet.Owner = owner; + packet.Caster = caster; packet.ItemGUID = itemGuid; packet.ItemID = itemId; packet.Enchantment = enchantId; - packet.EnchantSlot = slot; + packet.EnchantSlot = enchantSlot; GetPlayer().SendMessageToSet(packet, true); } diff --git a/Source/Game/Handlers/LootHandler.cs b/Source/Game/Handlers/LootHandler.cs index 639c682f9..c485510e8 100644 --- a/Source/Game/Handlers/LootHandler.cs +++ b/Source/Game/Handlers/LootHandler.cs @@ -456,103 +456,102 @@ namespace Game DoLootRelease(lootPair.Value); } - //[WorldPacketHandler(ClientOpcodes.MasterLootItem)] - void HandleLootMasterGive(WorldPacket packet) + [WorldPacketHandler(ClientOpcodes.MasterLootItem)] + void HandleLootMasterGive(MasterLootItem masterLootItem) { - ObjectGuid lootguid = packet.ReadPackedGuid(); - byte slotid = packet.ReadUInt8(); - ObjectGuid target_playerguid = packet.ReadPackedGuid(); + AELootResult aeResult = new AELootResult(); if (GetPlayer().GetGroup() == null || GetPlayer().GetGroup().GetLooterGuid() != GetPlayer().GetGUID() || GetPlayer().GetGroup().GetLootMethod() != LootMethod.MasterLoot) { - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.DidntKill); + GetPlayer().SendLootError(ObjectGuid.Empty, ObjectGuid.Empty, LootError.DidntKill); return; } // player on other map - Player target = Global.ObjAccessor.GetPlayer(_player, target_playerguid); + Player target = Global.ObjAccessor.GetPlayer(_player, masterLootItem.Target); if (!target) { - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.PlayerNotFound); + GetPlayer().SendLootError(ObjectGuid.Empty, ObjectGuid.Empty, LootError.PlayerNotFound); return; } - Log.outDebug(LogFilter.Network, "HandleLootMasterGive (CMSG_LOOT_MASTER_GIVE, 0x02A3) Target = [{0}].", target.GetName()); - - if (GetPlayer().GetLootGUID() != lootguid) + foreach (LootRequest req in masterLootItem.Loot) { - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.DidntKill); - return; - } + Loot loot = null; + ObjectGuid lootguid = _player.GetLootWorldObjectGUID(req.Object); - if (!GetPlayer().IsInRaidWith(target) || !GetPlayer().IsInMap(target)) - { - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.MasterOther); - Log.outInfo(LogFilter.Loot, "MasterLootItem: Player {0} tried to give an item to ineligible player {1}!", GetPlayer().GetName(), target.GetName()); - return; - } + if (!_player.IsInRaidWith(target) || !_player.IsInMap(target)) + { + _player.SendLootError(req.Object, ObjectGuid.Empty, LootError.MasterOther); + Log.outInfo(LogFilter.Cheat, $"MasterLootItem: Player {GetPlayer().GetName()} tried to give an item to ineligible player {target.GetName()} !"); + return; + } - Loot loot = null; + if (GetPlayer().GetLootGUID().IsCreatureOrVehicle()) + { + Creature creature = GetPlayer().GetMap().GetCreature(lootguid); + if (!creature) + return; - if (GetPlayer().GetLootGUID().IsCreatureOrVehicle()) - { - Creature creature = GetPlayer().GetMap().GetCreature(lootguid); - if (creature == null) + loot = creature.loot; + } + else if (GetPlayer().GetLootGUID().IsGameObject()) + { + GameObject pGO = GetPlayer().GetMap().GetGameObject(lootguid); + if (!pGO) + return; + + loot = pGO.loot; + } + + if (loot == null) return; - loot = creature.loot; - } - else if (GetPlayer().GetLootGUID().IsGameObject()) - { - GameObject pGO = GetPlayer().GetMap().GetGameObject(lootguid); - if (pGO == null) + byte slotid = (byte)(req.LootListID - 1); + if (slotid >= loot.items.Count + loot.quest_items.Count) + { + Log.outDebug(LogFilter.Loot, $"MasterLootItem: Player {GetPlayer().GetName()} might be using a hack! (slot {slotid}, size {loot.items.Count})"); return; + } - loot = pGO.loot; + LootItem item = slotid >= loot.items.Count ? loot.quest_items[slotid - loot.items.Count] : loot.items[slotid]; + + List dest = new List(); + InventoryResult msg = target.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item.itemid, item.count); + if (item.follow_loot_rules && !item.AllowedForPlayer(target)) + msg = InventoryResult.CantEquipEver; + if (msg != InventoryResult.Ok) + { + if (msg == InventoryResult.ItemMaxCount) + _player.SendLootError(req.Object, ObjectGuid.Empty, LootError.MasterUniqueItem); + else if (msg == InventoryResult.InvFull) + _player.SendLootError(req.Object, ObjectGuid.Empty, LootError.MasterInvFull); + else + _player.SendLootError(req.Object, ObjectGuid.Empty, LootError.MasterOther); + + target.SendEquipError(msg, null, null, item.itemid); + return; + } + + // now move item from loot to target inventory + Item newitem = target.StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); + aeResult.Add(newitem, item.count, loot.loot_type); + + // mark as looted + item.count = 0; + item.is_looted = true; + + loot.NotifyItemRemoved(slotid); + --loot.unlootedCount; } - if (loot == null) - return; - - if (slotid >= loot.items.Count + loot.quest_items.Count) + foreach (var resultValue in aeResult.GetByOrder()) { - Log.outDebug(LogFilter.Loot, "MasterLootItem: Player {0} might be using a hack! (slot {1}, size {2})", - GetPlayer().GetName(), slotid, loot.items.Count); - return; + target.SendNewItem(resultValue.item, resultValue.count, false, false, true); + target.UpdateCriteria(CriteriaTypes.LootItem, resultValue.item.GetEntry(), resultValue.count); + target.UpdateCriteria(CriteriaTypes.LootType, resultValue.item.GetEntry(), resultValue.count, (ulong)resultValue.lootType); + target.UpdateCriteria(CriteriaTypes.LootEpicItem, resultValue.item.GetEntry(), resultValue.count); } - - LootItem item = slotid >= loot.items.Count ? loot.quest_items[slotid - loot.items.Count] : loot.items[slotid]; - - List dest = new List(); - InventoryResult msg = target.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item.itemid, item.count); - if (item.follow_loot_rules && !item.AllowedForPlayer(target)) - msg = InventoryResult.CantEquipEver; - if (msg != InventoryResult.Ok) - { - if (msg == InventoryResult.ItemMaxCount) - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.MasterUniqueItem); - else if (msg == InventoryResult.InvFull) - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.MasterInvFull); - else - GetPlayer().SendLootError(lootguid, ObjectGuid.Empty, LootError.MasterOther); - - target.SendEquipError(msg, null, null, item.itemid); - return; - } - - // not move item from loot to target inventory - Item newitem = target.StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs); - target.SendNewItem(newitem, item.count, false, false, true); - target.UpdateCriteria(CriteriaTypes.LootItem, item.itemid, item.count); - target.UpdateCriteria(CriteriaTypes.LootType, item.itemid, item.count, (ulong)loot.loot_type); - target.UpdateCriteria(CriteriaTypes.LootEpicItem, item.itemid, item.count); - - // mark as looted - item.count = 0; - item.is_looted = true; - - loot.NotifyItemRemoved(slotid); - --loot.unlootedCount; } [WorldPacketHandler(ClientOpcodes.SetLootSpecialization)] diff --git a/Source/Game/Handlers/NPCHandler.cs b/Source/Game/Handlers/NPCHandler.cs index 4b174de02..2a83eab59 100644 --- a/Source/Game/Handlers/NPCHandler.cs +++ b/Source/Game/Handlers/NPCHandler.cs @@ -401,9 +401,11 @@ namespace Game SendPacket(packet); } - void SendPetStableResult(byte res) + void SendPetStableResult(StableResult result) { - SendPacket(new PetStableResult(res)); + PetStableResult petStableResult = new PetStableResult(); + petStableResult.Result = result; + SendPacket(petStableResult); } [WorldPacketHandler(ClientOpcodes.RepairItem)] diff --git a/Source/Game/Handlers/SpellHandler.cs b/Source/Game/Handlers/SpellHandler.cs index 50c665d10..99fa82032 100644 --- a/Source/Game/Handlers/SpellHandler.cs +++ b/Source/Game/Handlers/SpellHandler.cs @@ -422,7 +422,7 @@ namespace Game if (!pet.IsAlive()) { - pet.SendPetActionFeedback(packet.SpellID, ActionFeedback.PetDead); + pet.SendPetActionFeedback(PetActionFeedback.Dead, 0); return; } diff --git a/Source/Game/Networking/Packets/BattleGroundPackets.cs b/Source/Game/Networking/Packets/BattleGroundPackets.cs index 3b91c5137..6d486592e 100644 --- a/Source/Game/Networking/Packets/BattleGroundPackets.cs +++ b/Source/Game/Networking/Packets/BattleGroundPackets.cs @@ -442,6 +442,19 @@ namespace Game.Networking.Packets public override void Read() { } } + class RatedBattlefieldInfo : ServerPacket + { + public RatedBattlefieldInfo() : base(ServerOpcodes.RatedBattlefieldInfo) { } + + public override void Write() + { + foreach (BracketInfo bracket in Bracket) + bracket.Write(_worldPacket); + } + + BracketInfo[] Bracket = new BracketInfo[6]; + } + class PVPMatchInit : ServerPacket { public PVPMatchInit() : base(ServerOpcodes.PvpMatchInit, ConnectionType.Instance) { } @@ -497,6 +510,43 @@ namespace Game.Networking.Packets } //Structs + class BracketInfo + { + public int PersonalRating; + public int Ranking; + public int SeasonPlayed; + public int SeasonWon; + public int Unused1; + public int Unused2; + public int WeeklyPlayed; + public int WeeklyWon; + public int BestWeeklyRating; + public int LastWeeksBestRating; + public int BestSeasonRating; + public int PvpTierID; + public int Unused3; + public bool Unused4; + + public void Write(WorldPacket data) + { + data.WriteInt32(PersonalRating); + data.WriteInt32(Ranking); + data.WriteInt32(SeasonPlayed); + data.WriteInt32(SeasonWon); + data.WriteInt32(Unused1); + data.WriteInt32(Unused2); + data.WriteInt32(WeeklyPlayed); + data.WriteInt32(WeeklyWon); + data.WriteInt32(BestWeeklyRating); + data.WriteInt32(LastWeeksBestRating); + data.WriteInt32(BestSeasonRating); + data.WriteInt32(PvpTierID); + data.WriteInt32(Unused3); + data.WriteBit(Unused4); + data.FlushBits(); + } + } + public class PVPLogData { public List Statistics = new List(); diff --git a/Source/Game/Networking/Packets/ItemPackets.cs b/Source/Game/Networking/Packets/ItemPackets.cs index 257690087..1fec0bcdf 100644 --- a/Source/Game/Networking/Packets/ItemPackets.cs +++ b/Source/Game/Networking/Packets/ItemPackets.cs @@ -525,24 +525,24 @@ namespace Game.Networking.Packets class EnchantmentLog : ServerPacket { - public EnchantmentLog() : base(ServerOpcodes.EnchantmentLog) { } + public EnchantmentLog() : base(ServerOpcodes.EnchantmentLog, ConnectionType.Instance) { } public override void Write() - { - _worldPacket.WritePackedGuid(Caster); + { _worldPacket.WritePackedGuid(Owner); + _worldPacket.WritePackedGuid(Caster); _worldPacket.WritePackedGuid(ItemGUID); _worldPacket.WriteUInt32(ItemID); _worldPacket.WriteUInt32(Enchantment); _worldPacket.WriteUInt32(EnchantSlot); } - public ObjectGuid Caster; public ObjectGuid Owner; + public ObjectGuid Caster; public ObjectGuid ItemGUID; public uint ItemID; - public uint EnchantSlot; public uint Enchantment; + public uint EnchantSlot; } class CancelTempEnchantment : ClientPacket @@ -572,7 +572,7 @@ namespace Game.Networking.Packets public uint SpellID; public uint Cooldown; } - + class ItemEnchantTimeUpdate : ServerPacket { public ItemEnchantTimeUpdate() : base(ServerOpcodes.ItemEnchantTimeUpdate, ConnectionType.Instance) { } diff --git a/Source/Game/Networking/Packets/LootPackets.cs b/Source/Game/Networking/Packets/LootPackets.cs index d7d46012c..fa7dae3c6 100644 --- a/Source/Game/Networking/Packets/LootPackets.cs +++ b/Source/Game/Networking/Packets/LootPackets.cs @@ -102,6 +102,28 @@ namespace Game.Networking.Packets public List Loot = new List(); } + class MasterLootItem : ClientPacket + { + public MasterLootItem(WorldPacket packet) : base(packet) { } + + public override void Read() + { + uint Count = _worldPacket.ReadUInt32(); + Target = _worldPacket.ReadPackedGuid(); + + for (uint i = 0; i < Count; ++i) + { + LootRequest lootRequest = new LootRequest(); + lootRequest.Object = _worldPacket.ReadPackedGuid(); + lootRequest.LootListID = _worldPacket.ReadUInt8(); + Loot.Add(lootRequest); + } + } + + public Array Loot = new Array(1000); + public ObjectGuid Target; + } + class LootRemoved : ServerPacket { public LootRemoved() : base(ServerOpcodes.LootRemoved, ConnectionType.Instance) { } @@ -337,6 +359,21 @@ namespace Game.Networking.Packets public byte LootListID; } + class MasterLootCandidateList : ServerPacket + { + public MasterLootCandidateList() : base(ServerOpcodes.MasterLootCandidateList, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(LootObj); + _worldPacket.WriteInt32(Players.Count); + Players.ForEach(guid => _worldPacket.WritePackedGuid(guid)); + } + + public List Players = new List(); + public ObjectGuid LootObj; + } + class AELootTargets : ServerPacket { public AELootTargets(uint count) : base(ServerOpcodes.AeLootTargets, ConnectionType.Instance) @@ -359,21 +396,6 @@ namespace Game.Networking.Packets public override void Write() { } } - class MasterLootCandidateList : ServerPacket - { - public MasterLootCandidateList() : base(ServerOpcodes.MasterLootCandidateList) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(LootObj); - _worldPacket.WriteInt32(Players.Count); - Players.ForEach(guid => _worldPacket.WritePackedGuid(guid)); - } - - public List Players = new List(); - public ObjectGuid LootObj; - } - //Structs public class LootItemData { diff --git a/Source/Game/Networking/Packets/MiscPackets.cs b/Source/Game/Networking/Packets/MiscPackets.cs index fcb25d0b7..290bce43c 100644 --- a/Source/Game/Networking/Packets/MiscPackets.cs +++ b/Source/Game/Networking/Packets/MiscPackets.cs @@ -105,6 +105,13 @@ namespace Game.Networking.Packets public int GameTimeHolidayOffset; } + public class ResetWeeklyCurrency : ServerPacket + { + public ResetWeeklyCurrency() : base(ServerOpcodes.ResetWeeklyCurrency, ConnectionType.Instance) { } + + public override void Write() { } + } + public class SetCurrency : ServerPacket { public SetCurrency() : base(ServerOpcodes.SetCurrency, ConnectionType.Instance) { } @@ -168,13 +175,6 @@ namespace Game.Networking.Packets public uint Type; } - public class ResetWeeklyCurrency : ServerPacket - { - public ResetWeeklyCurrency() : base(ServerOpcodes.ResetWeeklyCurrency, ConnectionType.Instance) { } - - public override void Write() { } - } - public class SetSelection : ClientPacket { public SetSelection(WorldPacket packet) : base(packet) { } diff --git a/Source/Game/Networking/Packets/PetPackets.cs b/Source/Game/Networking/Packets/PetPackets.cs index bed545a2c..c1f03f8b6 100644 --- a/Source/Game/Networking/Packets/PetPackets.cs +++ b/Source/Game/Networking/Packets/PetPackets.cs @@ -164,6 +164,18 @@ namespace Game.Networking.Packets public List Pets = new List(); } + class PetStableResult : ServerPacket + { + public PetStableResult() : base(ServerOpcodes.PetStableResult, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteUInt8((byte)Result); + } + + public StableResult Result; + } + class PetLearnedSpells : ServerPacket { public PetLearnedSpells() : base(ServerOpcodes.PetLearnedSpells, ConnectionType.Instance) { } @@ -288,34 +300,6 @@ namespace Game.Networking.Packets public uint Action; } - class PetActionSound : ServerPacket - { - public PetActionSound() : base(ServerOpcodes.PetStableResult) { } - - public override void Write() - { - _worldPacket.WritePackedGuid(UnitGUID); - _worldPacket.WriteUInt32((uint)Action); - } - - public ObjectGuid UnitGUID; - public PetTalk Action; - } - - class PetActionFeedback : ServerPacket - { - public PetActionFeedback() : base(ServerOpcodes.PetStableResult) { } - - public override void Write() - { - _worldPacket.WriteUInt32(SpellID); - _worldPacket.WriteUInt8((byte)Response); - } - - public uint SpellID; - public ActionFeedback Response; - } - class PetCancelAura : ClientPacket { public PetCancelAura(WorldPacket packet) : base(packet) { } @@ -330,22 +314,6 @@ namespace Game.Networking.Packets public uint SpellID; } - - class PetStableResult : ServerPacket - { - public PetStableResult(byte result) : base(ServerOpcodes.PetStableResult) - { - Result = result; - } - - public override void Write() - { - _worldPacket.WriteUInt8(Result); - } - - public byte Result; - } - class SetPetSpecialization : ServerPacket { public SetPetSpecialization() : base(ServerOpcodes.SetPetSpecialization) { } @@ -358,6 +326,34 @@ namespace Game.Networking.Packets public ushort SpecID; } + class PetActionFeedbackPacket : ServerPacket + { + public PetActionFeedbackPacket() : base(ServerOpcodes.PetStableResult) { } + + public override void Write() + { + _worldPacket.WriteUInt32(SpellID); + _worldPacket.WriteUInt8((byte)Response); + } + + public uint SpellID; + public PetActionFeedback Response; + } + + class PetActionSound : ServerPacket + { + public PetActionSound() : base(ServerOpcodes.PetStableResult) { } + + public override void Write() + { + _worldPacket.WritePackedGuid(UnitGUID); + _worldPacket.WriteUInt32((uint)Action); + } + + public ObjectGuid UnitGUID; + public PetTalk Action; + } + //Structs public class PetSpellCooldown {