Index: game/Spell.cpp =================================================================== --- game/Spell.cpp (revision 5268) +++ game/Spell.cpp (working copy) @@ -2378,14 +2379,10 @@ m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL,0); } - if (m_caster->GetTypeId() != TYPEID_PLAYER) - return; - WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 ); data.append(m_caster->GetPackGUID()); data << time; - - ((Player*)m_caster)->GetSession()->SendPacket( &data ); + m_caster->SendMessageToSet(&data,true); } void Spell::SendChannelStart(uint32 duration) @@ -3838,7 +3835,7 @@ case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL: { if(m_caster->GetTypeId() != TYPEID_PLAYER) return SPELL_FAILED_TARGET_NOT_PLAYER; - if(m_spellInfo->rangeIndex == 1 || m_spellInfo->rangeIndex == 2 || m_spellInfo->rangeIndex == 7) + if(m_spellInfo->rangeIndex == 1 || m_spellInfo->rangeIndex == 2 || m_spellInfo->rangeIndex == 6 || m_spellInfo->rangeIndex == 7) break; Item *pItem = ((Player*)m_caster)->GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED ); if(!pItem || pItem->IsBroken() || pItem->GetProto()->Class != ITEM_CLASS_WEAPON ) @@ -3901,7 +3898,7 @@ void Spell::Delayed(int32 delaytime) { - if(!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER) + if(!m_caster) return; if (m_spellState == SPELL_STATE_DELAYED) @@ -3912,35 +3909,40 @@ return; //check resist chance - int32 resistChance = 100; //must be initialized to 100 for percent modifiers - ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this); - resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100; - if (roll_chance_f(resistChance)) - return; + if ( m_caster->GetTypeId() == TYPEID_PLAYER ) + { + int32 resistChance = 100; //must be initialized to 100 for percent modifiers + ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this); + resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100; + if (roll_chance_f(resistChance)) + return; + } m_timer += delaytime; if(int32(m_timer) > casttime) ReSetTimer(); - WorldPacket data(SMSG_SPELL_DELAYED, 8+4); - data.append(m_caster->GetPackGUID()); - data << uint32(delaytime); - - ((Player*)m_caster)->GetSession()->SendPacket(&data); + WorldPacket data(SMSG_SPELL_DELAYED, 8+4); + data.append(m_caster->GetPackGUID()); + data << uint32(delaytime); + m_caster->SendMessageToSet(&data, true); } void Spell::DelayedChannel(int32 delaytime) { - if(!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER || getState() != SPELL_STATE_CASTING) + if(!m_caster || getState() != SPELL_STATE_CASTING) return; //check resist chance - int32 resistChance = 100; //must be initialized to 100 for percent modifiers - ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this); - resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100; - if (roll_chance_f(resistChance)) - return; + if ( m_caster->GetTypeId() == TYPEID_PLAYER ) + { + int32 resistChance = 100; //must be initialized to 100 for percent modifiers + ((Player*)m_caster)->ApplySpellMod(m_spellInfo->Id,SPELLMOD_NOT_LOSE_CASTING_TIME,resistChance, this); + resistChance += m_caster->GetTotalAuraModifier(SPELL_AURA_RESIST_PUSHBACK) - 100; + if (roll_chance_f(resistChance)) + return; + } int32 appliedDelayTime = delaytime; Index: game/Unit.cpp =================================================================== --- game/Unit.cpp (revision 5268) +++ game/Unit.cpp (working copy) @@ -924,9 +925,23 @@ } } - if (damagetype != NODAMAGE) + if (damagetype != NODAMAGE && damage) { - if(pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL] && pVictim->GetTypeId() == TYPEID_PLAYER && damage) + + for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++) + { + // skip channeled spell (processed differently below) + if (i == CURRENT_CHANNELED_SPELL) + continue; + + if(pVictim->m_currentSpells[i] && damagetype != DOT) + { + sLog.outDetail("Spell Delayed!%d",(int32)(0.25f * pVictim->m_currentSpells[i]->casttime)); + pVictim->m_currentSpells[i]->Delayed((int32)(0.25f * pVictim->m_currentSpells[i]->casttime)); + } + } + + if(pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]) { if (pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() == SPELL_STATE_CASTING) { @@ -2325,47 +2354,7 @@ } } - if (pVictim->GetTypeId() == TYPEID_PLAYER && *damage) - { - for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++) - { - // skip channeled spell (processed differently below) - if (i == CURRENT_CHANNELED_SPELL) - continue; - - if(pVictim->m_currentSpells[i]) - { - sLog.outDetail("Spell Delayed!%d",(int32)(0.25f * pVictim->m_currentSpells[i]->casttime)); - pVictim->m_currentSpells[i]->Delayed((int32)(0.25f * pVictim->m_currentSpells[i]->casttime)); - } - } - - // process channeled spell separately - if (pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]) - { - if (pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() == SPELL_STATE_CASTING) - { - uint32 channelInterruptFlags = pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->ChannelInterruptFlags; - if( channelInterruptFlags & CHANNEL_FLAG_DELAY ) - { - sLog.outDetail("Spell Delayed!%d",(int32)(0.25f * GetDuration(pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo))); - pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->DelayedChannel((int32)(0.25f * GetDuration(pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo))); - return; - } - else if( !(channelInterruptFlags & (CHANNEL_FLAG_DAMAGE | CHANNEL_FLAG_DAMAGE2)) ) - return; - - sLog.outDetail("Spell Canceled!"); - pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel(); - } - else if (pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() == SPELL_STATE_DELAYED) - { - // break channeled spell in delayed state on damage - sLog.outDetail("Spell Canceled!"); - pVictim->m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel(); - } - } - } + } void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool isTriggered)