- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 737
- Реакции
- 19
Приветствую.
Если m_pClippingWeapon по какой-то причине не вкатывает или выдает мусор при получении айтема в CS2, есть более надежный путь через сервисы пешки. В сиквеле структура изменилась, и теперь самый вменяемый вариант — это разыменовывать хендл активного пуха через глобальный список энтити.
Суть метода:
Сам код получения адреса и ID:
Для корректной работы с хендлами в CS2 не забывайте правильно парсить индексы. Вот база для получения энтити из хендла, если пишете на внешке:
Метод универсальный, работает как во внешних софтах, так и в интерналах, если правильно прокинуть чтение памяти. Главное — следите за актуальностью оффсетов dwEntityList и m_pWeaponServices после обновлений подсабтика.
Интересно будет глянуть, как вы реализуете проверку на гранаты и нож через этот же индекс для скинов.
Если m_pClippingWeapon по какой-то причине не вкатывает или выдает мусор при получении айтема в CS2, есть более надежный путь через сервисы пешки. В сиквеле структура изменилась, и теперь самый вменяемый вариант — это разыменовывать хендл активного пуха через глобальный список энтити.
Суть метода:
- Цепляем m_pWeaponServices у локального игрока.
- Забираем хендл активного оружия через m_hActiveWeapon.
- Проходимся по EntityList, используя хендл, чтобы получить адрес объекта оружия.
- Вытягиваем ItemDefinitionIndex (тот самый ID).
Сам код получения адреса и ID:
Код:
auto m_pWeaponServices = read<uintptr_t>(playerPawn + Offset.BasePlayerPawn.m_pWeaponServices);
auto activeWeaponHandle = read<uint32_t>(m_pWeaponServices + Offset.BasePlayerPawn.m_hActiveWeapon);
auto entityList = read<uintptr_t>(base + Offset.Client.dwEntityList);
uintptr_t weapon = GetEntityByIndex(entityList, activeWeaponHandle);
auto weaponID = read<uint16_t>(weapon + Offset.EconItem.m_iItemDefinitionIndex + Offset.AttributeContainer.m_Item + Offset.EconEntity.m_AttributeManager);
Для корректной работы с хендлами в CS2 не забывайте правильно парсить индексы. Вот база для получения энтити из хендла, если пишете на внешке:
Код:
uintptr_t GetEntityFromHandle(uintptr_t entityListBase, uint32_t handle) {
if (entityListBase == 0 || handle == 0xFFFFFFFF) return 0;
uintptr_t listEntry = MemMan.ReadMem<uintptr_t>(entityListBase + 0x10 + 8 * ((handle & 0x7FFF) >> 9));
if (listEntry == 0) return 0;
uintptr_t entity = MemMan.ReadMem<uintptr_t>(listEntry + 0x70 * (handle & 0x1FF));
return entity;
}
Для тех, кто пилит визуалы или логгер, пригодится мапа с названиями. Тут собрано всё — от дефолтных глоков до кукри и бабочек:
Код:
inline std::map<int, std::string> weapon_name_map = {
{1, "deagle"}, {2, "elite"}, {7, "ak47"}, {9, "awp"}, {16, "m4a1"}, {31, "taser"}, {42, "knife"}, {49, "c4"}, {60, "m4a1_silencer"}, {507, "knife"}, // karambit
{515, "knife"}, // butterfly
{526, "knife"} // kukri
};
Метод универсальный, работает как во внешних софтах, так и в интерналах, если правильно прокинуть чтение памяти. Главное — следите за актуальностью оффсетов dwEntityList и m_pWeaponServices после обновлений подсабтика.
Интересно будет глянуть, как вы реализуете проверку на гранаты и нож через этот же индекс для скинов.