Core/Items: Disable effects on items marked as legacy
Port From (https://github.com/TrinityCore/TrinityCore/commit/c34e0f80a0337ba582aeee17a478081f99a69686)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -1563,7 +1566,7 @@ namespace Game.Entities
|
|||||||
spell.Prepare(targets);
|
spell.Prepare(targets);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint GetLastPotionId() { return m_lastPotionId; }
|
public uint GetLastPotionId() { return m_lastPotionId; }
|
||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user