Как команды 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, и я не понимаю чужой игровой движок, который я взламываю.

Другие вопросы по тегам