void TargetedMovementGenerator::spellAtack(Creature &owner,Unit &who,uint32 spellId) { SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId ); if(!spellInfo) { sLog.outError("WORLD: unknown spell id %i\n", spellId); return; } owner.StopMoving(); owner->Idle(); if(owner.m_currentSpell) { if(owner.m_currentSpell->m_spellInfo->Id == spellInfo->Id ) return; else { owner.m_currentSpell->cancel(); } } Spell *spell = new Spell(&owner, spellInfo, false, 0); spell->SetAutoRepeat(false); //owner.addUnitState(UNIT_STAT_ATTACKING); //owner.clearUnitState(UNIT_STAT_CHASE); SpellCastTargets targets; targets.setUnitTarget( &who ); spell->prepare(&targets); owner.m_canMove = false; DEBUG_LOG("Spell Attack."); }
void TargetedMovementGenerator::_spellAtack(Creature &owner, SpellEntry* spellInfo) { if(!spellInfo) return; owner.StopMoving(); owner->Idle(); if(owner.m_currentSpell) { if(owner.m_currentSpell->m_spellInfo->Id == spellInfo->Id ) return; else { owner.m_currentSpell->cancel(); } } Spell *spell = new Spell(&owner, spellInfo, false, 0); spell->SetAutoRepeat(true); //owner.addUnitState(UNIT_STAT_ATTACKING); owner.Attack(&owner); //?? owner.clearUnitState(UNIT_STAT_CHASE); SpellCastTargets targets; targets.setUnitTarget( &i_target ); spell->prepare(&targets); owner.m_canMove = false; DEBUG_LOG("Spell Attack."); }
void PetAI::UpdateAI(const uint32 diff) { // update i_victimGuid if i_pet.getVictim() !=0 and changed if(i_pet.getVictim()) i_victimGuid = i_pet.getVictim()->GetGUID(); // i_pet.getVictim() can't be used for check in case stop fighting, i_pet.getVictim() clearóâ at Unit death etc. if( i_victimGuid ) { if( _needToStop() ) { DEBUG_LOG("Pet AI stoped attacking [guid=%u]", i_pet.GetGUIDLow()); _stopAttack(); // i_victimGuid == 0 && i_pet.getVictim() == NULL now return; } else if( i_pet.IsStopped() ) { SpellEntry *spellInfo; if ( i_pet.m_currentSpell ) { if( i_pet.hasUnitState(UNIT_STAT_FOLLOW) ) i_pet.m_currentSpell->cancel(); else return; } else if( !i_pet.hasUnitState(UNIT_STAT_FOLLOW) && ((Pet*)&i_pet)->HasActState(STATE_RA_AUTOSPELL) && (spellInfo = i_pet.reachWithSpellAttack(i_pet.getVictim()))) { Spell *spell = new Spell(&i_pet, spellInfo, false, 0); spell->SetAutoRepeat(true); SpellCastTargets targets; targets.setUnitTarget( i_pet.getVictim() ); spell->prepare(&targets); i_pet.m_canMove = false; DEBUG_LOG("Spell Attack."); } else if( i_pet.isAttackReady() && i_pet.canReachWithAttack(i_pet.getVictim()) ) { i_pet.AttackerStateUpdate(i_pet.getVictim()); i_pet.resetAttackTimer(); if ( !i_pet.getVictim() ) return; if( _needToStop() ) _stopAttack(); } } } else { if(i_owner && i_owner->isInCombat()) { AttackStart(i_owner->getAttackerForHelper()); } else if(i_owner && ((Pet*)&i_pet)->HasActState(STATE_RA_FOLLOW)) { if (!i_pet.hasUnitState(UNIT_STAT_FOLLOW)) { i_pet.addUnitState(UNIT_STAT_FOLLOW); i_pet->Clear(); i_pet->Mutate(new TargetedMovementGenerator(*i_owner)); } } } }