Add cleanitems by Q.
							parent
							
								
									c8cd307bcf
								
							
						
					
					
						commit
						f2205364b8
					
				| @ -0,0 +1,82 @@ | ||||
| // Clean Items : Remove contaminants from all objects
 | ||||
| #include <iostream> | ||||
| #include <iomanip> | ||||
| #include <sstream> | ||||
| #include <climits> | ||||
| #include <vector> | ||||
| #include <set> | ||||
| using namespace std; | ||||
| 
 | ||||
| #include <dfhack/Core.h> | ||||
| #include <dfhack/Console.h> | ||||
| #include <dfhack/Export.h> | ||||
| #include <dfhack/PluginManager.h> | ||||
| #include <vector> | ||||
| #include <string> | ||||
| #include <algorithm> | ||||
| #include <dfhack/modules/Items.h> | ||||
| 
 | ||||
| using namespace DFHack; | ||||
| 
 | ||||
| DFhackCExport command_result df_cleanitems (Core * c, vector <string> & parameters); | ||||
| 
 | ||||
| DFhackCExport const char * plugin_name ( void ) | ||||
| { | ||||
| 	return "cleanitems"; | ||||
| } | ||||
| 
 | ||||
| DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands) | ||||
| { | ||||
| 	commands.clear(); | ||||
| 	commands.push_back(PluginCommand("cleanitems", "Removes contaminants from items.", df_cleanitems)); | ||||
| 	return CR_OK; | ||||
| } | ||||
| 
 | ||||
| DFhackCExport command_result plugin_shutdown ( Core * c ) | ||||
| { | ||||
| 	return CR_OK; | ||||
| } | ||||
| 
 | ||||
| DFhackCExport command_result df_cleanitems (Core * c, vector <string> & parameters) | ||||
| { | ||||
| 	if(parameters.size() > 0) | ||||
| 	{ | ||||
| 		string & p = parameters[0]; | ||||
| 		if(p == "?" || p == "help") | ||||
| 		{ | ||||
| 			c->con.print("This utility removes all contaminants from all objects in your fortress.\n"); | ||||
| 			return CR_OK; | ||||
| 		} | ||||
| 	} | ||||
| 	c->Suspend(); | ||||
| 	DFHack::Items * Items = c->getItems(); | ||||
| 
 | ||||
| 	vector <t_item*> p_items; | ||||
| 	if(!Items->readItemVector(p_items)) | ||||
| 	{ | ||||
| 		c->con.printerr("Can't access the item vector.\n"); | ||||
| 		c->Resume(); | ||||
| 		return CR_FAILURE; | ||||
| 	} | ||||
| 	std::size_t numItems = p_items.size(); | ||||
| 
 | ||||
| 	int cleaned_items = 0, cleaned_total = 0; | ||||
| 	for (std::size_t i = 0; i < numItems; i++) | ||||
| 	{ | ||||
| 		t_item * itm = p_items[i]; | ||||
| 		// TODO - get peterix to expand the item base class so it includes this pointer
 | ||||
| 		uint32_t cont_ptr = *(uint32_t *)((int8_t *)itm + 0x0064); | ||||
| 		if (!cont_ptr) | ||||
| 			continue; | ||||
| 		std::vector<void *> *contaminants = (std::vector<void *> *)cont_ptr; | ||||
| 		if (contaminants->size()) | ||||
| 		{ | ||||
| 			cleaned_items++; | ||||
| 			cleaned_total += contaminants->size(); | ||||
| 			contaminants->clear(); | ||||
| 		} | ||||
| 	} | ||||
| 	c->Resume(); | ||||
| 	c->con.print("Done. %d items cleaned of %d contaminants.\n", cleaned_items, cleaned_total); | ||||
| 	return CR_OK; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue