Скриптинг в Metasiberia.
Скриптинг на Luau в Metasiberia

В Metasiberia вы можете оживлять свои объекты с помощью языка Luau — современной версии Lua, вдохновлённой Roblox. Это мощный инструмент для создания интерактивных элементов и автоматизации в твоём виртуальном мире.

Создание скрипта для объекта.
Для работы со скриптами нужен клиент Substrata.
  1. Откройте клиент и дважды щёлкните по объекту, который хотите настроить.
  2. В разделе "Скрипт" нажмите "Редактировать" — появится окно редактора.
  3. Начните код с --lua, чтобы указать, что используете Luau (а не Winter или XML).
  4. После внесения изменений закройте редактор — скрипт сразу применится к объекту.
Как работают скрипты.
Скрипты в Metasiberia выполняются одновременно на клиенте и на сервере metasiberia.world. Это значит, что ваш код активируется на каждом подключённом устройстве и на центральном сервере.
  • Физические эффекты (например, столкновения) обрабатываются на стороне клиента, где рассчитывается физика.
  • Остальные изменения происходят на сервере и мгновенно синхронизируются со всеми пользователями.
Отладка скриптов.
Для вывода сообщений используйте функцию print:
--lua
print("Привет из Metasiberia!")
Все отладочные данные, включая вывод и ошибки, видны в окне журнала (tools > Show log). Если в скрипте ошибка, она отобразится в логе, а выполнение остановится.
Серверные логи доступны на metasiberia.com/script_log (нужен вход в аккаунт). Там вы увидите до 1000 последних сообщений и ошибок от ваших скриптов.

Слушатели событий.
Скрипты могут реагировать на действия пользователей через специальные функции. Определите их, чтобы отслеживать события объекта:
  • onUserTouchedObject(avatar, object) — аватар коснулся объекта (срабатывает каждые 0,5 секунды при контакте).
  • onUserUsedObject(avatar, object) — пользователь активировал объект (клавиша E).
  • onUserMovedNearToObject(avatar, object) — аватар приблизился (в радиусе 20 метров).
  • onUserMovedAwayFromObject(avatar, object) — аватар удалился (дальше 20 метров).
  • onUserEnteredParcel(avatar, object, parcel) — аватар вошёл на участок.
  • onUserExitedParcel(avatar, object, parcel) — аватар покинул участок.
  • onUserEnteredVehicle(avatar, vehicle_ob) — аватар сел в транспорт.
  • onUserExitedVehicle(avatar, vehicle_ob) — аватар покинул транспорт.
Для отслеживания событий на других объектах используйте addEventListener:
--lua
addEventListener("onUserTouchedObject", 583, onUserTouchedObject)

Глобальные функции.
  • getObjectForUID(uid) — возвращает объект по его ID.
  • showMessageToUser(msg, avatar) — отображает сообщение пользователю на экране.
  • createTimer(onTimerEvent, interval, repeating) — создаёт таймер (максимум 4).
  • onTimerEvent(object) — функция, вызываемая при срабатывании.
  • Возвращает handle для destroyTimer.
  • destroyTimer(timer_handle) — удаляет таймер.
  • doHTTPGetRequestAsync(url, headers, onDone, onError) — HTTP GET-запрос (лимит 5 за 300 секунд).
  • onDone({response_code, response_message, mime_type, body_data}) — успех.
  • onError({error_code, error_description}) — ошибка (0 = OK, 1 = прочее, 2 = лимит).
  • doHTTPPostRequestAsync(url, post_content, content_type, headers, onDone, onError) — HTTP POST-запрос.
  • Пример:
  • --lua
  • doHTTPPostRequestAsync( "https://example.com/api", "{ id: '123' }", "application/json", { Authorization = "Basic key" }, function(result) print(result.response_code) end, function(err) print(err.error_description) end)
  • getSecret(secret_name) — получает секрет (например, API-ключ) из настроек аккаунта.
  • my_key = getSecret("MY_API_KEY")
  • parseJSON(json) — преобразует JSON в Lua-объект.
  • parseJSON('[1, true, "text", null]') → {1, true, "text", nil}
  • objectstorage.setItem(key, value) — сохраняет данные, устойчивые к перезагрузкам.
  • objectstorage.getItem(key) — извлекает данные (nil, если ничего нет).

Пример счётчика посещений.
--lua
local visits = objectstorage.getItem("visits") or 0visits = visits + 1objectstorage.setItem("visits", visits)

Глобальные переменные.
  • this_object — текущий объект скрипта.
  • IS_CLIENT — true на клиенте, false на сервере.
  • IS_SERVER — true на сервере, false на клиенте.
Классы
  • Object:
  • Атрибуты:
  • model_url — URL модели (строка).
  • pos — позиция (Vec3d).
  • axis — ось вращения (Vec3f).
  • angle — угол вращения в радианах (число).
  • scale — масштаб (Vec3f).
  • collidable — столкновения (true/false).
  • dynamic — физический объект (true/false).
  • sensor — сенсор (true/false).
  • content — текст для текстовых объектов (строка).
  • video_autoplay — автозапуск видео (true/false).
  • video_loop — повтор видео (true/false).
  • video_muted — без звука (true/false).
  • mass — масса в кг (число, для dynamic).
  • friction — трение (0-1).
  • restitution — упругость (0-1).
  • centre_of_mass_offset_os — смещение центра масс (Vec3f).
  • audio_source_url — URL аудио (строка).
  • audio_volume — громкость (число, по умолчанию 1).
  • Методы:
  • getNumMaterials() — число материалов.
  • getMaterial(index) — возвращает материал по индексу.
  • Material:
  • Атрибуты:
  • colour — цвет (Vec3f, sRGB).
  • colour_texture_url — URL текстуры цвета (строка).
  • emission_rgb — цвет излучения (Vec3f, sRGB).
  • emission_texture_url — URL текстуры излучения (строка).
  • normal_map_url — URL нормалей (строка).
  • roughness_val — шероховатость (0-1).
  • roughness_texture_url — URL текстуры шероховатости (строка).
  • metallic_fraction_val — металличность (0-1).
  • opacity_val — непрозрачность (0-1).
  • tex_matrix — матрица текстур (Matrix2f, по умолчанию {1, 0, 0, 1}).
  • emission_lum_flux_or_lum — световой поток или яркость (число).
  • hologram — голограмма (true/false).
  • double_sided — двусторонний рендер (true/false).
  • Avatar:
  • Атрибуты:
  • pos — позиция (Vec3d, ~1.67 м над поверхностью).
  • name — имя пользователя (строка).
  • linear_velocity — скорость (Vec3f, м/с).
  • vehicle_inside — транспорт (Object или nil). Примеры скриптов Luau