Начинающий
- Статус
- Оффлайн
- Регистрация
- 19 Окт 2025
- Сообщения
- 102
- Реакции
- 4
Здарова, парни. Столкнулся с довольно тупой, но упоротой проблемой в своём external‑чите под Rust, может кто уже проходил через это.
Проблема: рандомно пропадает ESP по луту/ящикам
Делаю отдельный ESP для лут‑объектов (деревянные ящики, военки, аирдропы и т.д.). Игроки рисуются стабильно, с этим всё ок, а вот лут‑ESP ведёт себя как шизофреник:
- часть ящиков видна нормально;
- часть вообще не попадает в список объектов;
- иногда один и тот же ящик появляется/исчезает в ESP при перезаходе на сервер или после рестарта чита.
Причём это не проблема в `world_to_screen` — если объект попал в цикл, он рисуется ровно. Проблема в том, что сами лут–объекты читаются очень нестабильно.
Как сейчас сделано
Я использую классический проход по `BaseNetworkable` -> `clientEntities` и просто фильтрую сущности по имени класса. Упрощённо код выглядит так:
В отрисовке просто бегу по `loot_list`, читаю позицию `Transform` и рисую текст/боксы.
Что не так по факту
На практике происходит следующее:
- На одних серверах список лута получается более‑менее полным.
- На других *часть объектов вообще не попадает в цикл* — будто их нет в `clientEntities`.
- Иногда один и тот же ящик, который был в ESP, после респавна/рестарта сервера перестаёт находиться по старым фильтрам по имени.
- Логи показывают, что `entity_count` и `entity_list` читаются корректно, но часть нужных объектов просто не проходит по строковому фильтру: имя либо другое, либо пустое/обрезанное.
Создаётся ощущение, что:
1. Часть лут‑объектов теперь живёт на других классах/префабах, где имя не совпадает с привычными `crate_`, `loot_barrel` и т.д.
2. Либо некоторые сущности теперь подгружаются через другие коллекции (например, отдельные менеджеры/спавнеры), а не через тот же `clientEntities`.
3. Либо я неправильно читаю/декодирую имя `GameObject` (Unicode‑строка), и периодически ловлю мусор или пустые строки вместо реального имени.
Куда копать дальше
Сейчас думаю в две стороны:
1. Перейти с фильтра по `GameObject`‑имени на фильтр по типу/классу, т.е. искать конкретные `LootContainer`, `SupplyDrop`, `HackableLockedCrate` и т.п. по их компонентам/полям, а не по строковому имени.
2. Либо вообще завести нормальный дамп классов, вытащить актуальный список лут‑типа через Il2CppInspector/Cpp2IL и уже от него плясать, вместо тупого `name.find("crate_")`.
Вопрос к тем, кто недавно обновлял лут–ESP
- Вы сейчас цепляетесь за `GameObject`‑имя, за тип компонента (`LootContainer`, `StorageContainer` и т.п.) или за что‑то ещё?
- Есть ли какие‑то «новые» префабы, которые не лежат в `clientEntities`, и их надо брать из другой коллекции/менеджера?
- Было ли такое, что часть лута стабильно не появляется в списке, хотя визуально он перед глазами?
Понимаю, что проблема отчасти «ручная» (я сам фильтрую по строкам), но сейчас уже не уверен, что вообще смотрю в правильную структуру — ощущение, что Facepunch на луте тихо что‑то подкрутили.
Проблема: рандомно пропадает ESP по луту/ящикам
Делаю отдельный ESP для лут‑объектов (деревянные ящики, военки, аирдропы и т.д.). Игроки рисуются стабильно, с этим всё ок, а вот лут‑ESP ведёт себя как шизофреник:
- часть ящиков видна нормально;
- часть вообще не попадает в список объектов;
- иногда один и тот же ящик появляется/исчезает в ESP при перезаходе на сервер или после рестарта чита.
Причём это не проблема в `world_to_screen` — если объект попал в цикл, он рисуется ровно. Проблема в том, что сами лут–объекты читаются очень нестабильно.
Как сейчас сделано
Я использую классический проход по `BaseNetworkable` -> `clientEntities` и просто фильтрую сущности по имени класса. Упрощённо код выглядит так:
Код:
struct BaseObject {
uintptr_t object; // GameObject*
uintptr_t entity; // BaseEntity*
std::string name; // class name / prefab name
};
std::vector<BaseObject> loot_list;
void update_loot_list()
{
loot_list.clear();
uintptr_t client_entities = MemUtils::read<uintptr_t>(g_base + offsets::clientEntities);
if (!client_entities)
return;
uintptr_t entity_list = MemUtils::read<uintptr_t>(client_entities + 0x10);
int entity_count = MemUtils::read<int>(client_entities + 0x18);
for (int i = 0; i < entity_count; ++i)
{
uintptr_t entity = MemUtils::read<uintptr_t>(entity_list + 0x20 + i * 0x8);
if (!entity)
continue;
uintptr_t object = MemUtils::read<uintptr_t>(entity + 0x10);
if (!object)
continue;
uintptr_t object_name_ptr = MemUtils::read<uintptr_t>(object + 0x60);
std::string name = MemUtils::read_unicode(object_name_ptr, 64); // мой helper
if (name.find("loot_barrel") != std::string::npos ||
name.find("crate_") != std::string::npos ||
name.find("supply_drop") != std::string::npos)
{
loot_list.push_back({ object, entity, name });
}
}
}
В отрисовке просто бегу по `loot_list`, читаю позицию `Transform` и рисую текст/боксы.
Что не так по факту
На практике происходит следующее:
- На одних серверах список лута получается более‑менее полным.
- На других *часть объектов вообще не попадает в цикл* — будто их нет в `clientEntities`.
- Иногда один и тот же ящик, который был в ESP, после респавна/рестарта сервера перестаёт находиться по старым фильтрам по имени.
- Логи показывают, что `entity_count` и `entity_list` читаются корректно, но часть нужных объектов просто не проходит по строковому фильтру: имя либо другое, либо пустое/обрезанное.
Создаётся ощущение, что:
1. Часть лут‑объектов теперь живёт на других классах/префабах, где имя не совпадает с привычными `crate_`, `loot_barrel` и т.д.
2. Либо некоторые сущности теперь подгружаются через другие коллекции (например, отдельные менеджеры/спавнеры), а не через тот же `clientEntities`.
3. Либо я неправильно читаю/декодирую имя `GameObject` (Unicode‑строка), и периодически ловлю мусор или пустые строки вместо реального имени.
Куда копать дальше
Сейчас думаю в две стороны:
1. Перейти с фильтра по `GameObject`‑имени на фильтр по типу/классу, т.е. искать конкретные `LootContainer`, `SupplyDrop`, `HackableLockedCrate` и т.п. по их компонентам/полям, а не по строковому имени.
2. Либо вообще завести нормальный дамп классов, вытащить актуальный список лут‑типа через Il2CppInspector/Cpp2IL и уже от него плясать, вместо тупого `name.find("crate_")`.
Вопрос к тем, кто недавно обновлял лут–ESP
- Вы сейчас цепляетесь за `GameObject`‑имя, за тип компонента (`LootContainer`, `StorageContainer` и т.п.) или за что‑то ещё?
- Есть ли какие‑то «новые» префабы, которые не лежат в `clientEntities`, и их надо брать из другой коллекции/менеджера?
- Было ли такое, что часть лута стабильно не появляется в списке, хотя визуально он перед глазами?
Понимаю, что проблема отчасти «ручная» (я сам фильтрую по строкам), но сейчас уже не уверен, что вообще смотрю в правильную структуру — ощущение, что Facepunch на луте тихо что‑то подкрутили.
Последнее редактирование: