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 "нет")