diff --git a/HermesProxy/World/Client/PacketHandlers/SpellHandler.cs b/HermesProxy/World/Client/PacketHandlers/SpellHandler.cs index 667eb0a1..7fbb41ca 100644 --- a/HermesProxy/World/Client/PacketHandlers/SpellHandler.cs +++ b/HermesProxy/World/Client/PacketHandlers/SpellHandler.cs @@ -334,6 +334,15 @@ void HandleSpellFailedOther(WorldPacket packet) spell2.SpellXSpellVisualID = spellVisual; spell2.Reason = reason; SendPacketToClient(spell2); + + string? casterUnitGUID = casterUnit.ToUnitGUID(); + if (casterUnitGUID != null) + { + uint language = (uint)Language.AddonBfA; + WowGuid128 playerGuid = GetSession().GameState.CurrentPlayerGuid; + ChatPkt chat = new ChatPkt(GetSession(), ChatMessageTypeModern.Addon, $"SMSG_SPELL_FAILED_OTHER:{casterUnitGUID},{spellId}", language, playerGuid, "", playerGuid, "", "", ChatFlags.None, "HermesProxySMSG"); + SendPacketToClient(chat); + } } [PacketHandler(Opcode.SMSG_SPELL_START)] @@ -434,8 +443,19 @@ void HandleSpellGo(WorldPacket packet) } if (!spell.Cast.CasterUnit.IsEmpty() && GameData.AuraSpells.Contains((uint)spell.Cast.SpellID)) { + string? casterUnitGUID = spell.Cast.CasterUnit.ToUnitGUID(); foreach (WowGuid128 target in spell.Cast.HitTargets) + { GetSession().GameState.StoreLastAuraCasterOnTarget(target, (uint)spell.Cast.SpellID, spell.Cast.CasterUnit); + string? targetUnitGUID = target.ToUnitGUID(); + if (casterUnitGUID != null && targetUnitGUID != null) + { + uint language = (uint)Language.AddonBfA; + WowGuid128 playerGuid = GetSession().GameState.CurrentPlayerGuid; + ChatPkt chat = new ChatPkt(GetSession(), ChatMessageTypeModern.Addon, $"SMSG_SPELL_GO_AURA:{casterUnitGUID},{targetUnitGUID},{spell.Cast.SpellID}", language, playerGuid, "", playerGuid, "", "", ChatFlags.None, "HermesProxySMSG"); + SendPacketToClient(chat); + } + } } SendPacketToClient(spell); diff --git a/HermesProxy/World/WowGuid.cs b/HermesProxy/World/WowGuid.cs index ced6a34c..7bd1d395 100644 --- a/HermesProxy/World/WowGuid.cs +++ b/HermesProxy/World/WowGuid.cs @@ -331,6 +331,23 @@ public override ulong GetCounter() return Low & 0xFFFFFFFFFF; // CreationBits } + public string? ToUnitGUID() + { + string lowHex = Low.ToString("X16"); + HighGuidType highType = GetHighType(); + switch (highType) + { + case HighGuidType.Player: + return $"{highType}-{GetRealmId()}-{lowHex.Substring(lowHex.Length - 8)}"; + case HighGuidType.Creature: + case HighGuidType.Pet: + return $"{highType}-{GetSubType()}-{GetRealmId()}-{GetServerId()}-{GetMapId()}-{GetEntry()}-{lowHex.Substring(lowHex.Length - 10)}"; + default: + Log.Print(LogType.Warn, "unsupported GUID type: ({GetHighType()})"); + return null; + } + } + public override string ToString() { if (Low == 0 && High == 0)