Скриптинг в Metasiberia.
Примеры скриптов на Luau в Metasiberia

Приветственное сообщение при касании объекта
Простой скрипт, который показывает пользователю персонализированное сообщение, когда его аватар касается объекта.

--lua
function onUserTouchedObject(avatar, object) showMessageToUser("Привет, " .. avatar.name .. ", ты коснулся объекта!", avatar)
end
Когда аватар касается объекта (например, красного куба), на экране появляется приветствие с его именем.

Прыжковая площадка
Объект, который подбрасывает аватар в воздух при касании.

--lua
function onUserTouchedObject(avatar, object)
local v = avatar.linear_velocity
local new_v = Vec3f(v.x, v.y, 10.0) -- Подбрасываем вверх со скоростью 10 м/с avatar.linear_velocity = new_v
end
При контакте аватар получает вертикальный импульс, создавая эффект прыжка.
Изменение текста при входе/выходе с участка

Скрипт для текстового объекта, который меняет текст и цвет в зависимости от того, вошёл пользователь на участок или покинул его.

--lua
function onUserEnteredParcel(avatar, object, parcel)
object.content = "Пользователь вошёл на участок"
local mat = object:getMaterial(0)
mat.colour = Vec3f(0, 1, 0) -- Зелёный цвет
end

function onUserExitedParcel(avatar, object, parcel)
object.content = "Пользователь покинул участок"
local mat = object:getMaterial(0) mat.colour = Vec3f(1, 0.1, 0) -- Красноватый цвет
end
Текст обновляется, а цвет материала объекта меняется на зелёный при входе и красный при выходе.

Изменение цвета объекта при входе/выходе
Скрипт меняет цвет объекта, когда аватар входит или выходит с участка.

--lua
function onUserEnteredParcel(avatar, object, parcel)
local mat = object:getMaterial(0)
mat.colour = Vec3f(1, 0, 0) -- Красный цвет
end

function onUserExitedParcel(avatar, object, parcel)
local mat = object:getMaterial(0)
mat.colour = Vec3f(0, 1, 0) -- Зелёный цвет
end
Объект становится красным при входе и зелёным при выходе.

Объект, преследующий пользователей
Объект движется к ближайшему аватару, если тот находится в радиусе действия.

--lua
local near_user = nil
function onTimerEvent(object)
if near_user then
local dx = near_user.pos.x - object.pos.x
local dy = near_user.pos.y - object.pos.y
local dz = (near_user.pos.z - 1.68) - object.pos.z -- Учитываем высоту аватара
local d = math.sqrt(dx*dx + dy*dy + dz*dz)
if d > 1.0 then
dx = dx / d
dy = dy / d
dz = dz / d
local step_dist = 0.4
local newx = object.pos.x + dx * step_dist
local newy = object.pos.y + dy * step_dist
local newz = object.pos.z + dz * step_dist
object.pos = Vec3d(newx, newy, newz)
end
end
end
createTimer(onTimerEvent, 0.1, true) -- Обновление каждые 0.1 секунды
function onUserMovedNearToObject(avatar, object)
print("Аватар рядом!")
near_user = avatar
end
function onUserMovedAwayFromObject(avatar, object)
print("Аватар ушёл!")
near_user = nil
end
Объект плавно движется к аватару с шагом 0.4 м, пока тот в радиусе 20 метров, и останавливается, когда аватар уходит.

Телепортация
Скрипт для телепортации пользователя в определённые координаты пространства.

--lua
-- Функция для телепортации пользователя и отображения сообщения
function onUserTouchedObject(avatar, ob)
print("onUserTouchedObject!!!!!")

-- Телепортировать пользователя к новым координатам
local p = avatar.pos
p.x = -4265.
p.y = -424.8
p.z = 1434.63
avatar.pos = p

end