From 03bcadf2c623ef713c76d3b4dae4f6004314b650 Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Sat, 31 Aug 2024 17:35:41 -0400 Subject: [PATCH] Core/Spells: Implemented SPELL_ATTR9_ITEM_PASSIVE_ON_CLIENT Port From (https://github.com/TrinityCore/TrinityCore/commit/321161230fe557f930bb155729d9150c42c5758c) --- .../Framework/Constants/Spells/SpellConst.cs | 2 +- Source/Game/Entities/Player/Player.Fields.cs | 1 + Source/Game/Entities/Player/Player.Items.cs | 33 ++++++++++++++++ Source/Game/Entities/Player/Player.cs | 1 + Source/Game/Networking/Packets/ItemPackets.cs | 39 +++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs index f52510798..d174c3058 100644 --- a/Source/Framework/Constants/Spells/SpellConst.cs +++ b/Source/Framework/Constants/Spells/SpellConst.cs @@ -1992,7 +1992,7 @@ namespace Framework.Constants JumpchargeNoFacingControl = 0x800000, // JumpCharge - no facing control IgnoreCasterHealingModifiers = 0x1000000, // Ignore Caster Healing Modifiers DontConsumeChargeIfItemDeleted = 0x2000000, // NYI - some sort of bugfix attribute to prevent double item deletion? // (Programmer Only) Don't consume charge if item deleted - Unk26 = 0x4000000, // 26 + ItemPassiveOnClient = 0x4000000, // Item Passive On Client Unk27 = 0x8000000, // 27 Unk28 = 0x10000000, // 28 Unk29 = 0x20000000, // 29 diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 37d1d934a..fa36f8c95 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -37,6 +37,7 @@ namespace Game.Entities public List ItemSetEff = new(); List m_enchantDuration = new(); List m_itemDuration = new(); + List m_itemPassives = new(); List m_itemSoulboundTradeable = new(); List m_refundableItems = new(); public List ItemUpdateQueue = new(); diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 620846c36..a6bf956bf 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -2419,6 +2419,17 @@ namespace Game.Entities } return true; } + + void SendItemPassives() + { + if (m_itemPassives.Empty()) + return; + + SendItemPassives sendItemPassives = new(); + sendItemPassives.SpellID.AddRange(m_itemPassives); + SendPacket(sendItemPassives); + } + public void SendNewItem(Item item, uint quantity, bool pushed, bool created, bool broadcast = false, uint dungeonEncounterId = 0) { if (item == null) // prevent crash @@ -3785,6 +3796,17 @@ namespace Game.Entities Log.outDebug(LogFilter.Player, "WORLD: cast {0} Equip spellId - {1}", (item != null ? "item" : "itemset"), spellInfo.Id); + if (spellInfo.HasAttribute(SpellAttr9.ItemPassiveOnClient)) + { + m_itemPassives.Add(spellInfo.Id); + if (IsInWorld) + { + AddItemPassive addItemPassive = new(); + addItemPassive.SpellID = spellInfo.Id; + SendPacket(addItemPassive); + } + } + CastSpell(this, spellInfo.Id, new CastSpellExtraArgs(item)); } else @@ -3796,6 +3818,17 @@ namespace Game.Entities return; // and remove only not compatible at form change } + if (spellInfo.HasAttribute(SpellAttr9.ItemPassiveOnClient)) + { + m_itemPassives.Remove(spellInfo.Id); + if (IsInWorld) + { + RemoveItemPassive removeItemPassive = new(); + removeItemPassive.SpellID = spellInfo.Id; + SendPacket(removeItemPassive); + } + } + if (item != null) RemoveAurasDueToItemSpell(spellInfo.Id, item.GetGUID()); // un-apply all spells, not only at-equipped else diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index c77f11eec..df35ac63b 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5798,6 +5798,7 @@ namespace Game.Entities SendAurasForTarget(this); SendEnchantmentDurations(); // must be after add to map SendItemDurations(); // must be after add to map + SendItemPassives(); // must be after add to map // raid downscaling - send difficulty to player if (GetMap().IsRaid()) diff --git a/Source/Game/Networking/Packets/ItemPackets.cs b/Source/Game/Networking/Packets/ItemPackets.cs index 0d6411227..2984541d8 100644 --- a/Source/Game/Networking/Packets/ItemPackets.cs +++ b/Source/Game/Networking/Packets/ItemPackets.cs @@ -751,6 +751,45 @@ namespace Game.Networking.Packets } } + class AddItemPassive : ServerPacket + { + public uint SpellID; + + public AddItemPassive() : base(ServerOpcodes.AddItemPassive, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteUInt32(SpellID); + } + } + + class RemoveItemPassive : ServerPacket + { + public uint SpellID; + + public RemoveItemPassive() : base(ServerOpcodes.RemoveItemPassive, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteUInt32(SpellID); + } + } + + class SendItemPassives : ServerPacket + { + public List SpellID = new(); + + public SendItemPassives() : base(ServerOpcodes.SendItemPassives, ConnectionType.Instance) { } + + public override void Write() + { + _worldPacket.WriteInt32(SpellID.Count); + if (!SpellID.Empty()) + foreach (uint id in SpellID) + _worldPacket.WriteUInt32(id); + } + } + //Structs public class ItemBonuses {