121 lines
3.4 KiB
C++
121 lines
3.4 KiB
C++
|
#include <dfhack/Core.h>
|
||
|
#include <dfhack/Export.h>
|
||
|
#include <dfhack/PluginManager.h>
|
||
|
#include <dfhack/modules/Items.h>
|
||
|
#include <dfhack/modules/Gui.h>
|
||
|
#include <vector>
|
||
|
#include <string>
|
||
|
#include <string.h>
|
||
|
|
||
|
using std::vector;
|
||
|
using std::string;
|
||
|
using namespace DFHack;
|
||
|
|
||
|
DFhackCExport command_result df_dumpitems (Core * c, vector <string> & parameters);
|
||
|
DFhackCExport command_result df_itscanvec1 (Core * c, vector <string> & parameters);
|
||
|
|
||
|
DFhackCExport const char * plugin_name ( void )
|
||
|
{
|
||
|
return "itemhacks";
|
||
|
}
|
||
|
|
||
|
DFhackCExport command_result plugin_init ( Core * c, std::vector <PluginCommand> &commands)
|
||
|
{
|
||
|
commands.clear();
|
||
|
commands.push_back(PluginCommand("dumpitems", "Dump items...", df_dumpitems));
|
||
|
commands.push_back(PluginCommand("itscanvec1", "Dump items that have the first vector valid.", df_itscanvec1));
|
||
|
return CR_OK;
|
||
|
}
|
||
|
|
||
|
DFhackCExport command_result plugin_shutdown ( Core * c )
|
||
|
{
|
||
|
return CR_OK;
|
||
|
}
|
||
|
|
||
|
DFhackCExport command_result df_itscanvec1 (Core * c, vector <string> & parameters)
|
||
|
{
|
||
|
c->Suspend();
|
||
|
DFHack::Items * Items = c->getItems();
|
||
|
Items->Start();
|
||
|
std::vector<t_item *> p_items;
|
||
|
Items->readItemVector(p_items);
|
||
|
for(int i = 0; i < p_items.size();i++)
|
||
|
{
|
||
|
t_item * itm = p_items[i];
|
||
|
if(itm->unk2.size())
|
||
|
{
|
||
|
c->con.print("Found %x, size %d\n",itm,itm->unk2.size());
|
||
|
}
|
||
|
}
|
||
|
c->Resume();
|
||
|
return CR_OK;
|
||
|
}
|
||
|
|
||
|
DFhackCExport command_result df_dumpitems (Core * c, vector <string> & parameters)
|
||
|
{
|
||
|
c->Suspend();
|
||
|
bool print_hex = false;
|
||
|
if(parameters.size() && parameters[0] == "hex")
|
||
|
print_hex = true;
|
||
|
DFHack::Materials * Materials = c->getMaterials();
|
||
|
Materials->ReadAllMaterials();
|
||
|
|
||
|
DFHack::Gui * Gui = c->getGui();
|
||
|
|
||
|
DFHack::Items * Items = c->getItems();
|
||
|
Items->Start();
|
||
|
|
||
|
int32_t x,y,z;
|
||
|
Gui->getCursorCoords(x,y,z);
|
||
|
|
||
|
std::vector<t_item *> p_items;
|
||
|
Items->readItemVector(p_items);
|
||
|
uint32_t size = p_items.size();
|
||
|
|
||
|
for(size_t i = 0; i < size; i++)
|
||
|
{
|
||
|
DFHack::dfh_item itm;
|
||
|
memset(&itm, 0, sizeof(DFHack::dfh_item));
|
||
|
Items->readItem(p_items[i],itm);
|
||
|
|
||
|
if (x != -30000
|
||
|
&& !(itm.base->x == x && itm.base->y == y && itm.base->z == z
|
||
|
&& itm.base->flags.on_ground
|
||
|
&& !itm.base->flags.in_chest
|
||
|
&& !itm.base->flags.in_inventory
|
||
|
&& !itm.base->flags.in_building))
|
||
|
continue;
|
||
|
|
||
|
c->con.print(
|
||
|
"%5d: addr:0x%08x %6d %08x (%d,%d,%d) vptr:0x%08x [%d] *%d %s - %s\n",
|
||
|
i, itm.base, itm.base->id, itm.base->flags.whole,
|
||
|
itm.base->x, itm.base->y, itm.base->z,
|
||
|
itm.base->vptr,
|
||
|
itm.wear_level,
|
||
|
itm.quantity,
|
||
|
Items->getItemClass(itm.matdesc.itemType).c_str(),
|
||
|
Items->getItemDescription(itm, Materials).c_str()
|
||
|
);
|
||
|
/*
|
||
|
if (print_hex)
|
||
|
hexdump(DF,p_items[i],0x300);
|
||
|
*/
|
||
|
/*
|
||
|
if (print_acc)
|
||
|
c->con << Items->dumpAccessors(itm) << endl;
|
||
|
*/
|
||
|
/*
|
||
|
if (print_refs) {
|
||
|
DFHack::DfVector<uint32_t> p_refs(p, itm.origin + ref_vector);
|
||
|
for (size_t j = 0; j < p_refs.size(); j++) {
|
||
|
uint32_t vptr = p->readDWord(p_refs[j]);
|
||
|
uint32_t val = p->readDWord(p_refs[j]+4);
|
||
|
c->con.print("\t-> %d \t%s\n", int(val), p->readClassName(vptr).c_str());
|
||
|
}
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
c->Resume();
|
||
|
return CR_OK;
|
||
|
}
|