Core/Items: Disable effects on items marked as legacy

Port From (https://github.com/TrinityCore/TrinityCore/commit/c34e0f80a0337ba582aeee17a478081f99a69686)
This commit is contained in:
hondacrx
2021-09-21 20:15:08 -04:00
parent 333afc8ba6
commit 64e1b9e34f
3 changed files with 79 additions and 68 deletions
+3 -1
View File
@@ -14,6 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System;
namespace Framework.Constants namespace Framework.Constants
{ {
@@ -884,6 +885,7 @@ namespace Framework.Constants
Equipped = 0x1 Equipped = 0x1
} }
[Flags]
public enum ItemFlags : long public enum ItemFlags : long
{ {
NoPickup = 0x01, 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) 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 Playercast = 0x40, // Item's spells are castable by players
NoEquipCooldown = 0x80, // No Default 30 Seconds Cooldown When Equipped NoEquipCooldown = 0x80, // No Default 30 Seconds Cooldown When Equipped
Legacy = 0x100, Legacy = 0x100, // Effects are disabled
IsWrapper = 0x200, // Item Can Wrap Other Items IsWrapper = 0x200, // Item Can Wrap Other Items
UsesResources = 0x400, UsesResources = 0x400,
MultiDrop = 0x800, // Looting This Item Does Not Remove It From Available Loot MultiDrop = 0x800, // Looting This Item Does Not Remove It From Available Loot
+1 -1
View File
@@ -3817,7 +3817,7 @@ namespace Game.Entities
void ApplyItemEquipSpell(Item item, bool apply, bool formChange = false) void ApplyItemEquipSpell(Item item, bool apply, bool formChange = false)
{ {
if (item == null) if (item == null || item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy))
return; return;
foreach (ItemEffectRecord effectData in item.GetEffects()) foreach (ItemEffectRecord effectData in item.GetEffects())
+74 -65
View File
@@ -1470,20 +1470,51 @@ namespace Game.Entities
public void CastItemUseSpell(Item item, SpellCastTargets targets, ObjectGuid castCount, uint[] misc) public void CastItemUseSpell(Item item, SpellCastTargets targets, ObjectGuid castCount, uint[] misc)
{ {
// special learning case if (!item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy))
if (item.GetBonus().EffectCount >= 2)
{ {
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; if (item.GetEffect(0).SpellID == 483 || item.GetEffect(0).SpellID == 55884)
uint learning_spell_id = (uint)item.GetEffect(1).SpellID; {
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) if (spellInfo == null)
{ {
Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring ", item.GetEntry(), learn_spell_id); Log.outError(LogFilter.Player, "Player.CastItemUseSpell: Item (Entry: {0}) in have wrong spell id {1}, ignoring", item.GetEntry(), effectData.SpellID);
SendEquipError(InventoryResult.InternalBagError, item); continue;
return;
} }
Spell spell = new(this, spellInfo, TriggerCastFlags.None); Spell spell = new(this, spellInfo, TriggerCastFlags.None);
@@ -1495,41 +1526,13 @@ namespace Game.Entities
spell.m_fromClient = true; spell.m_fromClient = true;
spell.m_CastItem = item; 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); spell.Prepare(targets);
return; 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 // Item enchantments spells casted at use
for (EnchantmentSlot e_slot = 0; e_slot < EnchantmentSlot.Max; ++e_slot) for (EnchantmentSlot e_slot = 0; e_slot < EnchantmentSlot.Max; ++e_slot)
{ {
@@ -1786,6 +1789,9 @@ namespace Game.Entities
void ApplyItemObtainSpells(Item item, bool apply) void ApplyItemObtainSpells(Item item, bool apply)
{ {
if (item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy))
return;
foreach (ItemEffectRecord effect in item.GetEffects()) foreach (ItemEffectRecord effect in item.GetEffects())
{ {
if (effect.TriggerType != ItemSpelltriggerType.OnObtain) // On obtain trigger 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); bool canTrigger = damageInfo.GetHitMask().HasAnyFlag(ProcFlagsHit.Normal | ProcFlagsHit.Critical | ProcFlagsHit.Absorb);
if (canTrigger) if (canTrigger)
{ {
foreach (ItemEffectRecord effectData in item.GetEffects()) if (!item.GetTemplate().GetFlags().HasFlag(ItemFlags.Legacy))
{ {
// wrong triggering type foreach (ItemEffectRecord effectData in item.GetEffects())
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); // wrong triggering type
continue; 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);
} }
} }