Implementing CAST_FAIL_NO_LOS EventAI

Tries to fix issue [85](https://www.getmangos.eu/issue.php?issueid=85)
This commit is contained in:
H0zen 2015-11-15 11:10:44 +02:00
parent 28a9c59c89
commit 33749b7dbe
3 changed files with 21 additions and 20 deletions

View File

@ -57,6 +57,9 @@ CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell,
if (pSpell->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
{ return CAST_FAIL_STATE; }
if (!m_creature->IsWithinLOSInMap(pTarget))
{ return CAST_FAIL_NO_LOS; }
// Check for power (also done by Spell::CheckCast())
if (m_creature->GetPower((Powers)pSpell->powerType) < Spell::CalculatePowerCost(pSpell, m_creature))
{ return CAST_FAIL_POWER; }
@ -145,10 +148,19 @@ void CreatureAI::SetCombatMovement(bool enable, bool stopOrStartMovement /*=fals
if (stopOrStartMovement && m_creature->getVictim()) // Only change current movement while in combat
{
MotionMaster* creatureMotion = m_creature->GetMotionMaster();
if (enable)
{ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), m_attackDistance, m_attackAngle); }
else if (!enable && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
{ m_creature->StopMoving(); }
{
m_creature->CastStop();
creatureMotion->MoveChase(m_creature->getVictim(), m_attackDistance, m_attackAngle);
}
else if (creatureMotion->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
{
creatureMotion->MovementExpired();
creatureMotion->Clear(false);
m_creature->StopMoving();
creatureMotion->MoveIdle();
}
}
}
@ -160,8 +172,8 @@ void CreatureAI::HandleMovementOnAttackStart(Unit* victim)
// TODO - adapt this to only stop OOC-MMGens when MotionMaster rewrite is finished
else if (creatureMotion->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE || creatureMotion->GetCurrentMovementGeneratorType() == RANDOM_MOTION_TYPE)
{
creatureMotion->MoveIdle();
m_creature->StopMoving();
creatureMotion->MoveIdle();
}
}

View File

@ -52,7 +52,8 @@ enum CanCastResult
CAST_FAIL_TOO_CLOSE = 4,
CAST_FAIL_POWER = 5,
CAST_FAIL_STATE = 6,
CAST_FAIL_TARGET_AURA = 7
CAST_FAIL_TARGET_AURA = 7,
CAST_FAIL_NO_LOS = 8
};
enum CastFlags

View File

@ -637,7 +637,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
if (!target)
{
if (reportTargetError)
{ sLog.outErrorEventAI("NULL target for ACTION_T_CAST creature entry %u casting spell id %u", m_creature->GetEntry(), action.cast.spellId); }
{ sLog.outErrorEventAI("NULL target for ACTION_T_CAST %s casting spell id %u", m_creature->GetGuidStr().c_str(), action.cast.spellId); }
return;
}
@ -647,30 +647,18 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
{
case CAST_FAIL_POWER:
case CAST_FAIL_TOO_FAR:
case CAST_FAIL_NO_LOS:
{
// Melee current victim if flag not set
if (!(action.cast.castFlags & CAST_NO_MELEE_IF_OOM))
{
switch (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType())
{
case CHASE_MOTION_TYPE:
case FOLLOW_MOTION_TYPE:
m_attackDistance = 0.0f;
m_attackAngle = 0.0f;
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), m_attackDistance, m_attackAngle);
break;
default:
break;
}
SetCombatMovement(true,true);
}
break;
}
default:
break;
}
break;
}
case ACTION_T_SUMMON: //12