|
|
|
@ -38,6 +38,7 @@ using namespace std;
|
|
|
|
|
#include "dfhack/DFVector.h"
|
|
|
|
|
#include "dfhack/modules/Materials.h"
|
|
|
|
|
#include "dfhack/modules/Items.h"
|
|
|
|
|
#include "dfhack/modules/Creatures.h"
|
|
|
|
|
#include "ModuleFactory.h"
|
|
|
|
|
|
|
|
|
|
using namespace DFHack;
|
|
|
|
@ -579,6 +580,30 @@ bool Items::readItemRefs(const dfh_item &item, const ClassNameCheck &classname,
|
|
|
|
|
return !values.empty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Items::removeItemOwner(dfh_item &item, Creatures *creatures)
|
|
|
|
|
{
|
|
|
|
|
DFHack::DfVector<uint32_t> p_refs(d->owner, item.origin + d->refVectorOffset);
|
|
|
|
|
|
|
|
|
|
for (uint32_t i=0; i<p_refs.size(); i++)
|
|
|
|
|
{
|
|
|
|
|
uint32_t vtbl = d->owner->readDWord(p_refs[i]);
|
|
|
|
|
if (!d->isOwnerRefClass(d->owner, vtbl)) continue;
|
|
|
|
|
|
|
|
|
|
int32_t oid = d->owner->readDWord(p_refs[i]+4);
|
|
|
|
|
int32_t ix = creatures->FindIndexById(oid);
|
|
|
|
|
|
|
|
|
|
if (ix < 0 || !creatures->RemoveOwnedItemIdx(ix, item.id))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!p_refs.remove(i--))
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item.base.flags.owned = 0;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string Items::getItemClass(const dfh_item & item)
|
|
|
|
|
{
|
|
|
|
|
return getItemClass(item.matdesc.itemType);
|
|
|
|
|