--- title: ID и точность 64-битных значений summary: UniverseID, UI handles, NPCSeed и граница точного целого в Lua number. section: ui kind: guide status: observed tags: ["lua","ffi","ID","UniverseID","NPCSeed","64-bit","precision"] sources: ["https://wiki.egosoft.com/X4%20Foundations%20Wiki/Modding%20Support/"] --- ## Формы 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, неверный и отсутствующий объект, повторное открытие меню и загрузку сейва. Сравнивайте исходное и восстановленное значение без промежуточного округления.