--local proc = getProc(); function GetIDAddressLine(id) local Line = 32; local function findID(StartAddress, IDtoFind) local dataPointer = StartAddress if not IdAddressTables then IdAddressTables = {} end while true do local currentID = memoryReadInt( getProc(), dataPointer + addresses.idOffset ); if type(currentID) ~= "number" then dataPointer = 0 printf("current ID not number\n") break end local offset8 = memoryReadInt( getProc(), dataPointer + 8); if offset8 == 0x708 or offset8 == 0x424 then dataPointer = 0 printf("End of Table\n") break end local offset0 = memoryReadInt( getProc(), dataPointer ); --local offset4 = memoryReadInt( getProc(), dataPointer + 4); --printf("currentAddress %X , current ID %X:%d IDtoFind %X:%d\n",dataPointer,currentID,currentID,IDtoFind,IDtoFind) --yrest(5) table.insert(IdAddressTables, currentID, dataPointer); if IDtoFind == currentID then break end if currentID > IDtoFind then if offset0 == offset8 then dataPointer = dataPointer + Line else dataPointer = offset0 end else if offset0 == offset8 then if dataPointer % 0x10000 ~= 0 then dataPointer = dataPointer - Line else dataPointer = 0 printf("tableEnd would be exceeded\n") break end else dataPointer = offset8 end end end if dataPointer ~= 0 then return dataPointer else return nil end end local function findnearestIDAddress(_id) local sort = {} for i,v in pairs(IdAddressTables) do local dist = _id - i if dist < 0 then dist = dist * -1 end sort[dist] = i end local temp for i,v in pairs(sort) do if not temp then temp = i end if i < temp then temp = i end end return IdAddressTables[sort[temp]] end --***************************************** main *************************************************************** --first initialization if not IdAddressTables then local tablePointer = memoryReadIntPtr( getProc(), addresses.tablesBase, addresses.tablesBaseOffset ); local realTablePointer = memoryReadInt( getProc(), tablePointer ) local dataPointerTemporal = memoryReadIntPtr( getProc(), realTablePointer, addresses.tableStartPtrOffset ) local dataPointer = memoryReadInt( getProc(), dataPointerTemporal + addresses.tableDataStartPtrOffset ); dataPointer = dataPointer - Line findID(dataPointer,id) end if IdAddressTables[id] then return IdAddressTables[id] else return findID(findnearestIDAddress(id),id) end end function GetItemAddress(id) if id then local addressline = GetIDAddressLine(id) if addressline then local address = memoryReadIntPtr( getProc(), addressline + 0x10, 0x8) if address == 0 then -- Item data not substanciated yet. Do "GetCraftRequestItem", then the address will exist. RoMScript("GetCraftRequestItem("..id..", -1)") address = memoryReadIntPtr( getProc(), addressline + 0x10, 0x8); end return address else printf("ID %d not found\n", id) end else printf("ID is nil\n") end end -- Returns the name for a given id function GetIdName(itemId) if itemId ~= nil and itemId > 0 then local itemAddress = GetItemAddress(itemId) if itemAddress ~= nil and itemAddress > 0 then return memoryReadStringPtr(getProc(), itemAddress + addresses.nameOffset, 0) end end end function LoadTables() end