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}