void CAirCAI::SlowUpdate() { if (!commandQue.empty() && commandQue.front().timeOut < gs->frameNum) { FinishCommand(); return; } if (owner->usingScriptMoveType) { return; // avoid the invalid (CAirMoveType*) cast } AAirMoveType* myPlane=(AAirMoveType*) owner->moveType; if(owner->unitDef->maxFuel > 0){ RefuelIfNeeded(); } if(commandQue.empty()){ if(myPlane->aircraftState == AAirMoveType::AIRCRAFT_FLYING && !owner->unitDef->DontLand() && myPlane->autoLand){ StopMove(); // myPlane->SetState(AAirMoveType::AIRCRAFT_LANDING); } if(owner->unitDef->canAttack && owner->fireState>=2 && owner->moveState != 0 && owner->maxRange > 0){ if(myPlane->IsFighter()){ float testRad=1000 * owner->moveState; CUnit* enemy=helper->GetClosestEnemyAircraft( owner->pos + (owner->speed * 10), testRad, owner->allyteam); if(IsValidTarget(enemy)) { Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } float testRad = 500 * owner->moveState; CUnit* enemy = helper->GetClosestEnemyUnit( owner->pos + (owner->speed * 20), testRad, owner->allyteam); if(IsValidTarget(enemy)) { Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } return; } Command& c = commandQue.front(); if (c.id == CMD_WAIT) { if ((myPlane->aircraftState == AAirMoveType::AIRCRAFT_FLYING) && !owner->unitDef->DontLand() && myPlane->autoLand) { StopMove(); // myPlane->SetState(AAirMoveType::AIRCRAFT_LANDING); } return; } if (c.id != CMD_STOP) { myPlane->Takeoff(); } float3 curPos=owner->pos; switch(c.id){ case CMD_AREA_ATTACK:{ ExecuteAreaAttack(c); return; } default:{ CMobileCAI::Execute(); return; } } }
void CAirCAI::SlowUpdate() { if(gs->paused) // Commands issued may invoke SlowUpdate when paused return; if (!commandQue.empty() && commandQue.front().timeOut < gs->frameNum) { FinishCommand(); return; } if (owner->usingScriptMoveType) { return; // avoid the invalid (CAirMoveType*) cast } AAirMoveType* myPlane=(AAirMoveType*) owner->moveType; bool wantToRefuel = LandRepairIfNeeded(); if(!wantToRefuel && owner->unitDef->maxFuel > 0){ wantToRefuel = RefuelIfNeeded(); } if(commandQue.empty()){ if(myPlane->aircraftState == AAirMoveType::AIRCRAFT_FLYING && !owner->unitDef->DontLand() && myPlane->autoLand) { StopMove(); // myPlane->SetState(AAirMoveType::AIRCRAFT_LANDING); } if(owner->unitDef->canAttack && owner->fireState >= FIRESTATE_FIREATWILL && owner->moveState != MOVESTATE_HOLDPOS && owner->maxRange > 0) { if (myPlane->IsFighter()) { float testRad=1000 * owner->moveState; CUnit* enemy=helper->GetClosestEnemyAircraft( owner->pos + (owner->speed * 10), testRad, owner->allyteam); if(IsValidTarget(enemy)) { Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } const float searchRadius = 500 * owner->moveState; CUnit* enemy = helper->GetClosestValidTarget( owner->pos + (owner->speed * 20), searchRadius, owner->allyteam, this); if (enemy != NULL) { Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } return; } Command& c = commandQue.front(); if (c.id == CMD_WAIT) { if ((myPlane->aircraftState == AAirMoveType::AIRCRAFT_FLYING) && !owner->unitDef->DontLand() && myPlane->autoLand) { StopMove(); // myPlane->SetState(AAirMoveType::AIRCRAFT_LANDING); } return; } if (c.id != CMD_STOP && c.id != CMD_AUTOREPAIRLEVEL && c.id != CMD_IDLEMODE && c.id != CMD_SET_WANTED_MAX_SPEED) { myPlane->Takeoff(); } if (wantToRefuel) { switch (c.id) { case CMD_AREA_ATTACK: case CMD_ATTACK: case CMD_FIGHT: return; } } switch(c.id){ case CMD_AREA_ATTACK:{ ExecuteAreaAttack(c); return; } default:{ CMobileCAI::Execute(); return; } } }
void CAirCAI::SlowUpdate() { if (!commandQue.empty() && commandQue.front().timeOut < gs->frameNum) { FinishCommand(); return; } if (owner->usingScriptMoveType) { return; // avoid the invalid (CAirMoveType*) cast } CAirMoveType* myPlane=(CAirMoveType*) owner->moveType; if(owner->unitDef->maxFuel > 0){ if(myPlane->reservedPad){ return; }else{ if(owner->currentFuel <= 0){ owner->userAttackGround=false; owner->userTarget=0; inCommand=false; CAirBaseHandler::LandingPad* lp = airBaseHandler->FindAirBase( owner, owner->unitDef->minAirBasePower); if(lp){ myPlane->AddDeathDependence(lp); myPlane->reservedPad = lp; myPlane->padStatus = 0; myPlane->oldGoalPos = myPlane->goalPos; return; } float3 landingPos = airBaseHandler->FindClosestAirBasePos( owner, owner->unitDef->minAirBasePower); if(landingPos != ZeroVector && owner->pos.distance2D(landingPos) > 300){ if(myPlane->aircraftState == CAirMoveType::AIRCRAFT_LANDED && owner->pos.distance2D(landingPos) > 800) { myPlane->SetState(CAirMoveType::AIRCRAFT_TAKEOFF); } myPlane->goalPos = landingPos; } else { if(myPlane->aircraftState == CAirMoveType::AIRCRAFT_FLYING) myPlane->SetState(CAirMoveType::AIRCRAFT_LANDING); } return; } if(owner->currentFuel < myPlane->repairBelowHealth * owner->unitDef->maxFuel){ if(commandQue.empty() || commandQue.front().id == CMD_PATROL){ CAirBaseHandler::LandingPad* lp = airBaseHandler->FindAirBase(owner, owner->unitDef->minAirBasePower); if(lp){ owner->userAttackGround=false; owner->userTarget=0; inCommand=false; myPlane->AddDeathDependence(lp); myPlane->reservedPad=lp; myPlane->padStatus=0; myPlane->oldGoalPos=myPlane->goalPos; if(myPlane->aircraftState == CAirMoveType::AIRCRAFT_LANDED){ myPlane->SetState(CAirMoveType::AIRCRAFT_TAKEOFF); } return; } } } } } if(commandQue.empty()){ if(myPlane->aircraftState == CAirMoveType::AIRCRAFT_FLYING && !owner->unitDef->DontLand()){ myPlane->SetState(CAirMoveType::AIRCRAFT_LANDING); } if(owner->unitDef->canAttack && owner->fireState==2 && owner->moveState != 0 && owner->maxRange > 0){ if(myPlane->isFighter){ float testRad=1000 * owner->moveState; CUnit* enemy=helper->GetClosestEnemyAircraft( owner->pos + (owner->speed * 10), testRad, owner->allyteam); if(enemy && !enemy->crashing){ Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } float testRad = 500 * owner->moveState; CUnit* enemy = helper->GetClosestEnemyUnit( owner->pos + (owner->speed * 20), testRad, owner->allyteam); if(enemy && (owner->hasUWWeapons || !enemy->isUnderWater) && !enemy->crashing && (myPlane->isFighter || !enemy->unitDef->canfly)){ Command nc; nc.id = CMD_ATTACK; nc.params.push_back(enemy->id); nc.options = 0; commandQue.push_front(nc); inCommand = false; return; } } return; } Command& c = commandQue.front(); if (c.id == CMD_WAIT) { if ((myPlane->aircraftState == CAirMoveType::AIRCRAFT_FLYING) && !owner->unitDef->DontLand()) { myPlane->SetState(CAirMoveType::AIRCRAFT_LANDING); } return; } if (c.id != CMD_STOP) { if (myPlane->aircraftState == CAirMoveType::AIRCRAFT_LANDED) { myPlane->SetState(CAirMoveType::AIRCRAFT_TAKEOFF); } if (myPlane->aircraftState == CAirMoveType::AIRCRAFT_LANDING) { myPlane->SetState(CAirMoveType::AIRCRAFT_FLYING); } } float3 curPos=owner->pos; switch(c.id){ case CMD_AREA_ATTACK:{ ExecuteAreaAttack(c); return; } default:{ CMobileCAI::Execute(); return; } } }
void CAirCAI::SlowUpdate() { // Commands issued may invoke SlowUpdate when paused if (gs->paused) return; if (!commandQue.empty() && (commandQue.front().timeOut < gs->frameNum)) { FinishCommand(); return; } // avoid the invalid (CStrafeAirMoveType*) cast if (owner->UsingScriptMoveType()) return; const bool wantToRefuel = (LandRepairIfNeeded() || RefuelIfNeeded()); #if (AUTO_GENERATE_ATTACK_ORDERS == 1) if (commandQue.empty()) { if (!AirAutoGenerateTarget(GetStrafeAirMoveType(owner))) { // if no target found, queue is still empty so bail now return; } } #endif // FIXME: check owner->UsingScriptMoveType() and skip rest if true? AAirMoveType* myPlane = GetStrafeAirMoveType(owner); Command& c = commandQue.front(); if (c.GetID() == CMD_WAIT) { if ((myPlane->aircraftState == AAirMoveType::AIRCRAFT_FLYING) && !owner->unitDef->DontLand() && myPlane->autoLand) { StopMove(); } return; } if (c.GetID() != CMD_STOP && c.GetID() != CMD_AUTOREPAIRLEVEL && c.GetID() != CMD_IDLEMODE && c.GetID() != CMD_SET_WANTED_MAX_SPEED) { myPlane->Takeoff(); } if (wantToRefuel) { switch (c.GetID()) { case CMD_AREA_ATTACK: case CMD_ATTACK: case CMD_FIGHT: return; } } switch (c.GetID()) { case CMD_AREA_ATTACK: { ExecuteAreaAttack(c); return; } default: { CMobileCAI::Execute(); return; } } }