Bazaar developer reference

IgnoreUnitsValid(CvAStarNode *, CvAStarNode *, int, const void *, CvAStar *)

Defined in
CvAStar.cpp, line 1883
Hook name
CivHooks::IgnoreUnitsValid

Hooks

static bool BeforeIgnoreUnitsValid(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder, int& result);static void AfterIgnoreUnitsValid(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder, int& result);static int ReplaceIgnoreUnitsValid(int (*original)(CvAStarNode*, CvAStarNode*, int, const void*, CvAStar*), CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder);CivRegisterBefore<CivHooks::IgnoreUnitsValid>(host, &BeforeIgnoreUnitsValid);CivRegisterAfter<CivHooks::IgnoreUnitsValid>(host, &AfterIgnoreUnitsValid);CivRegisterReplace<CivHooks::IgnoreUnitsValid>(host, &ReplaceIgnoreUnitsValid);

Code

1882/// Ignore units path finder - check validity of a coordinate1883int IgnoreUnitsValid(CvAStarNode* parent, CvAStarNode* node, int data, const void* pointer, CvAStar* finder)1884{1885	CvUnit* pUnit;1886	CvPlot* pFromPlot;1887	CvPlot* pToPlot;1888	bool bAIControl;18891890	if(parent == NULL)1891	{1892		return TRUE;1893	}18941895	CvMap& theMap = GC.getMap();18961897	pFromPlot = theMap.plotUnchecked(parent->m_iX, parent->m_iY);1898	pToPlot = theMap.plotUnchecked(node->m_iX, node->m_iY);18991900	pUnit = ((CvUnit*)pointer);1901	const UnitPathCacheData* pCacheData = reinterpret_cast<const UnitPathCacheData*>(finder->GetScratchBuffer());19021903	TeamTypes eUnitTeam = pCacheData->getTeam();19041905	CvPlot* pUnitPlot = theMap.plotUnchecked(pUnit->getX(), pUnit->getY());19061907	// slewis - moved this up so units can't move directly into the water. Not 100% sure this is the right solution.1908	if(pCacheData->getDomainType() == DOMAIN_LAND)1909	{1910#if defined(MOD_PATHFINDER_TERRAFIRMA)1911		bool bFromTerraFirma = pFromPlot->isTerraFirma(pUnit);1912		bool bToWater = !pToPlot->isTerraFirma(pUnit);1913		if(bFromTerraFirma && bToWater && pToPlot->isRevealed(eUnitTeam) && !pUnit->canEmbarkOnto(*pFromPlot, *pToPlot, true))1914#else1915		if(!pFromPlot->isWater() && pToPlot->isWater() && pToPlot->isRevealed(eUnitTeam) && !pUnit->canEmbarkOnto(*pFromPlot, *pToPlot, true))1916#endif1917		{1918			return FALSE;1919		}1920	}19211922	if(pUnitPlot == pFromPlot)1923	{1924		return TRUE;1925	}19261927	if(finder->GetInfo() & MOVE_TERRITORY_NO_UNEXPLORED)1928	{1929		if(!(pFromPlot->isRevealed(eUnitTeam)))1930		{1931			return FALSE;1932		}19331934		if(pFromPlot->isOwned())1935		{1936			if(pFromPlot->getTeam() != eUnitTeam)1937			{1938				return FALSE;1939			}1940		}1941	}19421943	if(finder->GetInfo() & MOVE_TERRITORY_NO_ENEMY)1944	{1945		if(pFromPlot->isOwned())1946		{1947			if(atWar(pFromPlot->getTeam(), eUnitTeam))1948			{1949				return FALSE;1950			}1951		}1952	}19531954	bAIControl = pUnit->IsAutomated();19551956	// slewis - added AI check and embark check to prevent units from moving into unexplored areas1957	if(bAIControl || (pFromPlot->isRevealed(eUnitTeam) || pCacheData->isEmbarked()) || !pCacheData->isHuman())1958	{1959		if(!pUnit->canEnterTerrain(*pToPlot, CvUnit::MOVEFLAG_PRETEND_CORRECT_EMBARK_STATE) || !pUnit->canEnterTerritory(eUnitTeam))1960		{1961			return FALSE;1962		}1963	}19641965	return TRUE;1966}

Calls

Called by