Как команды tostring, concat и использование объекта напрямую дают разные результаты?
Я использую версию Lua 5.1 в игре Kingdoms of Amalur. Это хаос, но, черт возьми, хаос - это lua. Теперь есть специальный тип под названиемui64
что в игре есть и специальный пакет, который вставляет ловушку, которую я добавил в игру.
Если я сделаю следующее:
module("playerdodge_hook", package.seeall)
function save_to_file(filename, data)
if io then
io.output(filename)
io.write(data)
io.flush()
end
end
function dodge_hook()
local x = SIMTYPE_ID("longbow_unique11a")
save_to_file("type", type(x))
save_to_file("directly", x)
save_to_file("tostring", tostring(x))
save_to_file("concat", "" .. x)
end
Вывод файлов следующий: введите
ui64
Прямо
Грех
нанизывать
0
concat (не существует)
Я не эксперт в Lua, но пытаюсь понять, как это работает. Поскольку я хотел бы иметь возможность распечатать отладочную информацию и сохранить ее извне.
Изменить: Короткий ответ - движок игры использовал проприетарное переопределение метода записи io.
Амалур бывает разных видов, и ui64
на самом деле является указателем на некоторую память, недоступную для скрипта lua / havok, но библиотека позволяет манипулировать. И в основном когдаui64
передается в необработанном виде в write
называет локализацию для Type
или Actor
или что бы то ни было, представленный внутренний объект.
была измененная версия библиотеки io, которая при получении ui64 опрашивала
1 ответ
Во-первых, я хочу сказать, что я не мог использовать настоящие io.write
как io
не загружается в движок, но у меня есть аналогичный метод, который я могу использовать для записи текста в запись ini, однако каждый раз, когда я вызываю метод записи, он переопределяет содержимое моей личной записи независимо от того, меняю ли я ключ.
Основная суть проблемы в том, что в игре Kingdoms of Amalur havok engine есть кастомный write
/(и почти любой другой способ отображения текста).
В ui64
тип данных - это более или менее указатель на объект, существующий в havok или c. Однако движок предлагает api, который может принимать эти указатели и вызывать различные процедуры.
Прохождение ui64
к write
метод заставит игру вызываться в ее таблицы локализации и выводит локализованное имя на экран для этого конкретного Type
. Таким образомlongbow_unique11a
является Sin
.
Поскольку моей целью было получить реальное локализованное имя и выгрузить их все вместе с другими данными, я нашел обходной путь.
По сути, игра позволяет вам давать имена созданным элементам, и когда это делается, она заполняет имя записью по умолчанию, и поэтому, декомпилировав некоторые методы, я смог придумать процедуру для построения моей строки следующим образом:
function dump_item_names(tbl)
local callback = function(text, canceled)
op = {}
for i = 1,#tbl do
local actor = tbl[i]
local typeId = get_hex_of_raw_id(actor)
WINDOW.populate_edit_box(name_win.m_editbox, actor)
local name = WINDOW.get_editbox_text(name_win.m_editbox)
op[#op + 1] = typeId .. ',' .. name
end
save_to_file("items.txt", table.concat(op,'\n'))
end
name_win.launch(SL(357894144), tbl[1], true, 100, callback, false)
end
Так что да, это не проблема lua, а скорее проблема havok, и я не понимаю чужой игровой движок, который я взламываю.