Bazaar developer reference

CvUnitCombat::AttackAir(CvUnit &, CvPlot &, ATTACK_OPTION)

Defined in
CvUnitCombat.cpp, line 3375
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_AttackAir
Lua events
GameEvents.UnitRangeAttackAt

Hooks

static bool BeforeCvUnitCombat_AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2, CvUnitCombat::ATTACK_RESULT& result);static void AfterCvUnitCombat_AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2, CvUnitCombat::ATTACK_RESULT& result);static CvUnitCombat::ATTACK_RESULT ReplaceCvUnitCombat_AttackAir(CvUnitCombat::ATTACK_RESULT (*original)(CvUnit&, CvPlot&, ATTACK_OPTION), CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION arg2);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvUnitCombat_AttackAir);host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_AFTER, (void*)&AfterCvUnitCombat_AttackAir);host->RegisterHook(host->pluginIndex, CivHooks::CvUnitCombat_AttackAir::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvUnitCombat_AttackAir);

Code

3375CvUnitCombat::ATTACK_RESULT CvUnitCombat::AttackAir(CvUnit& kAttacker, CvPlot& targetPlot, ATTACK_OPTION /* eOption */)3376{3377	//VALIDATE_OBJECT3378	CvAssert(kAttacker.getCombatTimer() == 0);33793380	CvUnitCombat::ATTACK_RESULT eResult = CvUnitCombat::ATTACK_ABORTED;33813382	// Can we actually hit the target?3383	if(!kAttacker.canRangeStrikeAt(targetPlot.getX(), targetPlot.getY()))3384	{3385		return eResult;3386	}33873388	bool bDoImmediate = CvPreGame::quickCombat();3389	kAttacker.SetAutomateType(NO_AUTOMATE);3390	kAttacker.setMadeAttack(true);33913392	// Bombing a Unit3393	if(!targetPlot.isCity())3394	{3395		CvUnit* pDefender = kAttacker.airStrikeTarget(targetPlot, true);33963397#if defined(MOD_EVENTS_UNIT_RANGEATTACK)3398		if (!pDefender) {3399			if (MOD_EVENTS_UNIT_RANGEATTACK) {3400				int iValue = 0;3401				if (GAMEEVENTINVOKE_VALUE(iValue, GAMEEVENT_UnitRangeAttackAt, kAttacker.getOwner(), kAttacker.GetID(), targetPlot.getX(), targetPlot.getY()) == GAMEEVENTRETURN_VALUE) {3402					if (iValue) {3403						return CvUnitCombat::ATTACK_COMPLETED;3404					}34053406					return CvUnitCombat::ATTACK_ABORTED;3407				}3408			}3409		}3410#endif34113412		CvAssert(pDefender != NULL);3413		if(!pDefender) return CvUnitCombat::ATTACK_ABORTED;34143415		pDefender->SetAutomateType(NO_AUTOMATE);3416#if defined(MOD_BUGFIX_UNITS_AWAKE_IN_DANGER)3417		if (MOD_BUGFIX_UNITS_AWAKE_IN_DANGER) {3418			pDefender->SetActivityType(ACTIVITY_AWAKE, false); 3419		}3420#endif34213422		CvCombatInfo kCombatInfo;3423		CvUnitCombat::GenerateAirCombatInfo(kAttacker, pDefender, targetPlot, &kCombatInfo);3424		CvAssertMsg(!kAttacker.isDelayedDeath() && !pDefender->isDelayedDeath(), "Trying to battle and one of the units is already dead!");34253426		uint uiParentEventID = 0;3427		if(!bDoImmediate)3428		{3429			// Center camera here!3430			bool isTargetVisibleToActivePlayer = targetPlot.isActiveVisible(false);3431			if(isTargetVisibleToActivePlayer)3432			{3433				auto_ptr<ICvPlot1> pDllTargetPlot = GC.WrapPlotPointer(&targetPlot);3434				GC.GetEngineUserInterface()->lookAt(pDllTargetPlot.get(), CAMERALOOKAT_NORMAL);3435			}3436			kCombatInfo.setVisualizeCombat(isTargetVisibleToActivePlayer);34373438			auto_ptr<ICvCombatInfo1> pDllCombatInfo(new CvDllCombatInfo(&kCombatInfo));3439			uiParentEventID = gDLL->GameplayUnitCombat(pDllCombatInfo.get());34403441			// Set the combat units so that other missions do not continue until combat is over.3442			kAttacker.setCombatUnit(pDefender, true);3443			pDefender->setCombatUnit(&kAttacker, false);3444			CvUnit* pDefenderSupport = kCombatInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);3445			if(pDefenderSupport)3446				pDefenderSupport->setCombatUnit(&kAttacker, false);34473448			eResult = ATTACK_QUEUED;3449		}3450		else3451			eResult = ATTACK_COMPLETED;34523453		ResolveCombat(kCombatInfo, uiParentEventID);3454	}3455	// Bombing a City3456	else3457	{3458		CvCombatInfo kCombatInfo;3459		GenerateAirCombatInfo(kAttacker, NULL, targetPlot, &kCombatInfo);3460		CvAssertMsg(!kAttacker.isDelayedDeath(), "Trying to battle and the attacker is already dead!");34613462		uint uiParentEventID = 0;3463		if(!bDoImmediate)3464		{3465			// Center camera here!3466			bool isTargetVisibleToActivePlayer = targetPlot.isActiveVisible(false);3467			if(isTargetVisibleToActivePlayer)3468			{3469				auto_ptr<ICvPlot1> pDllTargetPlot = GC.WrapPlotPointer(&targetPlot);3470				GC.GetEngineUserInterface()->lookAt(pDllTargetPlot.get(), CAMERALOOKAT_NORMAL);3471			}34723473			kCombatInfo.setVisualizeCombat(isTargetVisibleToActivePlayer);3474			auto_ptr<ICvCombatInfo1> pDllCombatInfo(new CvDllCombatInfo(&kCombatInfo));3475			uiParentEventID = gDLL->GameplayCityCombat(pDllCombatInfo.get());34763477			CvCity* pkDefender = targetPlot.getPlotCity();3478			kAttacker.setCombatCity(pkDefender);3479			if(pkDefender)3480				pkDefender->setCombatUnit(&kAttacker);3481			CvUnit* pDefenderSupport = kCombatInfo.getUnit(BATTLE_UNIT_INTERCEPTOR);3482			if(pDefenderSupport)3483				pDefenderSupport->setCombatUnit(&kAttacker, false);3484			eResult = ATTACK_QUEUED;3485		}3486		else3487			eResult = ATTACK_COMPLETED;34883489		ResolveCombat(kCombatInfo, uiParentEventID);3490	}34913492	return eResult;3493}

Calls

Called by