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}