CombatManeuverReturns PlayerbotHunterAI::DoFirstCombatManeuver(Unit* pTarget) { Player *m_bot = GetPlayerBot(); m_has_ammo = m_bot->HasItemCount( m_bot->GetUInt32Value(PLAYER_AMMO_ID), 1 ); //DEBUG_LOG("current ammo (%u)",m_bot->GetUInt32Value(PLAYER_AMMO_ID)); m_bot->setAttackTimer(RANGED_ATTACK,0); if (!m_has_ammo) { m_ai->FindAmmo(); //DEBUG_LOG("new ammo (%u)",m_bot->GetUInt32Value(PLAYER_AMMO_ID)); m_has_ammo = m_bot->HasItemCount( m_bot->GetUInt32Value(PLAYER_AMMO_ID), 1 ); } // There are NPCs in BGs and Open World PvP, so don't filter this on PvP scenarios (of course if PvP targets anyone but tank, all bets are off anyway) // Wait until the tank says so, until any non-tank gains aggro or X seconds - whichever is shortest if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO) { if (m_WaitUntil > m_ai->CurrentTime() && m_ai->GroupTankHoldsAggro()) { return RETURN_NO_ACTION_OK; // wait it out } else { m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO); } } if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_OOC) { if (m_WaitUntil > m_ai->CurrentTime() && !m_ai->IsGroupInCombat()) return RETURN_NO_ACTION_OK; // wait it out else m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_OOC); } switch (m_ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: case PlayerbotAI::SCENARIO_PVP_BG: case PlayerbotAI::SCENARIO_PVP_ARENA: case PlayerbotAI::SCENARIO_PVP_OPENWORLD: return DoFirstCombatManeuverPVP(pTarget); case PlayerbotAI::SCENARIO_PVE: case PlayerbotAI::SCENARIO_PVE_ELITE: case PlayerbotAI::SCENARIO_PVE_RAID: default: return DoFirstCombatManeuverPVE(pTarget); break; } return RETURN_NO_ACTION_ERROR; }
CombatManeuverReturns PlayerbotShamanAI::DoFirstCombatManeuver(Unit* pTarget) { // There are NPCs in BGs and Open World PvP, so don't filter this on PvP scenarios (of course if PvP targets anyone but tank, all bets are off anyway) // Wait until the tank says so, until any non-tank gains aggro or X seconds - whichever is shortest if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO) { if (m_WaitUntil > m_ai->CurrentTime() && m_ai->GroupTankHoldsAggro()) { if (PlayerbotAI::ORDERS_HEAL & m_ai->GetCombatOrder()) return HealPlayer(GetHealTarget()); else return RETURN_NO_ACTION_OK; // wait it out } else { m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO); } } if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_OOC) { if (m_WaitUntil > m_ai->CurrentTime() && !m_ai->IsGroupInCombat()) return RETURN_NO_ACTION_OK; // wait it out else m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_OOC); } switch (m_ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: case PlayerbotAI::SCENARIO_PVP_BG: case PlayerbotAI::SCENARIO_PVP_ARENA: case PlayerbotAI::SCENARIO_PVP_OPENWORLD: return DoFirstCombatManeuverPVP(pTarget); case PlayerbotAI::SCENARIO_PVE: case PlayerbotAI::SCENARIO_PVE_ELITE: case PlayerbotAI::SCENARIO_PVE_RAID: default: return DoFirstCombatManeuverPVE(pTarget); break; } return RETURN_NO_ACTION_ERROR; }
CombatManeuverReturns PlayerbotPaladinAI::DoFirstCombatManeuver(Unit* pTarget) { // There are NPCs in BGs and Open World PvP, so don't filter this on PvP scenarios (of course if PvP targets anyone but tank, all bets are off anyway) // Wait until the tank says so, until any non-tank gains aggro or X seconds - whichever is shortest if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO) { if (m_WaitUntil > m_ai->CurrentTime() && m_ai->GroupTankHoldsAggro()) { if (PlayerbotAI::ORDERS_TANK & m_ai->GetCombatOrder()) { if (m_bot->CanReachWithMeleeAttack(pTarget)) { // Set everyone's UpdateAI() waiting to 2 seconds m_ai->SetGroupIgnoreUpdateTime(2); // Clear their TEMP_WAIT_TANKAGGRO flag m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO); // Start attacking, force target on current target m_ai->Attack(m_ai->GetCurrentTarget()); // While everyone else is waiting 2 second, we need to build up aggro, so don't return } else { // TODO: add check if target is ranged return RETURN_NO_ACTION_OK; // wait for target to get nearer } } else if (PlayerbotAI::ORDERS_HEAL & m_ai->GetCombatOrder()) return HealPlayer(GetHealTarget()); else return RETURN_NO_ACTION_OK; // wait it out } else { m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_TANKAGGRO); } } if (m_ai->GetCombatOrder() & PlayerbotAI::ORDERS_TEMP_WAIT_OOC) { if (m_WaitUntil > m_ai->CurrentTime() && m_ai->IsGroupReady()) return RETURN_NO_ACTION_OK; // wait it out else m_ai->ClearGroupCombatOrder(PlayerbotAI::ORDERS_TEMP_WAIT_OOC); } switch (m_ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_PVP_DUEL: case PlayerbotAI::SCENARIO_PVP_BG: case PlayerbotAI::SCENARIO_PVP_ARENA: case PlayerbotAI::SCENARIO_PVP_OPENWORLD: return DoFirstCombatManeuverPVP(pTarget); case PlayerbotAI::SCENARIO_PVE: case PlayerbotAI::SCENARIO_PVE_ELITE: case PlayerbotAI::SCENARIO_PVE_RAID: default: return DoFirstCombatManeuverPVE(pTarget); break; } return RETURN_NO_ACTION_ERROR; }