-- 存储背包数据
items = {}
-- 初始化标记
isInit = false;
function ItemEdit_f5_bottonClick(sender)
--init
address = readInteger("Tales of Zestiria.exe+1D3078C")
address = readInteger(address + 0)
address = readInteger(address + 0x9154)
--获取最大值,由界面的滑块控制
maxStrVal = trackbar_getPosition(ItemEdit_CETrackBar1)
print("0 ~ " .. maxStrVal)
-- 去重
itemHave = {}
items = {}
for i=1,maxStrVal do
-- print("|>>"..type(address)..":"..address)
item = getItem(address)
id = hex(item["ItemId"])
-- print(hex(item["ItemId"]))
-- 1199662880
-- 0x47816720
if( id == "47816720" or itemHave[id] ~= nil ) then
--已到结尾
break
else
-- 继续
itemHave[id] = 1
items[i] = item
end
address = item['nextItem']
end
-- 打印背包长度
print("Len:"..#items)
--[[
ItemEdit_ListBox.clear()
for ii in ipairs(items) do
ItemEdit_ListBox.Items.Add(hex(items[ii]["ItemId"]).."|"..hex(items[ii]["addres"]))
end
]]
--过滤,渲染
serachText()
end
-- 获取物品属性
-- address:物品地址
function getItem(address)
--print(">>"..type(addres)..":"..addres)
nextItem = readInteger(address)
ItemId = readInteger(0 + address + 0x8)
result = {
addres = address,
nextItem = nextItem,
ItemId = ItemId
}
return result
end
function ItemEdit_CETrackBar1Change(sender)
control_setCaption(ItemEdit_maxStr, "0 ~ "..trackbar_getPosition(ItemEdit_CETrackBar1) )
end
-- 十进制转十六进制
function hex(num)
return string.format("%02X", num)
end
--查询、过滤
function serachText()
serStr = ItemEdit_serStr.Text
--[[
print(string.find("0001","1"))
print("serLen")
print(ipairs(items))
]]
ItemEdit_ListBox.clear()
for i in ipairs(items) do
item = items[i]
id = hex(item["ItemId"])
if(string.find(id,serStr) ~= nil) then
--print(id)
ItemEdit_ListBox.Items.Add(
hex(item["ItemId"]).."|"..hex(item["addres"])
)
end
end
end
function ItemEdit_Serach_bottonClick(sender)
serachText()
end
function ItemEdit_ListBoxClick(sender)
if(isInit == false)then
ItemEdit_FormShow()
end
selectItemIndex = ItemEdit_ListBox.getItemIndex()
if(selectItemIndex ~= -1)then
item = ItemEdit_ListBox.getItems()[selectItemIndex]
itemStr = Split(item,"|")
ItemEdit_itemIdStr.Text = itemStr[1]
ItemEdit_itemAddStr.Text = itemStr[2]
-- 更新当前修改的物品的地址 Item_ChaneAddress
writeInteger("Item_ChaneAddress","0x"..itemStr[2])
end
end
-- 切分字符串
-- from:
https://www.cnblogs.com/AaronBlogs/p/7615877.htmlfunction Split(szFullString, szSeparator)
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
break
end
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
nFindStartIndex = nFindLastIndex + string.len(szSeparator)
nSplitIndex = nSplitIndex + 1
end
return nSplitArray
end
-- 初始化,申请内存符号,用户存储当前物品的地址
function ItemEdit_FormShow(sender)
init = [[
//注册名称地址
registersymbol(Item_ChaneAddress)
//32位游戏申请4个字节,64位申请8个字节
alloc(Item_ChaneAddress,8)
]]
autoAssemble(init)
isInit = true;
end