CS2 Lua API

entity: методы

Методы объекта сущности. Методы игрока и оружия доступны у любого объекта, но проверяют класс при вызове: если класс не подходит, ошибка <ожидаемый класс> expected, got <класс сущности>.

Поля схемы#

Любое поле схемы игры читается и пишется по имени: ent.m_iHealth, ent.m_vecAbsVelocity. Поиск учитывает базовые классы.

  • Поле не найдено — nil при чтении, ошибка attempt to write to an invalid field при записи.
  • Типы значений описаны на странице «Типы схемы».
  • Имена методов не пересекаются с полями: поля начинаются с m_.

Запись поля меняет память игры напрямую. Неверное значение может сломать состояние сущности или вызвать вылет игры.

local me = entity.local_pawn()
if me then
    print(me.m_iHealth, " ", me.m_iTeamNum, " ", me.m_ArmorValue)
end

ent:data()#

Возвращает: lightuserdata — указатель на объект сущности в памяти игры.

local me = entity.local_pawn()
if me then print(me:data()) end

ent:type()#

Возвращает: type или nil — тип схемы класса сущности (см. «Типы схемы»).

local me = entity.local_pawn()
if me then print(me:type():name()) end   --> C_CSPlayerPawn

ent:classname()#

Возвращает: string — C++-имя класса, при отсутствии "void".

for _, ent in ipairs(entity.list()) do
    if ent:classname() == "C_SmokeGrenadeProjectile" then
        print("Летит дым: ", ent:entindex())
    end
end

ent:classid(id?: number, flag?: boolean)#

Номер сетевого класса сущности. Номера назначает клиент игры при инициализации сетевых классов, поэтому сравнивайте с номером, полученным у сущности, а не с числом, записанным в коде.

Параметр Тип Описание
id number номер для сравнения
flag boolean true — сравнивать также с номерами базовых классов; по умолчанию false
  • Без id — номер сетевого класса или -1, если у класса сущности нет своего сетевого класса (базовые классы не учитываются).
  • С id — true, если номер равен id.
  • С id и flag = true — true, если id равен номеру класса сущности или одного из её базовых классов. Проверка баз останавливается на первом базовом классе без своего сетевого класса.

Возвращает: number без id; boolean с id.

local me = entity.local_pawn()
if me then
    local id = me:classid()
    print("classid: ", id)
    for _, pawn in ipairs(entity.pawns(false, true)) do
        print(pawn:entindex(), " тот же класс: ", pawn:classid(id))
    end
end

ent:entindex()#

Индекс сущности. Работает и у недействительного объекта.

Возвращает: number; -1, если объект пустой.

events.entity_deleted:set(function(ent)
    print("Удалена сущность #", ent:entindex())
end)

ent:is_valid()#

Существует ли ещё эта сущность. Не даёт ошибок.

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

local target = nil

events.render:set(function()
    if target and not target:is_valid() then
        print("Цель пропала")
        target = nil
    end
    target = target or entity.pawns(true)[1]
end)

ent:handle()#

Возвращает: number — полный дескриптор сущности; по нему entity.handle вернёт этот же объект, пока сущность жива.

local me = entity.local_pawn()
if me then print(entity.handle(me:handle()) == me) end   --> true

ent:designer()#

Возвращает: string или nil — дизайнерское имя класса.

local me = entity.local_controller()
if me then print(me:designer()) end   --> cs_player_controller

ent:health()#

Возвращает: number — здоровье (m_iHealth).

local me = entity.local_pawn()
if me and me:health() < 30 then print("Мало здоровья!") end

ent:is_alive()#

Возвращает: boolean — жива ли сущность (m_lifeState == 0).

local alive = 0
for _, pawn in ipairs(entity.pawns(false, true)) do
    if pawn:is_alive() then alive = alive + 1 end
end
print("Живых: ", alive)

ent:is_dormant()#

Возвращает: boolean — дремлет ли сущность (сервер давно не присылал её данные).

for _, pawn in ipairs(entity.list("C_CSPlayerPawn")) do
    if pawn:is_dormant() then print(pawn, " — данные устарели") end
end

