CS2 Lua API

vector

Трёхмерный вектор: позиции, направления, скорости в мире игры. Поля x, y, z (числа с плавающей точкой).

Общее для vector, angle, vector2, color#

  • Методы вызываются через двоеточие (v:length()) или через тип (vector.length(v)).
  • Аргументы методов проверяются: неверный тип даёт ошибку bad argument '<арг>' to '<метод>' (<Тип> expected, got <type>).
  • tostring(v) даёт Vector(1.000000, 2.000000, 3.000000); v:strval() — только содержимое: 1.000000, 2.000000, 3.000000.
  • == сравнивает покомпонентно; значение другого типа даёт false.
  • vector.typesafe(false) отключает проверку аргументов для всего типа, vector.typesafe(true) — включает обратно.

vector(x?: number, y?: number, z?: number)#

Создаёт вектор. Незаданные компоненты равны 0. vector(v) — копия вектора v. То же самое — vector.new(...).

Параметр Тип Описание
x, y, z number компоненты, по умолчанию 0

Возвращает: vector.

local a = vector(1, 2, 3)
local b = vector(a)        -- копия
b.z = 10
print(a, " ", b)

Операторы#

Выражение Результат
a + b, a - b покомпонентно
a * n, n * a масштаб на число
a * b покомпонентное умножение
a / n, a / b деление на число или покомпонентно
-a вектор с обратным знаком
#a длина (как a:length())
local me = entity.local_pawn()
if me then
    local ahead = me:eye_position() + me:eye_angles():forward() * 100
    print(ahead)
end

v:unpack()#

Возвращает: number, number, number — x, y, z.

local x, y, z = vector(1, 2, 3):unpack()
print(x + y + z)   --> 6

v:init(...)#

Переинициализирует вектор на месте. Аргументы — как у конструктора; без аргументов — нулевой вектор.

Параметр Тип Описание
... number компоненты

Возвращает: ничего.

local v = vector(5, 5, 5)
v:init(1, 0, 0)
print(v)   --> Vector(1.000000, 0.000000, 0.000000)

src:copy(dst: vector)#

Копирует компоненты src в dst.

Параметр Тип Описание
dst vector куда копировать

Возвращает: ничего.

local saved = vector()
local me = entity.local_pawn()
if me then me:origin():copy(saved) end

v:length(), v:lengthsqr()#

Длина вектора и её квадрат. Квадрат быстрее: удобно для сравнения расстояний.

Возвращает: number.

local v = vector(3, 4, 0)
print(v:length(), " ", v:lengthsqr())   --> 5 25

v:length2d(), v:length2dsqr()#

Длина по осям X и Y (без высоты) и её квадрат.

Возвращает: number.

local me = entity.local_pawn()
if me then print("Скорость по земле: ", math.floor(me:velocity():length2d())) end

a:dist(b: vector), a:distsqr(b: vector)#

Расстояние между точками и его квадрат.

Параметр Тип Описание
b vector вторая точка

Возвращает: number.

-- Ближайший противник
local me = entity.local_pawn()
if me then
    local best, best_d = nil, math.huge
    for _, pawn in ipairs(entity.pawns(true)) do
        local d = me:origin():distsqr(pawn:origin())
        if d < best_d then best, best_d = pawn, d end
    end
    print(best and best:name() or "никого")
end

a:dist2d(b: vector), a:dist2dsqr(b: vector)#

Расстояние по осям X и Y (без высоты) и его квадрат.

Параметр Тип Описание
b vector вторая точка

Возвращает: number.

print(vector(0, 0, 0):dist2d(vector(3, 4, 100)))   --> 5

a:dot(b: vector)#

Скалярное произведение.

Параметр Тип Описание
b vector второй вектор

Возвращает: number.

-- Смотрит ли игрок примерно в сторону врага (угол меньше ~25°)
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
    local fwd = me:eye_angles():forward()
    local to  = me:eye_position():to(enemy:eye_position())
    print(fwd:dot(to) > 0.9)
end

a:cross(b: vector)#

Векторное произведение.

