Перейти к содержимому

Математика и время

KILLSCRIPT предоставляет нативные userdata Vector2, Vector3 и Quaternion. Их поля и методы уже типизированы, но TypeScript не знает, что Lua умеет применять +, - и * к таким объектам. Математические методы SDK выражают проверенные нативные операции, не притворяясь JavaScript-числами.

import {
quaternion,
vector2,
vector3,
} from "@killscript/sdk/client";
const screenEnd = vector2.add(screenStart, screenOffset);
const target = vector3.add(origin, offset);
const relative = vector3.subtract(target, origin);
const facing = quaternion.multiply(yawRotation, pitchRotation);
const direction = quaternion.rotate(facing, Vector3.forward);
HelperСгенерированная операция
vector2.add(a, b)a + b
vector2.subtract(a, b)a - b
vector3.add(a, b)a + b
vector3.subtract(a, b)a - b
quaternion.multiply(a, b)a * b
quaternion.rotate(rotation, vector)rotation * vector

Объект-обёртка не создаётся: во время компиляции вызов заменяется нативным оператором. Нативные members вроде origin.Distance(target), value.normalized, rotation.Angle(other) и Quaternion.lookRotation(...) продолжайте использовать напрямую.

Объект time возвращает те же значения, что нативный глобальный API Time, но через короткие и безопасные для контекста имена:

import { time } from "@killscript/sdk/server";
const nowSeconds = time.seconds(); // Time.Seconds
const nowTick = time.tick(); // Time.Tick
const seconds = time.toSeconds(30);

Серверные дедлайны и сравнения удобнее хранить в тиках: они напрямую следуют прогрессу симуляции.

const expiresAtTick = time.tick() + time.ceilTicks(2);
function hasExpired(): boolean {
return time.tick() >= expiresAtTick;
}

В текущей сборке нативный Time.SecondsToTick() обрезает значение возле границ floating point. Проверка в игре показала:

Time.SecondsToTick(0.5) -> 29
Time.SecondsToTick(1.0) -> 59

Если задержка или дедлайн должны длиться не меньше заданного времени, используйте time.ceilTicks(seconds):

const halfSecond = time.ceilTicks(0.5); // 30
const oneSecond = time.ceilTicks(1); // 60

time.toTicks() намеренно сохраняет обрезающее поведение игры и нужен только когда требуется именно оно. time.ceilTicks() делит длительность на текущую длину нативного тика и округляет вверх.

Если нужно запустить обработчик, а не сравнивать дедлайн вручную, используйте Планировщик.