Скриптинг на Luau в MetasiberiaВ Metasiberia вы можете оживлять свои объекты с помощью языка Luau — современной версии Lua, вдохновлённой Roblox. Это мощный инструмент для создания интерактивных элементов и автоматизации в твоём виртуальном мире.
Создание скрипта для объекта.Для работы со скриптами нужен клиент Substrata.
- Откройте клиент и дважды щёлкните по объекту, который хотите настроить.
- В разделе "Скрипт" нажмите "Редактировать" — появится окно редактора.
- Начните код с --lua, чтобы указать, что используете Luau (а не Winter или XML).
- После внесения изменений закройте редактор — скрипт сразу применится к объекту.
Как работают скрипты.Скрипты в 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