ent:world_group()#

Возвращает: number — номер группы мира сущности, при отсутствии 0.

local me = entity.local_pawn()
if me then print(me:world_group()) end

ent:owner()#

Владелец сущности (m_hOwnerEntity), например игрок для оружия.

Возвращает: entity или nil.

Объект владельца возвращается без проверки существования. Перед использованием вызовите :is_valid().

local me = entity.local_pawn()
local w = me and me:weapon()
if w then
    local owner = w:owner()
    print(owner and owner:is_valid() and owner == me)   --> true
end

ent:origin(v?: vector)#

Без аргумента возвращает позицию сущности в мире. С аргументом vector — переносит сущность в эту точку.

Параметр Тип Описание
v vector новая позиция; не передан — чтение

Возвращает: vector при чтении; ничего при записи.

local me = entity.local_pawn()
if me then
    for _, pawn in ipairs(entity.pawns(true)) do
        print(pawn:name(), ": ", math.floor(me:origin():dist(pawn:origin())), " юнитов")
    end
end

ent:angles(a?: angle)#

Без аргумента возвращает углы поворота сущности в мире. С аргументом angle — задаёт их.

Параметр Тип Описание
a angle новые углы; не передан — чтение

Возвращает: angle при чтении; ничего при записи.

local me = entity.local_pawn()
if me then print(me:angles()) end

ent:velocity()#

Возвращает: vector — скорость сущности.

local font = render.load_font("Verdana", 16, "outline")

events.render:set(function()
    local me = entity.local_pawn()
    if not me or not me:is_alive() then return end
    local speed = math.floor(me:velocity():length2d())
    local s = render.screen_size()
    render.text(vector2(s.x / 2, s.y - 120), color(255, 255, 255, 255), font, "c", speed)
end)

ent:identity()#

Возвращает: declared_class — объект CEntityIdentity сущности.

local me = entity.local_pawn()
if me then print(me:identity().m_designerName) end

ent:skeleton()#

Возвращает: declared_class или nil — скелет сущности (CSkeletonInstance).

local me = entity.local_pawn()
local sk = me and me:skeleton()
print(sk and sk:classname() or "нет скелета")

ent:controller()#

Контроллер пешки. Класс: C_CSPlayerPawnBase.

Возвращает: entity или nil.

for _, pawn in ipairs(entity.pawns(true)) do
    local ctrl = pawn:controller()
    print(ctrl and ctrl:name() or "?")
end

ent:pawn()#

Пешка контроллера. Класс: CCSPlayerController.

Возвращает: entity или nil. Объект возвращается без проверки существования — проверьте :is_valid().

for _, ctrl in ipairs(entity.controllers()) do
    local pawn = ctrl:pawn()
    if pawn and pawn:is_valid() then
        print(ctrl:name(), ": ", pawn:health())
    end
end

ent:playerslot()#

Возвращает: number или nil — слот игрока (индекс − 1) для контроллера; для других сущностей nil.

local me = entity.local_controller()
if me then print(me:playerslot()) end

ent:userid()#

Возвращает: number или nil — userid игрока для контроллера; для других сущностей nil.

local me = entity.local_controller()
if me then print("userid: ", me:userid()) end

ent:weapon()#

Активное оружие. Класс: C_CSPlayerPawnBase.

Возвращает: entity или nil.

local me = entity.local_pawn()
local w = me and me:weapon()
if w then print(w:classname()) end

ent:weapons()#

Все оружия пешки. Класс: C_CSPlayerPawnBase.

Возвращает: atomic_collection — коллекция (индексы с 0, см. «Типы схемы»).

local me = entity.local_pawn()
if me then
    for i, w in pairs(me:weapons():value()) do
        print(i, " ", w)
    end
end

ent:eye_angles()#

Углы взгляда. Класс: C_CSPlayerPawnBase.

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

local me = entity.local_pawn()
if me then print(me:eye_angles()) end

ent:eye_position()#

Позиция глаз. Класс: C_CSPlayerPawnBase.

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

local me = entity.local_pawn()
if me then
    local eye = me:eye_position()
    local look = eye + me:eye_angles():forward() * 100
    print(look)   -- точка в 100 юнитах перед глазами
