diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 65a550018..9fff61bea 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -137,6 +137,7 @@ if (BUILD_SUPPORTED) DFHACK_PLUGIN(trueTransformation trueTransformation.cpp) DFHACK_PLUGIN(infiniteSky infiniteSky.cpp) DFHACK_PLUGIN(createitem createitem.cpp) + DFHACK_PLUGIN(outsideOnly outsideOnly.cpp) endif() diff --git a/plugins/outsideOnly.cpp b/plugins/outsideOnly.cpp new file mode 100644 index 000000000..7707053ca --- /dev/null +++ b/plugins/outsideOnly.cpp @@ -0,0 +1,63 @@ + +#include "Console.h" +#include "Core.h" +#include "DataDefs.h" +#include "Export.h" +#include "PluginManager.h" + +#include "modules/Buildings.h" +#include "modules/EventManager.h" +#include "modules/Maps.h" + +#include "df/coord.h" +#include "df/building.h" +#include "df/building_def.h" +#include "df/map_block.h" +#include "df/tile_designation.h" + +#include + +using namespace DFHack; +using namespace std; + +DFHACK_PLUGIN("outsideOnly"); + +void buildingCreated(color_ostream& out, void* data); + +DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) +{ + EventManager::EventHandler handler(buildingCreated,1); + EventManager::registerListener(EventManager::EventType::BUILDING, handler, plugin_self); + return CR_OK; +} + +// This is called right before the plugin library is removed from memory. +DFhackCExport command_result plugin_shutdown ( color_ostream &out ) +{ + return CR_OK; +} + +void buildingCreated(color_ostream& out, void* data) { + int32_t id = (int32_t)data; + df::building* building = df::building::find(id); + if ( building == NULL ) + return; + + if ( building->getCustomType() < 0 ) + return; + string prefix("OUTSIDE_ONLY"); + df::building_def* def = df::global::world->raws.buildings.all[building->getCustomType()]; + if (def->code.compare(0, prefix.size(), prefix)) { + return; + } + + //now, just check if it was created inside, and if so, scuttle it + df::coord pos(building->centerx,building->centery,building->z); + + df::tile_designation* des = Maps::getTileDesignation(pos); + if ( des->bits.outside ) + return; + + Buildings::deconstruct(building); +} +