diff --git a/HermesProxy/GlobalSessionData.cs b/HermesProxy/GlobalSessionData.cs index d5b970b5..94e2b527 100644 --- a/HermesProxy/GlobalSessionData.cs +++ b/HermesProxy/GlobalSessionData.cs @@ -140,6 +140,19 @@ public byte GetItemSpellSlot(WowGuid128 guid, uint spellId) uint itemId = updates[OBJECT_FIELD_ENTRY].UInt32Value; return GameData.GetItemEffectSlot(itemId, spellId); } + public uint GetItemId(WowGuid128 guid) + { + int OBJECT_FIELD_ENTRY = LegacyVersion.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY); + if (OBJECT_FIELD_ENTRY < 0) + return 0; + + var updates = GetCachedObjectFieldsLegacy(guid); + if (updates == null) + return 0; + + uint itemId = updates[OBJECT_FIELD_ENTRY].UInt32Value; + return itemId; + } public void SetFlatSpellMod(byte spellMod, byte spellMask, int amount) { if (FlatSpellMods.ContainsKey(spellMod)) diff --git a/HermesProxy/World/Client/PacketHandlers/ItemHandler.cs b/HermesProxy/World/Client/PacketHandlers/ItemHandler.cs index 553e399b..fc198038 100644 --- a/HermesProxy/World/Client/PacketHandlers/ItemHandler.cs +++ b/HermesProxy/World/Client/PacketHandlers/ItemHandler.cs @@ -214,5 +214,37 @@ void HandleItemEnchantTimeUpdate(WorldPacket packet) enchant.OwnerGuid = packet.ReadGuid().To128(GetSession().GameState); SendPacketToClient(enchant); } + + [PacketHandler(Opcode.SMSG_ENCHANTMENT_LOG)] + void HandleEnchantmentLog(WorldPacket packet) + { + EnchantmentLog enchantment = new EnchantmentLog(); + if (LegacyVersion.AddedInVersion(ClientVersionBuild.V2_0_1_6180)) + { + enchantment.Caster = packet.ReadPackedGuid().To128(GetSession().GameState); + enchantment.Owner = packet.ReadPackedGuid().To128(GetSession().GameState); + } + else + { + enchantment.Owner = packet.ReadGuid().To128(GetSession().GameState); + enchantment.Caster = packet.ReadGuid().To128(GetSession().GameState); + } + enchantment.ItemID = (int)packet.ReadUInt32(); + var session = GetSession().GameState; + + for (int i = 0; i < 23; i++) + { + if (session.GetItemId(session.GetInventorySlotItem(i).To128(session)).Equals((uint)enchantment.ItemID)) + { + enchantment.ItemGUID = session.GetInventorySlotItem(i).To128(session); + break; + } + } + if (enchantment.ItemGUID == null) + return; + + enchantment.Enchantment = (int)packet.ReadUInt32(); + SendPacketToClient(enchantment); + } } } diff --git a/HermesProxy/World/Server/PacketHandlers/ItemHandler.cs b/HermesProxy/World/Server/PacketHandlers/ItemHandler.cs index abdae82d..21ce7b9d 100644 --- a/HermesProxy/World/Server/PacketHandlers/ItemHandler.cs +++ b/HermesProxy/World/Server/PacketHandlers/ItemHandler.cs @@ -186,5 +186,15 @@ void HandleSetAmmo(SetAmmo ammo) packet.WriteUInt32(ammo.ItemId); SendPacketToServer(packet); } + + [PacketHandler(Opcode.CMSG_CANCEL_TEMP_ENCHANTMENT)] + void HandleCancelTempEnchantment(CancelTempEnchantment cancel) + { + if (LegacyVersion.RemovedInVersion(ClientVersionBuild.V2_0_1_6180)) + return; + WorldPacket packet = new WorldPacket(Opcode.CMSG_CANCEL_TEMP_ENCHANTMENT); + packet.WriteUInt32(cancel.EnchantmentSlot); + SendPacketToServer(packet); + } } } diff --git a/HermesProxy/World/Server/Packets/ItemPackets.cs b/HermesProxy/World/Server/Packets/ItemPackets.cs index d798af2f..96798d70 100644 --- a/HermesProxy/World/Server/Packets/ItemPackets.cs +++ b/HermesProxy/World/Server/Packets/ItemPackets.cs @@ -654,4 +654,37 @@ public override void Write() public uint Slot; public WowGuid128 OwnerGuid; } + + class EnchantmentLog : ServerPacket + { + public EnchantmentLog() : base(Opcode.SMSG_ENCHANTMENT_LOG) { } + + public override void Write() + { + _worldPacket.WritePackedGuid128(Caster); + _worldPacket.WritePackedGuid128(Owner); + _worldPacket.WritePackedGuid128(ItemGUID); + _worldPacket.WriteInt32(ItemID); + _worldPacket.WriteInt32(Enchantment); + _worldPacket.WriteInt32(EnchantSlot); + } + public WowGuid128 Caster; + public WowGuid128 Owner; + public WowGuid128 ItemGUID; + public int ItemID; + public int Enchantment; + public int EnchantSlot = 1; + } + + public class CancelTempEnchantment : ClientPacket + { + public CancelTempEnchantment(WorldPacket packet) : base(packet) { } + + public override void Read() + { + EnchantmentSlot = _worldPacket.ReadUInt32(); + } + + public uint EnchantmentSlot; + } }