Skip to content
This repository has been archived by the owner on Nov 30, 2024. It is now read-only.

Improve Temp Enchant handling #27

Merged
merged 6 commits into from
May 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions HermesProxy/GlobalSessionData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
32 changes: 32 additions & 0 deletions HermesProxy/World/Client/PacketHandlers/ItemHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
insunaa marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
10 changes: 10 additions & 0 deletions HermesProxy/World/Server/PacketHandlers/ItemHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
insunaa marked this conversation as resolved.
Show resolved Hide resolved
packet.WriteUInt32(cancel.EnchantmentSlot);
SendPacketToServer(packet);
}
}
}
33 changes: 33 additions & 0 deletions HermesProxy/World/Server/Packets/ItemPackets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}