local proprintMod = { VERSION = 'proprint v1.0.0', DESCRIPTION = 'Function for property inspection of a Cheat Engine object', AUTHOR = 'Azaias', ---------------------- indent = ' ', ---------------------- } local tostring = tostring ------ Various functions and helpers for required processes local function keyFieldString(k) local str = '<'..tostring(k)..'> = ' return str end local function fieldString(k, v) local str = '<'..tostring(k)..'> = '..tostring(v) return str end local function put(buff, str) buff.n = buff.n + 1 buff[buff.n] = str end local function rawpairs(t) return next, t, nil end ---- local function getProperties(obj) local str = getPropertyList(obj) if type(str) == 'nil' then return end str = str.Text if str:sub(-1, -1) ~= '\n' then str = str..'\n' end local newLines = {} local i = 0 while true do i = string.find(str, '\n', i+1) if i == nil then break end table.insert(newLines, i) end local properties = {} for k, v in ipairs(newLines) do if k == 1 then table.insert(properties, str:sub(1, v-2)) else local key = k-1 table.insert(properties, str:sub(newLines[key]+1, v-2)) end end return properties end local function getMTfields(obj) local mtKeys = {} local mt = getmetatable(obj) local properties = getProperties(obj) for k in rawpairs(mt) do local v = rawget(mt, k) if type(v) ~= 'function' then table.insert(mtKeys, k) end end if type(properties) ~= 'nil' then for k, v in ipairs(properties) do local property = v for i = 1, #mtKeys do if mtKeys[i] == property then table.remove(mtKeys, i) end end end end return mtKeys end --------------------------------------------------------- local ProPrinter = {} local ProPrinter_mt = { __index = ProPrinter } function ProPrinter:putLine(str) local buff = self.buff put(buff, string.rep(proprintMod.indent, self.level)..str..'\n') end function ProPrinter:putReturnLine(str) local buff = self.buff put(buff, '\n\r'..string.rep(proprintMod.indent, self.level)..str..'\n') end function ProPrinter:iterateTable(t) for k in rawpairs(t) do local v = rawget(t, k) local val = tostring(v) if type(v) == 'table' then val = '{' end self:putLine(fieldString(k, val)) if type(v) == 'table' then self.level = self.level + 1 self:iterateTable(v) self.level = self.level - 1 self:putline('}') end end end function ProPrinter:iterateProperties(obj) local properties = getProperties(obj) if type(properties) == 'nil' then return end local objName = obj.Name if type(objName) == 'nil' or objName == '' or objName == ' ' then objName = '' else objName = objName..'.' end -------- for k, v in ipairs(properties) do local property = objName..v local val = obj[v] local strVal = tostring(val) if type(strVal) == 'nil' then strVal = 'nil' end if strVal:sub(1, 8) == 'userdata' then strVal = '{' end self:putLine(fieldString(property, strVal)) if tostring(val):sub(1, 8) == 'userdata' then self.level = self.level + 1 self:iterateProperties(val) self.level = self.level - 1 self:putLine('}') end end -------- end function ProPrinter:iterateMT(obj) local mtKeys = getMTfields(obj) local objName = obj.Name if type(objName) == 'nil' or objName == '' or objName == ' ' then objName = '' else objName = objName..'.' end self:putReturnLine(' = {') self.level = self.level + 1 -------- for k, v in ipairs(mtKeys) do local property = objName..v local val = obj[v] local strVal = tostring(val) if type(strVal) == 'nil' then strVal = 'nil' end if strVal:sub(1, 5) == 'table' or strVal:sub(1, 8) == 'userdata' then strVal = '{' end self:putLine(fieldString(property, strVal)) if tostring(val):sub(1, 5) == 'table' then self.level = self.level + 1 self:iterateTable(val) self.level = self.level - 1 self:putLine('}') end if tostring(val):sub(1, 8) == 'userdata' then self.level = self.level + 1 self:iterateProperties(val) self.level = self.level - 1 self:putLine('}') end end -------- self.level = self.level - 1 self:putLine('}') end function proprintMod.proprintData(obj) ------------------------ local proprinter = setmetatable({ buff = { n = 0 }, level = 0, }, ProPrinter_mt) ------------------------ proprinter:iterateProperties(obj) proprinter:iterateMT(obj) return table.concat(proprinter.buff) end ---- proprint function function proprint(obj) print(proprintMod.proprintData(obj)) end registerLuaFunctionHighlight('proprint')