end

ent:view_offset()#

Смещение глаз относительно позиции. Класс: C_CSPlayerPawnBase.

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

local me = entity.local_pawn()
if me then print("Высота глаз: ", me:view_offset().z) end

ent:maxspeed()#

Максимальная скорость пешки. Класс: C_CSPlayerPawn.

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

local me = entity.local_pawn()
if me then print(me:maxspeed()) end

ent:name()#

Имя игрока. Работает у контроллера и у пешки (берётся имя её контроллера).

Возвращает: string или nil.

for _, pawn in ipairs(entity.pawns(true)) do
    print(pawn:name() or "?")
end

ent:hitbox_position(i: number)#

Позиция хитбокса с номером i.

Параметр Тип Описание
i number номер хитбокса, с 0

Возвращает: vector или nil, если номер вне диапазона или скелета нет.

events.render:set(function()
    for _, pawn in ipairs(entity.pawns(true)) do
        local hb = pawn:hitbox_position(0)
        local p = hb and render.world_to_screen(hb)
        if p then render.circle(p, color(255, 255, 0, 255), 3) end
    end
end)

ent:max_health()#

Возвращает: number или nil — максимальное здоровье (m_iMaxHealth).

local me = entity.local_pawn()
if me then print(me:health(), "/", me:max_health()) end

ent:is_enemy(other?: entity)#

Противник ли эта сущность. Учитывается квар mp_teammates_are_enemies.

Параметр Тип Описание
other entity с кем сравнивать; по умолчанию — со своей стороной (локальный или наблюдаемый игрок)

Возвращает: boolean. Если своей стороны нет — true.

for _, pawn in ipairs(entity.pawns()) do
    print(pawn:name(), pawn:is_enemy() and " — враг" or " — союзник")
end

ent:vdata()#

Данные оружия (CCSWeaponBaseVData). Класс: C_CSWeaponBase.

Возвращает: declared_class или nil.

local me = entity.local_pawn()
local w = me and me:weapon()
local vd = w and w:vdata()
if vd then print("Урон: ", vd.m_nDamage, "  Дальность: ", vd.m_flRange) end

ent:inaccuracy()#

Текущая неточность оружия. Класс: C_CSWeaponBase.

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

local me = entity.local_pawn()
local w = me and me:weapon()
if w then print(string.format("inaccuracy %.4f", w:inaccuracy())) end

ent:spread()#

Разброс оружия в текущем режиме. Класс: C_CSWeaponBase.

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

local me = entity.local_pawn()
local w = me and me:weapon()
if w then print(string.format("spread %.4f", w:spread())) end

ent:update_accuracy_penalty()#

Пересчитывает штраф точности оружия. Класс: C_CSWeaponBase.

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

local me = entity.local_pawn()
local w = me and me:weapon()
if w then
    w:update_accuracy_penalty()
    print(w:inaccuracy())
end

ent:item()#

Предмет экономики (C_EconItemView) — данные скина и предмета. Класс: C_EconEntity.

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

local me = entity.local_pawn()
local w = me and me:weapon()
if w then print(w:item().m_iItemDefinitionIndex) end

ent:scale_damage(dmg: number, vdata: declared_class, hitgroup: number, attacker?: entity)#

Урон по этой пешке с учётом хитгруппы, брони, шлема и урона по своим. Класс: C_CSPlayerPawn.

Параметр Тип Описание
dmg number исходный урон
vdata declared_class данные оружия — передавайте weapon:vdata()
hitgroup number хитгруппа: 1 — голова, 2 — грудь, 3 — живот, 4–5 — руки, 6–7 — ноги
attacker entity пешка стрелка (C_CSPlayerPawn), для учёта урона по своим

Возвращает: number — итоговый урон.

local me = entity.local_pawn()
local w = me and me:weapon()
local vd = w and w:vdata()
if vd then
    for _, pawn in ipairs(entity.pawns(true)) do
        print(pawn:name(), ": в голову ", pawn:scale_damage(vd.m_nDamage, vd, 1, me))
    end
end