CS2 Lua API

entity

Модуль entity находит сущности игры: игроков, оружие, правила игры и любые другие объекты. Методы самого объекта сущности описаны на странице «entity: методы».

Объект сущности#

Функции модуля возвращают объект сущности (entity). Через него можно вызывать методы (pawn:health()) и читать и писать любое поле схемы игры по имени (pawn.m_iHealth).

  • Объект запоминает конкретную сущность. Если сущность удалена, объект становится недействительным и не превращается в другую сущность, даже если её слот занят заново.
  • Объекты одной сущности равны по ==.
  • tostring(ent) даёт entity<ИмяКласса>: <индекс>.

После удаления сущности почти все методы её объекта дают ошибку bad entity index. Работают только ent:entindex() и ent:is_valid(). Если храните объекты между кадрами, проверяйте ent:is_valid().

В CS2 игрок — это две сущности: контроллер (CCSPlayerController, имя, слот, счёт) и пешка (C_CSPlayerPawn, модель, здоровье, позиция, оружие). entity.local_player() возвращает обе.

entity.entindex(index: number)#

Сущность по индексу.

Параметр Тип Описание
index number индекс сущности

Возвращает: entity или nil, если слот пуст или индекс вне диапазона 0..32766.

local world = entity.entindex(0)
print(world)   -- сущность мира, индекс 0

entity.handle(handle: number)#

Сущность по полному дескриптору (как его возвращает ent:handle()). Удобно, чтобы хранить ссылку на сущность числом.

Параметр Тип Описание
handle number дескриптор сущности

Возвращает: entity или nil, если сущность уже удалена.

local saved = nil

events.render:set(function()
    local me = entity.local_pawn()
    if me and not saved then saved = me:handle() end
    if saved and entity.handle(saved) == nil then
        print("Сохранённая пешка удалена")
        saved = nil
    end
end)

entity.playerslot(slot: number)#

Контроллер игрока по слоту (индекс сущности slot + 1).

Параметр Тип Описание
slot number слот игрока, 0..64; -1 — нет игрока

Вне -1..64 — ошибка invalid player slot.

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

for slot = 0, globals.maxplayers - 1 do
    local ctrl = entity.playerslot(slot)
    if ctrl then print(slot, " ", ctrl:name()) end
end

entity.userid(userid: number)#

Контроллер игрока по userid из игровых событий.

Параметр Тип Описание
userid number userid игрока

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

local ctrl = entity.local_controller()
if ctrl then
    print(entity.userid(ctrl:userid()) == ctrl)   --> true
end

entity.instance(ptr: lightuserdata|cdata)#

Сущность по указателю на объект в памяти игры.

Параметр Тип Описание
ptr lightuserdata или cdata указатель на объект сущности

Возвращает: entity или nil, если указатель не принадлежит ни одной сущности.

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

Перечисление сущностей#

Функции list, match, gmatch ищут по C++-имени класса ("C_CSPlayerPawn"), функции designer_* — по дизайнерскому имени ("cs_player_controller"), без учёта регистра.

  • cls не передан — обходятся все сущности.
  • derived = true — подходят также классы-наследники cls.
  • Неизвестное или пустое имя — ошибка '<имя>' is not a valid entity class/designer name.

entity.list(cls?: string, derived?: boolean)#

Все подходящие сущности.

Параметр Тип Описание
cls string C++-имя класса
derived boolean учитывать наследников, по умолчанию false

Возвращает: table — массив entity.

