entity
Кешированный snapshot всех игроков, плюс bone-аксессоры для хитбоксов, реестр кастомных моделей и query текущей aim-цели. Самый быстрый путь к per-player данным, чит держит этот кеш в актуальном состоянии за тебя, не нужно платить за прогулку по game.Players руками.
| Функций | 9 (27 с алиасами) |
| Проверено вживую | 5 из 9 (4 функции реестра моделей задокументированы из dump, не выполнены) |
| Требуемый event | нет |
| Сайд-эффекты | AddModel, EditModel, RemoveModel, ClearModels мутируют реестр кастомных entity чита |
Алиасы. Три формы у каждой:
entity.GetPlayers/getPlayers/get_players. См. Обзор / Конвенция именования.
Краткий справочник
| Функция | Сигнатура | Заметка | Статус |
|---|---|---|---|
GetPlayers | ([onlyEnemies: bool]) → table { [1..n] = player } | массив player userdata, основной запрос | проверено |
GetLocalPlayer | () → player | локальный пользователь как player userdata | проверено |
GetTarget | () → player | nil | текущий aim-target или nil | проверено |
GetParts | () → table { [1..n] = idx } | кешированные part-индексы, часто пустой | проверено |
GetPartsCount | () → int | длина GetParts() без аллокации table | проверено |
AddModel | (key: string, data: table) | внедрить кастомную entity в кеш | частично |
EditModel | (key: string, data: table) | мутировать поля зарегистрированной entity | частично |
RemoveModel | (key: string) | удалить зарегистрированную кастомную entity | частично |
ClearModels | () | удалить все кастомные entity сразу | частично |
Player userdata
Каждое значение возвращаемое GetPlayers, GetLocalPlayer и GetTarget это player userdata с фиксированным набором read-only полей и 4 методами доступа к bones. Проверено вживую в The Wild West с 29 активными игроками в лобби.
Поля
Доступ через dot syntax: p.Name, p.Health и т.д.
| Поле | Тип | Проверенный пример | Заметка |
|---|---|---|---|
Name | string | "xXSkyXx12345" | Roblox username |
DisplayName | string | "G59_chris" | display name установленное юзером |
UserId | number | 59135288 | Roblox UserId, постоянный при rename |
Team | string | "Cowboys", "Outlaws", "Enemy" | имя команды. НЕ Instance, просто строка |
TeamColor | userdata | tostring даёт "49980, 10200, 7140", .R/.G/.B дают 196, 40, 28 | аксессоры .R/.G/.B возвращают байты 0..255 (НЕ 0..1 float'ы как Roblox Color3). Форма tostring в 16-bit scale (0..65535). См. ниже. |
Weapon | string | "PrimaryDisplay" | идентификатор текущего оружия, пустая строка если ничего |
Position | Vector3 | часто (0, 0, 0) | часто stale, см. warning ниже |
Velocity | Vector3 | (0, 0, 0) когда стоит, unit-length направление (например (-0.76, 0, -0.65) с Magnitude == 1) когда движется | нормализованное направление ходьбы, НЕ raw физическая скорость. Всегда (0,0,0) для idle игроков |
Health | number | 71 | текущий HP |
MaxHealth | number | 100 | макс HP |
IsAlive | bool | true | проверка ragdoll / spawned |
IsEnemy | bool | true | true если на противоположной команде |
IsVisible | bool | false | true если не за стеной (см. также BoundingBox) |
IsWhitelisted | bool | false | true если помечен friendly через game.PlayerWhitelist |
BoundingBox | table {x, y, w, h} | {x=1277, y=-2917, w=16, h=66} | прямоугольник в screen-space пикселях, все нули если off-screen. См. ниже. |
Position часто stale, используй bonesВ FFA / vehicle / Western режимах p.Position часто (0, 0, 0) даже для живых, движущихся игроков. Bone-аксессоры ниже возвращают живую world-позицию каждый кадр:
local hrp = p:GetBonePosition("HumanoidRootPart")
TeamColor это Serotonin-кастомное userdata, НЕ Roblox Color3Проверено два формата доступа на одном значении (команда Outlaws):
tostring(tc)→"49980, 10200, 7140"(16-bit каналы, 0..65535)tc.R, tc.G, tc.B→196, 40, 28(байты, 0..255)
Используй байтовую форму для повседневной работы, она напрямую матчится в Color3.fromRGB(r, g, b):
local tc = p.TeamColor
local color = Color3.fromRGB(tc.R, tc.G, tc.B)
Заметь что это отличается от стандартного Roblox Color3.R/.G/.B, который вернул бы 0..1 float'ы.
BoundingBox это готовый ESP-прямоугольникПроверено: видимый игрок дал {x=1277, y=-2917, w=16, h=66} (y отрицательный потому что игрок был выше экрана в этот кадр). Off-screen игроки дают {0, 0, 0, 0}. Можно сразу скармливать в draw.Rect:
local bb = p.BoundingBox
if bb.w > 0 then
draw.Rect(bb.x, bb.y, bb.w, bb.h, Color3.fromRGB(255, 0, 0), 1, 0, 1)
end
Методы
Player userdata имеет 4 bone-аксессора. Имена костей это стандартные Roblox R15 / R6 part names: HumanoidRootPart, Head, UpperTorso, LowerTorso, LeftUpperArm, RightUpperArm, LeftUpperLeg, RightUpperLeg и т.д.
| Метод | Возврат | Проверенный пример для HumanoidRootPart |
|---|---|---|
:GetBonePosition(name) | Vector3 | (-1253.6, 170.8, -636.5) |
:GetBoneSize(name) | Vector3 | (5.0, 5.0, 5.0) (хитбокс чита, не физический размер part'а) |
:GetBoneRotation(name) | table[1..9] | flat 3x3 rotation matrix как 9 чисел |
:GetBoneInstance(name) | Instance | underlying Roblox part как usable Instance handle |
local p = entity.GetPlayers()[1]
local hrp_pos = p:GetBonePosition("HumanoidRootPart")
local head_pos = p:GetBonePosition("Head")
print(string.format("hrp=(%.1f, %.1f, %.1f) head=(%.1f, %.1f, %.1f)",
hrp_pos.X, hrp_pos.Y, hrp_pos.Z,
head_pos.X, head_pos.Y, head_pos.Z))
GetPlayers
entity.GetPlayers([onlyEnemies: bool]) → table { [1..n] = player_userdata }
Возвращает массив каждого игрока которого чит сейчас отслеживает. С onlyEnemies = true массив pre-filtered к игрокам у которых IsEnemy == true.
Проверено вживую: полный список вернул 29 entries, GetPlayers(true) вернул 8.
local players = entity.GetPlayers()
print(string.format("отслеживается %d игроков", #players))
local enemies = entity.GetPlayers(true)
for _, p in ipairs(enemies) do
if p.IsAlive then
local pos = p:GetBonePosition("HumanoidRootPart")
print(string.format(" враг %s в (%.1f, %.1f, %.1f) hp=%d",
p.Name, pos.X, pos.Y, pos.Z, p.Health))
end
end
Возвращаемые userdata ссылки остаются валидными пока ты их держишь, но их поля обновляются каждый кадр. Перезывай GetPlayers() каждый тик если код может вытерпеть iteration cost, или кешируй userdata и читай свежие поля каждый кадр.
GetLocalPlayer
entity.GetLocalPlayer() → player_userdata
Возвращает тот же тип userdata что GetPlayers() но для локального юзера. Тот же набор полей.
Проверено вживую (lobby state, ещё не заспавнен):
Name=Hiskhie UserId=8632930326 Team=Cowboys
Health=0 MaxHealth=0 IsAlive=false Position=(0,0,0)