diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index a3e115fd6..1a0b39ebf 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4207,15 +4207,18 @@ SpellCastResult Spell::CheckCast(bool strict) } // only allow triggered spells if at an ended battleground - if( !m_IsTriggeredSpell && m_caster->GetTypeId() == TYPEID_PLAYER) + if (!m_IsTriggeredSpell && m_caster->GetTypeId() == TYPEID_PLAYER) if(BattleGround * bg = ((Player*)m_caster)->GetBattleGround()) if(bg->GetStatus() == STATUS_WAIT_LEAVE) return SPELL_FAILED_DONT_REPORT; - if(m_caster->GetTypeId() == TYPEID_PLAYER && !((Player*)m_caster)->isGameMaster() && - VMAP::VMapFactory::createOrGetVMapManager()->isLineOfSightCalcEnabled()) + if (m_caster->isInCombat() && IsNonCombatSpell(m_spellInfo)) + return m_triggeredByAuraSpell ? SPELL_FAILED_DONT_REPORT : SPELL_FAILED_AFFECTING_COMBAT; + + if (m_caster->GetTypeId() == TYPEID_PLAYER && !((Player*)m_caster)->isGameMaster() && + VMAP::VMapFactory::createOrGetVMapManager()->isLineOfSightCalcEnabled()) { - if(m_spellInfo->Attributes & SPELL_ATTR_OUTDOORS_ONLY && + if (m_spellInfo->Attributes & SPELL_ATTR_OUTDOORS_ONLY && !m_caster->GetMap()->IsOutdoors(m_caster->GetPositionX(), m_caster->GetPositionY(), m_caster->GetPositionZ())) return SPELL_FAILED_ONLY_OUTDOORS; @@ -4902,7 +4905,7 @@ SpellCastResult Spell::CheckCast(bool strict) if(!pet->GetCurrentFoodBenefitLevel(foodItem->GetProto()->ItemLevel)) return SPELL_FAILED_FOOD_LOWLEVEL; - if(m_caster->isInCombat() || pet->isInCombat()) + if(pet->isInCombat()) return SPELL_FAILED_AFFECTING_COMBAT; break; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 88a490b1c..00fafdefe 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -7457,6 +7457,12 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) if (isCharmed() || (GetTypeId()!=TYPEID_PLAYER && ((Creature*)this)->isPet())) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); + // interrupt all delayed non-combat casts + for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i) + if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i))) + if (IsNonCombatSpell(spell->m_spellInfo)) + InterruptSpell(CurrentSpellTypes(i),false); + if (creatureNotInCombat) { // should probably be removed for the attacked (+ it's party/group) only, not global diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index eb780fdcd..76fae9633 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10335" + #define REVISION_NR "10336" #endif // __REVISION_NR_H__