Параметр Тип Описание
b vector второй вектор

Возвращает: vector.

print(vector(1, 0, 0):cross(vector(0, 1, 0)))   -- (0, 0, 1)

a:lerp(b: vector, t: number)#

Линейная интерполяция между a и b.

Параметр Тип Описание
b vector вторая точка
t number доля: 0 — a, 1 — b

Возвращает: vector.

local mid = vector(0, 0, 0):lerp(vector(10, 20, 30), 0.5)
print(mid)   -- (5, 10, 15)

a:to(b: vector)#

Единичный вектор направления от a к b.

Параметр Тип Описание
b vector точка назначения

Возвращает: vector.

local dir = vector(0, 0, 0):to(vector(10, 0, 0))
print(dir)   -- (1, 0, 0)

v:normalize(), v:normalized()#

normalize делает вектор единичным на месте и возвращает прежнюю длину (0 — вектор был нулевым). normalized возвращает единичную копию, не меняя исходный.

Возвращает: normalize — number; normalized — vector.

local v = vector(3, 4, 0)
local len = v:normalize()
print(len, " ", v)   -- 5 и вектор (0.6, 0.8, 0)

v:normalize_safe(fallback: vector), v:normalized_safe(fallback: vector)#

Как normalize и normalized, но при нулевой длине результатом становится fallback.

Параметр Тип Описание
fallback vector значение при нулевой длине

Возвращает: normalize_safe — number; normalized_safe — vector.

local dir = vector(0, 0, 0):normalized_safe(vector(1, 0, 0))
print(dir)   -- (1, 0, 0)

v:scale(s: number), v:scaled(s: number)#

scale умножает вектор на число на месте, scaled возвращает умноженную копию.

Параметр Тип Описание
s number множитель

Возвращает: scale — ничего; scaled — vector.

local v = vector(1, 2, 3)
print(v:scaled(2), " ", v)   -- копия и неизменённый исходный
v:scale(10)
print(v)

v:negate()#

Меняет знак всех компонент на месте.

Возвращает: ничего.

local v = vector(1, -2, 3)
v:negate()
print(v)   -- (-1, 2, -3)

fwd:angles(pseudo_up?: vector)#

Углы, задающие направление fwd. С pseudo_up считается ещё и крен.

Параметр Тип Описание
pseudo_up vector приблизительный вектор «вверх»

Возвращает: angle.

-- Углы, чтобы посмотреть из глаз на врага
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
    local ang = (enemy:eye_position() - me:eye_position()):angles()
    print(ang)
end

fwd:vectors()#

Векторы «вправо» и «вверх» для направления fwd.

Возвращает: vector, vector — right, up.

local right, up = vector(1, 0, 0):vectors()
print(right, " ", up)

p:closest_line_point(a: vector, b: vector)#

Ближайшая к p точка отрезка a–b.

Параметр Тип Описание
a vector начало отрезка
b vector конец отрезка

Возвращает: vector.

local p = vector(5, 5, 0):closest_line_point(vector(0, 0, 0), vector(10, 0, 0))
print(p)   -- (5, 0, 0)

p:inverse_lerp(a: vector, b: vector)#

Параметр t проекции точки p на прямую a → b (не обрезается до 0–1).

Параметр Тип Описание
a vector начало
b vector конец

Возвращает: number, vector — t и вектор b - a. Если a и b почти совпадают — 0, b - a.

local t = vector(2.5, 3, 0):inverse_lerp(vector(0, 0, 0), vector(10, 0, 0))
print(t)   --> 0.25

p:ray_dist(start: vector, dir: vector)#

Расстояние от точки p до луча из start в направлении dir (dir должен быть единичным).

Параметр Тип Описание
start vector начало луча
dir vector единичное направление

Возвращает: number.

-- Насколько враг далёк от линии прицела
local me = entity.local_pawn()
local enemy = entity.pawns(true)[1]
if me and enemy then
    local d = enemy:eye_position():ray_dist(me:eye_position(), me:eye_angles():forward())
    print("До линии прицела: ", math.floor(d))
end