Формы ID#

UI handle, script component ID и UniverseID cdata имеют разные контракты. Сначала выясните, что вернул конкретный вызов и что ожидает следующий.

В исследовании X4 9.00 попытка применить ConvertIDTo64Bit к уже числовому ID вернула nil. Универсальное преобразование «на всякий случай» не заменяет проверку типов.

Граница точного целого#

Lua number на основе double не представляет все целые выше 2^53. Это важно для NPCSeed и других 64-битных значений.

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