local all   = entity.list()
local pawns = entity.list("C_CSPlayerPawn")
local ents  = entity.list("C_BaseEntity", true)   -- все наследники C_BaseEntity
print(#all, " ", #pawns, " ", #ents)

entity.match(cls?: string, derived?: boolean)#

Первая подходящая сущность.

Параметр Тип Описание
cls string C++-имя класса
derived boolean учитывать наследников, по умолчанию false

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

local c4 = entity.match("C_PlantedC4")
if c4 then print("Бомба стоит в ", tostring(c4:origin())) end

entity.gmatch(cls?: string, derived?: boolean)#

Итератор для for ... in. Список собирается в момент вызова gmatch.

Параметр Тип Описание
cls string C++-имя класса
derived boolean учитывать наследников, по умолчанию false

Возвращает: function — итератор.

for ctrl in entity.gmatch("CCSPlayerController") do
    print(ctrl:name())
end

entity.designer_list(name?: string, derived?: boolean)#

Все сущности с дизайнерским именем name.

Параметр Тип Описание
name string дизайнерское имя
derived boolean учитывать наследников, по умолчанию false

Возвращает: table — массив entity.

print("Контроллеров: ", #entity.designer_list("cs_player_controller"))

entity.designer_match(name?: string, derived?: boolean)#

Первая сущность с дизайнерским именем name.

Параметр Тип Описание
name string дизайнерское имя
derived boolean учитывать наследников, по умолчанию false

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

local ctrl = entity.designer_match("cs_player_controller")
print(ctrl)

entity.designer_gmatch(name?: string, derived?: boolean)#

Итератор по сущностям с дизайнерским именем name.

Параметр Тип Описание
name string дизайнерское имя
derived boolean учитывать наследников, по умолчанию false

Возвращает: function — итератор.

for ctrl in entity.designer_gmatch("cs_player_controller") do
    print(ctrl:entindex(), " ", ctrl:name())
end

entity.designer_vdata(name: string)#

Данные оружия (CCSWeaponBaseVData) по техническому имени предмета, без сущности.

Параметр Тип Описание
name string имя предмета: "weapon_ak47", "weapon_awp" и т. п.; регистр учитывается

Возвращает: declared_class или nil, если предмета с таким именем нет. Поля читаются по именам схемы, как у ent:vdata().

local v = entity.designer_vdata("weapon_ak47")
if v then
    print(v.m_szName, " урон: ", v.m_nDamage)
end

entity.vdata(cls: string)#

Данные оружия по C++-имени класса. Класс переводится в дизайнерское имя, дальше — как entity.designer_vdata. Работает только у классов предметов; у прочих классов возвращает nil.

Параметр Тип Описание
cls string C++-имя класса, например "C_AK47"

Неизвестное имя класса — ошибка '<имя>' is not a valid entity class/designer name.

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

local v = entity.vdata("C_AK47")
if v then print(v.m_szName) end

entity.local_player()#

Локальный игрок: контроллер и пешка.

Возвращает: entity, entity — контроллер и пешка. Если пешки нет — ctrl, nil; если нет контроллера — nil, nil.

local ctrl, pawn = entity.local_player()
if pawn then
    print(ctrl:name(), ": ", pawn:health(), " HP")
end

entity.local_controller()#

Возвращает: entity или nil — контроллер локального игрока.

local me = entity.local_controller()
if me then print("Мой слот: ", me:playerslot()) end

entity.local_pawn()#

Возвращает: entity или nil — пешка локального игрока.

local me = entity.local_pawn()
if me and me:is_alive() then
    print("Скорость: ", me:velocity():length2d())
end

entity.players(enemies?: boolean, dead?: boolean)#

Игроки в виде таблицы {[контроллер] = пешка}. Игроки вне зоны видимости сервера (дремлющие) пропускаются всегда.

Параметр Тип Описание
enemies boolean true — только противники; по умолчанию false
dead boolean true — включать мёртвых; по умолчанию false

Возвращает: table — {[entity] = entity}.

for ctrl, pawn in pairs(entity.players(true)) do
    print(ctrl:name(), ": ", pawn:health(), " HP")
end

entity.pawns(enemies?: boolean, dead?: boolean)#

То же, что players, но результат — массив пешек.

Параметр Тип Описание
enemies boolean true — только противники; по умолчанию false
dead boolean true — включать мёртвых; по умолчанию false

Возвращает: table — массив entity.

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

-- Счёт живых противников и их суммарное здоровье
events.render:set(function()
    local enemies, total_hp = entity.pawns(true), 0
    for _, pawn in ipairs(enemies) do
        total_hp = total_hp + pawn:health()
    end
    render.text(vector2(20, 80), color(255, 120, 120, 255), font, nil, "Врагов: ", #enemies, "  HP: ", total_hp)
end)

entity.controllers()#

Все контроллеры игроков, без фильтров.

Возвращает: table — массив entity.

print("Игроков на сервере: ", #entity.controllers())

entity.player_resource()#

Возвращает: entity или nil — сущность ресурса игроков.

print(entity.player_resource())

entity.game_rules()#

Правила игры (C_CSGameRules).

Возвращает: declared_class или nil. Поля читаются по именам схемы, см. «Типы схемы».

local rules = entity.game_rules()
if rules and rules.m_bWarmupPeriod then
    print("Идёт разминка")
end

entity.game_mode_rules()#

Правила текущего режима игры (m_pGameModeRules правил игры).

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

local mode = entity.game_mode_rules()
print(mode and mode:classname() or "нет")