Bazaar developer reference

CvUnit::canBuild(const CvPlot *, BuildTypes, bool, bool) const

Defined in
CvUnit.cpp, line 10298
Class
CvUnit
Hook name
CivHooks::CvUnit_canBuild
Lua events
GameEvents.PlayerCanBuild

Hooks

static bool BeforeCvUnit_canBuild(const CvUnit* self, const CvPlot* pPlot, BuildTypes eBuild, bool bTestVisible, bool bTestGold, bool& result);static void AfterCvUnit_canBuild(const CvUnit* self, const CvPlot* pPlot, BuildTypes eBuild, bool bTestVisible, bool bTestGold, bool& result);static bool ReplaceCvUnit_canBuild(bool (*original)(const CvUnit*, const CvPlot*, BuildTypes, bool, bool), const CvUnit* self, const CvPlot* pPlot, BuildTypes eBuild, bool bTestVisible, bool bTestGold);CivRegisterBefore<CivHooks::CvUnit_canBuild>(host, &BeforeCvUnit_canBuild);CivRegisterAfter<CivHooks::CvUnit_canBuild>(host, &AfterCvUnit_canBuild);CivRegisterReplace<CivHooks::CvUnit_canBuild>(host, &ReplaceCvUnit_canBuild);

Code

10298bool CvUnit::canBuild(const CvPlot* pPlot, BuildTypes eBuild, bool bTestVisible, bool bTestGold) const10299{10300	VALIDATE_OBJECT10301	CvAssertMsg(eBuild < GC.getNumBuildInfos() && eBuild >= 0, "Index out of bounds");103021030310304	if(!(m_pUnitInfo->GetBuilds(eBuild)))10305	{10306		return false;10307	}1030810309	CvBuildInfo *pkBuildInfo = GC.getBuildInfo(eBuild);10310	if (!pkBuildInfo)10311	{10312		return false;10313	}1031410315	// If prophet has  started spreading religion, can't do other functions10316	if(m_pUnitInfo->IsSpreadReligion())10317	{10318		if (GetReligionData()->GetReligion() != NO_RELIGION && GetReligionData()->GetSpreadsLeft() < m_pUnitInfo->GetReligionSpreads())10319		{10320			return false;10321		}10322	}1032310324	if(!(GET_PLAYER(getOwner()).canBuild(pPlot, eBuild, false, bTestVisible, bTestGold)))10325	{10326		return false;10327	}1032810329#if defined(MOD_AI_SECONDARY_WORKERS)10330	bool bValidBuildPlot = pPlot->isValidDomainForAction(*this) ||10331		                  (pkBuildInfo->IsWater() && getDomainType() == DOMAIN_LAND && pPlot->isWater() && IsHasEmbarkAbility());10332	if(!bValidBuildPlot)10333#else10334	if(!pPlot->isValidDomainForAction(*this))10335#endif10336	{10337		return false;10338	}1033910340 	if (pPlot->isWater())10341 	{10342#if defined(MOD_BUGFIX_UNITCLASS_NOT_UNIT)10343		// Needs the associated SQL executing - UPDATE Builds SET CanBeEmbarked=1 WHERE Type='BUILD_FISHING_BOATS_NO_KILL';10344		if ((isEmbarked() && !pkBuildInfo->IsCanBeEmbarked()))10345#else10346		if ((isEmbarked() && !pkBuildInfo->IsCanBeEmbarked())  && (strcmp("UNIT_JAPANESE_SAMURAI", getUnitInfo().GetType()) != 0))10347#endif10348		{10349 			return false;10350		}10351 	}1035210353	if(!bTestVisible)10354	{10355		// check for any other units working in this plot10356		pPlot = plot();10357		const IDInfo* pUnitNode = pPlot->headUnitNode();10358		const CvUnit* pLoopUnit = NULL;1035910360		while(pUnitNode != NULL)10361		{10362			pLoopUnit = ::getUnit(*pUnitNode);10363			pUnitNode = pPlot->nextUnitNode(pUnitNode);1036410365			if(pLoopUnit && pLoopUnit != this)10366			{10367				if(pLoopUnit->IsWork() && pLoopUnit->getBuildType() != NO_BUILD)10368				{10369					return false;10370				}10371			}10372		}10373	}1037410375#if defined(MOD_EVENTS_PLOT)10376	if (MOD_EVENTS_PLOT) {10377		if (GAMEEVENTINVOKE_TESTALL(GAMEEVENT_PlayerCanBuild, getOwner(), GetID(), getX(), getY(), eBuild) == GAMEEVENTRETURN_FALSE) {10378			return false;10379		}10380	}10381#endif1038210383	return true;10384}

Calls

Called by