Hooks
static bool BeforeCvLuaPlayer_lGetRecommendedWorkerPlots(lua_State* L, int& result);static void AfterCvLuaPlayer_lGetRecommendedWorkerPlots(lua_State* L, int& result);static int ReplaceCvLuaPlayer_lGetRecommendedWorkerPlots(int (*original)(lua_State*), lua_State* L);CivRegisterBefore<CivHooks::CvLuaPlayer_lGetRecommendedWorkerPlots>(host, &BeforeCvLuaPlayer_lGetRecommendedWorkerPlots);CivRegisterAfter<CivHooks::CvLuaPlayer_lGetRecommendedWorkerPlots>(host, &AfterCvLuaPlayer_lGetRecommendedWorkerPlots);CivRegisterReplace<CivHooks::CvLuaPlayer_lGetRecommendedWorkerPlots>(host, &ReplaceCvLuaPlayer_lGetRecommendedWorkerPlots);
Code
9225int CvLuaPlayer::lGetRecommendedWorkerPlots(lua_State* L)9226{9227 CvPlayerAI* pkPlayer = GetInstance(L);92289229 CvUnit* pWorkerUnit = NULL;92309231#if defined(MOD_API_LUA_EXTENSIONS) && defined(MOD_UNITS_LOCAL_WORKERS)9232 if (MOD_UNITS_LOCAL_WORKERS) {9233 //Get head selected unit (which will be a worker).9234 auto_ptr<ICvUnit1> pSelectedUnit(DLLUI->GetHeadSelectedUnit());9235 pWorkerUnit = GC.UnwrapUnitPointer(pSelectedUnit.get());9236 } else {9237#endif9238 //Get first selected worker.9239 CvEnumerator<ICvUnit1> selectedUnits(GC.GetEngineUserInterface()->GetSelectedUnits());9240 while(selectedUnits.MoveNext())9241 {9242 auto_ptr<ICvUnit1> pUnit(selectedUnits.GetCurrent());9243 if(pUnit.get() != NULL)9244 {9245 CvUnitEntry* pUnitEntry = GC.getUnitInfo(pUnit->GetUnitType());9246 if(pUnitEntry && pUnitEntry->GetWorkRate() > 0)9247 {9248 pWorkerUnit = GC.UnwrapUnitPointer(pUnit.get());9249 break;9250 }9251 }9252 }9253#if defined(MOD_API_LUA_EXTENSIONS) && defined(MOD_UNITS_LOCAL_WORKERS)9254 }9255#endif92569257 //Early out9258 if(pWorkerUnit == NULL)9259 {9260 return 0;9261 }92629263 const size_t cuiMaxDirectives = 3;9264 const size_t cuiDirectiveSize = 4;9265 BuilderDirective aDirective[ cuiDirectiveSize ];9266 bool bUseDirective[cuiDirectiveSize];9267 CvPlot* pDirectivePlots[cuiDirectiveSize] = {0};92689269#if defined(MOD_API_LUA_EXTENSIONS) && defined(MOD_UNITS_LOCAL_WORKERS)9270 if (MOD_UNITS_LOCAL_WORKERS) {9271 pkPlayer->GetBuilderTaskingAI()->EvaluateBuilder(pWorkerUnit, aDirective, cuiDirectiveSize, true, false, pkPlayer->isHuman());9272 } else {9273#endif9274 pkPlayer->GetBuilderTaskingAI()->EvaluateBuilder(pWorkerUnit, aDirective, cuiDirectiveSize, true);9275#if defined(MOD_API_LUA_EXTENSIONS) && defined(MOD_UNITS_LOCAL_WORKERS)9276 }9277#endif92789279 for(uint ui = 0; ui < cuiDirectiveSize; ui++)9280 {9281 bUseDirective[ui] = false;92829283 if(aDirective[ui].m_eDirective != BuilderDirective::NUM_DIRECTIVES)9284 {9285 CvPlot* pPlot = GC.getMap().plot(aDirective[ui].m_sX, aDirective[ui].m_sY);9286 if(pPlot != NULL)9287 {9288 // Don't recommend plots that are already improved9289 if(aDirective[ui].m_eDirective != BuilderDirective::BUILD_IMPROVEMENT || pPlot->getImprovementType() == NO_IMPROVEMENT)9290 {9291 pDirectivePlots[ui] = pPlot;9292 bUseDirective[ui] = true;9293 }9294 }9295 }9296 }92979298 lua_createtable(L, cuiMaxDirectives, 0);9299 int iPositionIndex = lua_gettop(L);9300 int i = 1;93019302 for(uint ui = 0; ui < cuiDirectiveSize && i < cuiMaxDirectives; ui++)9303 {9304 if(bUseDirective[ui] == true)9305 {9306 lua_createtable(L, 0, 2);9307 CvLuaPlot::Push(L, pDirectivePlots[ui]);9308 lua_setfield(L, -2, "plot");9309 lua_pushinteger(L, aDirective[ui].m_eBuild);9310 lua_setfield(L, -2, "buildType");93119312 lua_rawseti(L, iPositionIndex, i);9313 i++;9314 }9315 }93169317 return 1;9318}