diff --git a/plugins/diggingInvaders/assignJob.h b/plugins/diggingInvaders/assignJob.h index 735ba22ab..2e7bcb788 100644 --- a/plugins/diggingInvaders/assignJob.h +++ b/plugins/diggingInvaders/assignJob.h @@ -10,3 +10,4 @@ using namespace std; int32_t assignJob(color_ostream& out, Edge firstImportantEdge, unordered_map parentMap, unordered_map& costMap, vector& invaders, unordered_set& requiresZNeg, unordered_set& requiresZPos, MapExtras::MapCache& cache); + diff --git a/plugins/diggingInvaders/diggingInvaders.cpp b/plugins/diggingInvaders/diggingInvaders.cpp index 57942fd00..fe573b4c3 100644 --- a/plugins/diggingInvaders/diggingInvaders.cpp +++ b/plugins/diggingInvaders/diggingInvaders.cpp @@ -47,7 +47,6 @@ #include "df/unit_inventory_item.h" #include "df/world.h" - #include #include #include @@ -113,16 +112,48 @@ public: }; //bool important(df::coord pos, map >& edges, df::coord prev, set& importantPoints, set& importantEdges); -int32_t doDiggingInvaders(color_ostream& out); +int32_t findAndAssignInvasionJob(color_ostream& out); + +//TODO: when world unloads +static int32_t lastInvasionJob=-1; + +void watchForComplete(color_ostream& out, void* ptr) { + df::job* job = (df::job*)ptr; + + if ( job->id != lastInvasionJob ) + return; + + Plugin* me = Core::getInstance().getPluginManager()->getPluginByName("diggingInvaders"); + EventManager::unregisterAll(me); + + lastInvasionJob = -1; + std::vector parameters; + diggingInvadersFunc(out, parameters); +} command_result diggingInvadersFunc(color_ostream& out, std::vector& parameters) { if (!parameters.empty()) return CR_WRONG_USAGE; - doDiggingInvaders(out); + if ( lastInvasionJob != -1 ) { + out.print("Still working on the previous job.\n"); + return CR_OK; + } + int32_t jobId = findAndAssignInvasionJob(out); + if ( jobId == -1 ) + return CR_OK; + + lastInvasionJob = jobId; + + EventManager::EventHandler completeHandler(watchForComplete); + Plugin* me = Core::getInstance().getPluginManager()->getPluginByName("diggingInvaders"); + EventManager::unregisterAll(me); + + EventManager::registerListener(EventManager::EventType::JOB_COMPLETED, completeHandler, 5, me); + return CR_OK; } -int32_t doDiggingInvaders(color_ostream& out) { +int32_t findAndAssignInvasionJob(color_ostream& out) { //returns the job id created CoreSuspender suspend;