[7990] Trigering "on hit" combat spell only at related to current hit weapon.

Also check at loading that only weapon item templates have "on hit" spell triggers.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
nos4r2zod 2009-06-11 01:24:25 +04:00 committed by VladimirMangos
parent e3fd03c7b9
commit 31957a22d6
5 changed files with 13 additions and 8 deletions

View file

@ -1688,12 +1688,18 @@ void ObjectMgr::LoadItemPrototypes()
{
for (int j = 0; j < MAX_ITEM_PROTO_SPELLS; ++j)
{
if(proto->Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || proto->Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
if (proto->Spells[j].SpellTrigger >= MAX_ITEM_SPELLTRIGGER || proto->Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_LEARN_SPELL_ID)
{
sLog.outErrorDb("Item (Entry: %u) has wrong item spell trigger value in spelltrigger_%d (%u)",i,j+1,proto->Spells[j].SpellTrigger);
const_cast<ItemPrototype*>(proto)->Spells[j].SpellId = 0;
const_cast<ItemPrototype*>(proto)->Spells[j].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
}
// on hit can be sued only at weapon
else if (proto->Spells[j].SpellTrigger == ITEM_SPELLTRIGGER_CHANCE_ON_HIT)
{
if(proto->Class != ITEM_CLASS_WEAPON)
sLog.outErrorDb("Item (Entry: %u) isn't weapon (Class: %u) but has on hit spelltrigger_%d (%u), it will not triggered.",i,proto->Class,j+1,proto->Spells[j].SpellTrigger);
}
if(proto->Spells[j].SpellId)
{

View file

@ -6828,8 +6828,9 @@ void Player::UpdateEquipSpellsAtFormChange()
}
}
void Player::CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType)
void Player::CastItemCombatSpell(Unit* Target, WeaponAttackType attType)
{
Item *item = GetWeaponForAttack(attType, true);
if(!item || item->IsBroken())
return;

View file

@ -1775,7 +1775,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change = false);
void ApplyEquipSpell(SpellEntry const* spellInfo, Item* item, bool apply, bool form_change = false);
void UpdateEquipSpellsAtFormChange();
void CastItemCombatSpell(Item *item,Unit* Target, WeaponAttackType attType);
void CastItemCombatSpell(Unit* Target, WeaponAttackType attType);
void CastItemUseSpell(Item *item,SpellCastTargets const& targets,uint8 cast_count, uint32 glyphIndex);
void SendEquipmentSetList();

View file

@ -1505,11 +1505,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
// If not miss
if (!(damageInfo->HitInfo & HITINFO_MISS))
{
// on weapon hit casts
if(GetTypeId() == TYPEID_PLAYER && pVictim->isAlive())
{
for(int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
((Player*)this)->CastItemCombatSpell(((Player*)this)->GetItemByPos(INVENTORY_SLOT_BAG_0,i), pVictim, damageInfo->attackType);
}
((Player*)this)->CastItemCombatSpell(pVictim, damageInfo->attackType);
// victim's damage shield
std::set<Aura*> alreadyDone;

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "7989"
#define REVISION_NR "7990"
#endif // __REVISION_NR_H__