CvUnitMission::AutoMission(UnitHandle)
- Defined in
- CvUnitMission.cpp, line 62
- Class
- CvUnitMission
- Hook name
CivHooks::CvUnitMission_AutoMission
Hooks
static bool BeforeCvUnitMission_AutoMission(UnitHandle hUnit);static void AfterCvUnitMission_AutoMission(UnitHandle hUnit);static void ReplaceCvUnitMission_AutoMission(void (*original)(UnitHandle), UnitHandle hUnit);CivRegisterBefore<CivHooks::CvUnitMission_AutoMission>(host, &BeforeCvUnitMission_AutoMission);CivRegisterAfter<CivHooks::CvUnitMission_AutoMission>(host, &AfterCvUnitMission_AutoMission);CivRegisterReplace<CivHooks::CvUnitMission_AutoMission>(host, &ReplaceCvUnitMission_AutoMission);
Code
61/// Perform automated mission62void CvUnitMission::AutoMission(UnitHandle hUnit)63{64 CvAssert(hUnit->getOwner() != NO_PLAYER);6566 const MissionQueueNode* pkMissionNode = HeadMissionQueueNode(hUnit->m_missionQueue);67 if(pkMissionNode != NULL)68 {69 if(!hUnit->IsBusy() && !hUnit->isDelayedDeath())70 {71 // Builders which are being escorted shouldn't wake up every turn... this is annoying!72 bool bEscortedBuilder = false;73 if(pkMissionNode->eMissionType == CvTypes::getMISSION_BUILD())74 {75 if(hUnit->plot()->getNumDefenders(hUnit->getOwner()) > 0)76 {77 bEscortedBuilder = true;78 }79 }8081#if defined(MOD_BUGFIX_WORKERS_VISIBLE_DANGER)82 bool bAbortMission = (!bEscortedBuilder && !hUnit->IsIgnoringDangerWakeup());83 // Remove the line below to have combat units behave like workers, waking at every opportunity!84 bAbortMission = (bAbortMission && !hUnit->IsCombatUnit());8586 // Only change human player's units' behaviour87 if (GET_PLAYER(hUnit->getOwner()).isHuman() && MOD_BUGFIX_WORKERS_VISIBLE_DANGER) {88 // Stop only if the worker can actually see the enemy89 bAbortMission = (bAbortMission && hUnit->SentryAlert(true));90 } else {91 // Stop if there is any hint of an enemy92 bAbortMission = (bAbortMission && GET_PLAYER(hUnit->getOwner()).IsPlotUnderImmediateThreat(*(hUnit->plot())));93 }9495 if(bAbortMission)96#else97 if(!bEscortedBuilder && !hUnit->IsIgnoringDangerWakeup() && !hUnit->IsCombatUnit() && GET_PLAYER(hUnit->getOwner()).IsPlotUnderImmediateThreat(*(hUnit->plot())))98#endif99 {100 hUnit->ClearMissionQueue();101 hUnit->SetIgnoreDangerWakeup(true);102 }103 else104 {105 if(hUnit->GetActivityType() == ACTIVITY_MISSION)106 {107 ContinueMission(hUnit);108 }109 else110 {111 StartMission(hUnit);112 }113 }114 }115 }116117 hUnit.ignoreDestruction(true);118 hUnit->doDelayedDeath();119}
Calls
- CustomMods::isBUGFIX_WORKERS_VISIBLE_DANGER()
- CvPlayer::isHuman() const
- CvPlayer::IsPlotUnderImmediateThreat(CvPlot &) const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlot::getNumDefenders(PlayerTypes) const
- CvTypes::getMISSION_BUILD()
- CvUnit::ClearMissionQueue(int)
- CvUnit::doDelayedDeath()
- CvUnit::GetActivityType() const
- CvUnit::getOwner() const
- CvUnit::IsBusy() const
- CvUnit::IsCombatUnit() const
- CvUnit::isDelayedDeath() const
- CvUnit::IsIgnoringDangerWakeup() const
- CvUnit::plot() const
- CvUnit::SentryAlert(bool) const
- CvUnit::SetIgnoreDangerWakeup(bool)
- CvUnitMission::ContinueMission(UnitHandle, int, int)
- CvUnitMission::HeadMissionQueueNode(MissionQueue &)
- CvUnitMission::StartMission(UnitHandle)
FObjectHandle::FObjectHandleFObjectHandle::ignoreDestructionFObjectHandle::operator->