I have this memory delete code, but I can't use it because the damn pie menu code (in the engine itself) is too slow to handle it in extreme situations. Rather than toss it, I thought I'd share it in case it's useful to someone else.
Here's the menu builder:
-- stack object = personId
-- local 2 = menu index
-- return true if still building menu, false otherwise
local cp = CachedPerson.new(GetStackObjectId())
local nid = cp:getPersonData(PersonData["neighbor id"])
local cn = CachedNeighbor.new(nid)
SetScriptReturnValue(false)
local t = {}
local t2 = {}
local i = 1
local x = GetLocal(2) + 1
if x == 1 then
TempTable = {}
local ii = 1
local nlist = GlobalObjManager:getNeighborIds()
local nguid = {}
for k,v in nlist do
local cnx = CachedNeighbor.new(v)
local g0 = cnx:getGUID() -- neighbor GUID
local g1 = GetObjectDefinitionField(g0, ObjDef["guid_1 - Read Only"])
local g2 = GetObjectDefinitionField(g0, ObjDef["guid_2 - Read Only"])
nguid[CreateObjectGUID(g2, g1)] = v -- catalog GUID -> nid
end
local inv = Inventory.new(Inventory.kTypeNeighbor, nid)
local mmult = {}
local gmult = {}
local xx = 1
local vv = inv:getTokenAtIndex(xx)
while vv ~= nil do
if vv:testFlag(1) and vv:testFlag(2) then -- visible memory
local g = vv:getGUID()
if gmult[g] == 1 then -- already in the guid table?
mmult[g] = 1 -- multiples of the same guid
else
gmult[g] = 1
end
end
xx = xx + 1
vv = inv:getTokenAtIndex(xx)
end
xx = 1
vv = inv:getTokenAtIndex(xx)
while vv ~= nil do
if vv:testFlag(1) and vv:testFlag(2) then -- visible memory
local mname = GetCatalogName(vv:getGUID())
local sname = ""
local s1, s2 = string.find(mname, "%$Subject")
if s1 ~= nil then
local g = CreateObjectGUID(vv:getProperty(7), vv:getProperty(6))
if nguid[g] ~= nil then
local cn2 = CachedNeighbor.new(nguid[g])
sname = cn2:getFullName()
else
sname = GetCatalogName(g)
end
mname = string.sub(mname, 1, s1 - 1) .. "..." .. string.sub(mname, s2 + 1)
if mmult[vv:getGUID()] ~= 1 then
mname = string.sub(mname, 1, s1 - 1) .. sname .. string.sub(mname, s2 + 1)
sname = ""
end
end
local s1, s2 = string.find(mname, "%$Constant:4097:7")
if s1 ~= nil then
local mx = GetConstantWithGuid(vv:getGUID(), 4097, 7)
mname = string.format("%s%d%s", string.sub(mname, 1, s1 - 1), mx, string.sub(mname, s2 + 1))
end
if sname == "" then
TempTable[ii] = string.format(".../%s", mname)
TempTable[ii+1] = xx
ii = ii + 2
else
TempTable[ii] = string.format(".../%s/%s", mname, sname)
TempTable[ii+1] = xx
ii = ii + 2
end
end
xx = xx + 1
vv = inv:getTokenAtIndex(xx)
end
end
local i2 = 1
while i2 <= table.getn(TempTable) do
t[i] = "Delete Memory.../" .. cn:getName() .. TempTable[i2]
t2[i] = TempTable[i2+1]
i = i + 1
i2 = i2 + 2
end
if x <= table.getn(t) then
SetLocal(2, x)
nGameState.SetProperty("luaDialogString", t[x])
SetTemp(0, t2[x])
SetScriptReturnValue(true)
end
Here's the action code:
-- tree param 0 = personId, tree param 1 = action
local x = GetTreeParameter(1)
SetScriptReturnValue(true)
if x < 0 then
SetScriptReturnValue(false)
else
local cp = CachedPerson.new(GetTreeParameter(0))
local nid = cp:getPersonData(PersonData["neighbor id"])
local inv = Inventory.new(Inventory.kTypeNeighbor, nid)
local vv = inv:getTokenAtIndex(x)
vv:setFlag(InventoryToken.kFlagMarkedForDeletion)
inv:removeTokensMarkedForDeletion()
end