Формы ID#
UI handle, script component ID и UniverseID cdata имеют разные контракты. Сначала выясните, что вернул конкретный вызов и что ожидает следующий.
В исследовании X4 9.00 попытка применить ConvertIDTo64Bit к уже числовому ID вернула nil. Универсальное преобразование «на всякий случай» не заменяет проверку типов.
Граница точного целого#
Lua number на основе double не представляет все целые выше 2^53. Это важно для NPCSeed и других 64-битных значений.
local ffi = require("ffi")
-- Синтаксис 64-битного литерала LuaJIT.
local exact = ffi.new("uint64_t", 9007199254740993ULL)
local text = tostring(exact)
-- У tostring(cdata) может быть суффикс типа.Это учебный пример представления значения, а не вызов игры. Для своего формата хранения явно определите тип и каноническую запись. Не пропускайте точное значение через tonumber, если диапазон может превысить точность double.
Жизненный цикл ссылки#
Временный UI handle не нужно хранить как постоянную ссылку на корабль между загрузками. Заново разрешайте объект в текущем контексте и проверяйте его существование.
Имя и macro не являются уникальным идентификатором экземпляра: в мире может быть несколько одинаковых кораблей.
Проверка#
Проведите значение через свой реальный путь чтения и хранения. Включите большой seed, неверный и отсутствующий объект, повторное открытие меню и загрузку сейва. Сравнивайте исходное и восстановленное значение без промежуточного округления.