From 64e1b9e34fa96d87fa457afb6cbe168f3cd7e1f7 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 21 Sep 2021 20:15:08 -0400 Subject: [PATCH] Core/Items: Disable effects on items marked as legacy Port From (https://github.com/TrinityCore/TrinityCore/commit/c34e0f80a0337ba582aeee17a478081f99a69686) --- Source/Framework/Constants/ItemConst.cs | 4 +- Source/Game/Entities/Player/Player.Items.cs | 2 +- Source/Game/Entities/Player/Player.Spells.cs | 141 ++++++++++--------- 3 files changed, 79 insertions(+), 68 deletions(-) diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index 8bb232404..a832b331a 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +using System; namespace Framework.Constants { @@ -884,6 +885,7 @@ namespace Framework.Constants Equipped = 0x1 } + [Flags] public enum ItemFlags : long { NoPickup = 0x01, @@ -894,7 +896,7 @@ namespace Framework.Constants NoUserDestroy = 0x20, // Item Can Not Be Destroyed, Except By Using Spell (Item Can Be Reagent For Spell) Playercast = 0x40, // Item's spells are castable by players NoEquipCooldown = 0x80, // No Default 30 Seconds Cooldown When Equipped - Legacy = 0x100, + Legacy = 0x100, // Effects are disabled IsWrapper = 0x200, // Item Can Wrap Other Items UsesResources = 0x400, MultiDrop = 0x800, // Looting This Item Does Not Remove It From Available Loot diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 1bfbf8dfc..2dd64c58d 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -3817,7 +3817,7 @@ namespace Game.Entities void ApplyItemEquipSpell(Item item, bool apply, bool formChange = false) { - if (item == null) + if (item == null || item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy)) return; foreach (ItemEffectRecord effectData in item.GetEffects()) diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 8b3f1dcb9..ffdb8b4d1 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -1470,20 +1470,51 @@ namespace Game.Entities public void CastItemUseSpell(Item item, SpellCastTargets targets, ObjectGuid castCount, uint[] misc) { - // special learning case - if (item.GetBonus().EffectCount >= 2) + if (!item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy)) { - if (item.GetEffect(0).SpellID == 483 || item.GetEffect(0).SpellID == 55884) + // special learning case + if (item.GetBonus().EffectCount >= 2) { - uint learn_spell_id = (uint)item.GetEffect(0).SpellID; - uint learning_spell_id = (uint)item.GetEffect(1).SpellID; + if (item.GetEffect(0).SpellID == 483 || item.GetEffect(0).SpellID == 55884) + { + uint learn_spell_id = (uint)item.GetEffect(0).SpellID; + uint learning_spell_id = (uint)item.GetEffect(1).SpellID; - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(learn_spell_id, Difficulty.None); + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(learn_spell_id, Difficulty.None); + if (spellInfo == null) + { + Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring ", item.GetEntry(), learn_spell_id); + SendEquipError(InventoryResult.InternalBagError, item); + return; + } + + Spell spell = new(this, spellInfo, TriggerCastFlags.None); + + SpellPrepare spellPrepare = new(); + spellPrepare.ClientCastID = castCount; + spellPrepare.ServerCastID = spell.m_castId; + SendPacket(spellPrepare); + + spell.m_fromClient = true; + spell.m_CastItem = item; + spell.SetSpellValue(SpellValueMod.BasePoint0, (int)learning_spell_id); + spell.Prepare(targets); + return; + } + } + + // item spells casted at use + foreach (ItemEffectRecord effectData in item.GetEffects()) + { + // wrong triggering type + if (effectData.TriggerType != ItemSpelltriggerType.OnUse) + continue; + + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo((uint)effectData.SpellID, Difficulty.None); if (spellInfo == null) { - Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring ", item.GetEntry(), learn_spell_id); - SendEquipError(InventoryResult.InternalBagError, item); - return; + Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring", item.GetEntry(), effectData.SpellID); + continue; } Spell spell = new(this, spellInfo, TriggerCastFlags.None); @@ -1495,41 +1526,13 @@ namespace Game.Entities spell.m_fromClient = true; spell.m_CastItem = item; - spell.SetSpellValue(SpellValueMod.BasePoint0, (int)learning_spell_id); + spell.m_misc.Data0 = misc[0]; + spell.m_misc.Data1 = misc[1]; spell.Prepare(targets); return; } } - // item spells casted at use - foreach (ItemEffectRecord effectData in item.GetEffects()) - { - // wrong triggering type - if (effectData.TriggerType != ItemSpelltriggerType.OnUse) - continue; - - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo((uint)effectData.SpellID, Difficulty.None); - if (spellInfo == null) - { - Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring", item.GetEntry(), effectData.SpellID); - continue; - } - - Spell spell = new(this, spellInfo, TriggerCastFlags.None); - - SpellPrepare spellPrepare = new(); - spellPrepare.ClientCastID = castCount; - spellPrepare.ServerCastID = spell.m_castId; - SendPacket(spellPrepare); - - spell.m_fromClient = true; - spell.m_CastItem = item; - spell.m_misc.Data0 = misc[0]; - spell.m_misc.Data1 = misc[1]; - spell.Prepare(targets); - return; - } - // Item enchantments spells casted at use for (EnchantmentSlot e_slot = 0; e_slot < EnchantmentSlot.Max; ++e_slot) { @@ -1563,7 +1566,7 @@ namespace Game.Entities spell.Prepare(targets); return; } - } + } } public uint GetLastPotionId() { return m_lastPotionId; } @@ -1786,6 +1789,9 @@ namespace Game.Entities void ApplyItemObtainSpells(Item item, bool apply) { + if (item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy)) + return; + foreach (ItemEffectRecord effect in item.GetEffects()) { if (effect.TriggerType != ItemSpelltriggerType.OnObtain) // On obtain trigger @@ -3179,35 +3185,38 @@ namespace Game.Entities bool canTrigger = damageInfo.GetHitMask().HasAnyFlag(ProcFlagsHit.Normal | ProcFlagsHit.Critical | ProcFlagsHit.Absorb); if (canTrigger) { - foreach (ItemEffectRecord effectData in item.GetEffects()) + if (!item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy)) { - // wrong triggering type - if (effectData.TriggerType != ItemSpelltriggerType.ChanceOnHit) - continue; - - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo((uint)effectData.SpellID, Difficulty.None); - if (spellInfo == null) + foreach (ItemEffectRecord effectData in item.GetEffects()) { - Log.outError(LogFilter.Player, "WORLD: unknown Item spellid {0}", effectData.SpellID); - continue; + // wrong triggering type + if (effectData.TriggerType != ItemSpelltriggerType.ChanceOnHit) + continue; + + SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo((uint)effectData.SpellID, Difficulty.None); + if (spellInfo == null) + { + Log.outError(LogFilter.Player, "WORLD: unknown Item spellid {0}", effectData.SpellID); + continue; + } + + // not allow proc extra attack spell at extra attack + if (ExtraAttacks != 0 && spellInfo.HasEffect(SpellEffectName.AddExtraAttacks)) + return; + + float chance = spellInfo.ProcChance; + + if (proto.SpellPPMRate != 0) + { + uint WeaponSpeed = GetBaseAttackTime(damageInfo.GetAttackType()); + chance = GetPPMProcChance(WeaponSpeed, proto.SpellPPMRate, spellInfo); + } + else if (chance > 100.0f) + chance = GetWeaponProcChance(); + + if (RandomHelper.randChance(chance) && Global.ScriptMgr.OnCastItemCombatSpell(this, damageInfo.GetVictim(), spellInfo, item)) + CastSpell(damageInfo.GetVictim(), spellInfo.Id, item); } - - // not allow proc extra attack spell at extra attack - if (ExtraAttacks != 0 && spellInfo.HasEffect(SpellEffectName.AddExtraAttacks)) - return; - - float chance = spellInfo.ProcChance; - - if (proto.SpellPPMRate != 0) - { - uint WeaponSpeed = GetBaseAttackTime(damageInfo.GetAttackType()); - chance = GetPPMProcChance(WeaponSpeed, proto.SpellPPMRate, spellInfo); - } - else if (chance > 100.0f) - chance = GetWeaponProcChance(); - - if (RandomHelper.randChance(chance) && Global.ScriptMgr.OnCastItemCombatSpell(this, damageInfo.GetVictim(), spellInfo, item)) - CastSpell(damageInfo.GetVictim(), spellInfo.Id, item); } }