Гайд Делаем хитсаунды в External чите :)

keep silence
Участник
Статус
Оффлайн
Регистрация
17 Дек 2018
Сообщения
546
Реакции[?]
201
Поинты[?]
0
Всем привет! Дело было вечером, делать было нечего. Более бесполезной функции придумать сложно, но всё же.
Прежде всего, рекомендую ознакомиться с гайдом для новичков от xLamantine (*тык*)
Ознакомились? Тогда без лишних прелюдий приступаем.
Так как у меня всё выполняется в отдельном потоке, хитсаунды я тоже запихну в отдельную функцию. Вы можете это сделать просто в while(true) в мейне :roflanEbalo:

Прежде всего, там где у вас инклуды, подключаем след. библиотеку:
C++:
#pragma comment(lib, "Winmm.lib")
Теперь нам нужно получить локального игрока, и делается это очень просто:
В моём случае:
C++:
DWORD localPlayer = Player::GetPlayer();
В вашем:
C++:
DWORD localPlayer = Mem.Read<DWORD>(clientModule + dwLocalPlayer);
Теперь нам нужно получить общее кол-во попаданий на сервере, делается это также просто:
C++:
int hitsCount = Mem.Read<int>(localPlayer + m_totalHitsOnServer);
Ах да, ещё над циклом while(true) нам понадобиться переменная типа int, в которой мы будем хранить старое кол-во попаданий:
C++:
int oldHitsCount = 0;
Теперь, чтобы наши супериор хитсаунды работали после смены карты, нам понадобиться маленькая проверочка:
C++:
if (hitsCount == 0) oldHitsCount = 0;
Думаю, не стоит обьяснять, зачем она нужна? (напоминаю: hitsCount - общее кол-во попаданий на сервере)

А теперь, самое главное - сами хитсаунды :) Вот, для чего нам понадобилась переменная oldHitsCount.
C++:
if (hitsCount != oldHitsCount)
{
    PlaySound("hitsound.wav", NULL, SND_ASYNC);
    oldHitsCount = hitsCount;
}
Тут всё очень-очень просто, если кол-во попаданий на сервере не совпадает со старым их кол-вом, то мы будем воспроизводить файл "hitsound.wav" (который, в данной ситуации, должен храниться в папке с билдом).

Стоит уточнить момент с SND_ASYNC. Если поставить SND_SYNC, то перед воспроизведением PlaySound будет ждать, пока доиграет прошлый хитсаунд, что, согласитесь, не круто.

Но, теперь встал вопрос: как менять громкость самих хитсаундов? Мы же не интернал читло кодим, громкость самой кс нас не волнует.
Всё очень просто:
C++:
// 1 (min)
waveOutSetVolume(0, 858993459);
// 2
waveOutSetVolume(0, 1717986918);
// 3
waveOutSetVolume(0, -1717986919);
// 4
waveOutSetVolume(0, -858993460);
// 5 (max)
waveOutSetVolume(0, -1);
Цифрами от 1 до 5 я условно подписал громкость. 5 - 100%, 1 - хз, но уж точно не 0 :)

C++:
int oldHitsCount - 0;

while (true)
{
    DWORD localPlayer = Mem.Read<DWORD>(clientModule + dwLocalPlayer);
    int hitsCount = Mem.Read<int>(localPlayer + m_totalHitsOnServer);
    
    if (hitsCount == 0) oldHitsCount = 0;
    else if (hitsCount != oldHitsCount)
    {
        waveOutSetVolume(0, -1); // или какую вы там громкость хотите
        PlaySound("hitsound.wav", NULL, SND_ASYNC);
        oldHitsCount = hitsCount;
    }
    
    Sleep(1);
}

Вода полезна для здоровья. Всем хорошего настроения! :)
 
Продавец
Статус
Оффлайн
Регистрация
28 Окт 2019
Сообщения
1,147
Реакции[?]
302
Поинты[?]
3K
А нахуя эти лишние строки кода с олдхитсаундом если достаточно лишь проверки на локалплеера?
 
keep silence
Участник
Статус
Оффлайн
Регистрация
17 Дек 2018
Сообщения
546
Реакции[?]
201
Поинты[?]
0
А нахуя эти лишние строки кода с олдхитсаундом если достаточно лишь проверки на локалплеера?
Типа если localPlayer == 0 тогда обнуляем oldHitsCount? Если да, то код всё равно в обьеме меньше не станет.
 
Пользователь
Статус
Оффлайн
Регистрация
30 Апр 2019
Сообщения
141
Реакции[?]
33
Поинты[?]
4K
+rep Но счётчик останавливается на значении 255 попаданий. Я пытался писать 0, но увы у меня он замораживается. Если пишу if (hit == 254) записать 1, после следующего попадания все равно становится 255. Ты случайно не нашел как решить эту проблему?
 
keep silence
Участник
Статус
Оффлайн
Регистрация
17 Дек 2018
Сообщения
546
Реакции[?]
201
Поинты[?]
0
+rep Но счётчик останавливается на значении 255 попаданий. Я пытался писать 0, но увы у меня он замораживается. Если пишу if (hit == 254) записать 1, после следующего попадания все равно становится 255. Ты случайно не нашел как решить эту проблему?
Увы. Думал писать 0, когда количество хитов == 255, но тогда хитсаунды звучали бы каждую миллисекунду. Как вариант, можно ещё прикрутить проверку на количество шотов > 0 && != старому кол-ву шотов (m_iShotsFired вроде), но хз, звучит как тупейший костыль. В любом случае, m_totalHitsOnServer обнуляется каждый раунд.
 
Пользователь
Статус
Оффлайн
Регистрация
30 Апр 2019
Сообщения
141
Реакции[?]
33
Поинты[?]
4K
Увы. Думал писать 0, когда количество хитов == 255, но тогда хитсаунды звучали бы каждую миллисекунду. Как вариант, можно ещё прикрутить проверку на количество шотов > 0 && != старому кол-ву шотов (m_iShotsFired вроде), но хз, звучит как тупейший костыль. В любом случае, m_totalHitsOnServer обнуляется каждый раунд.
Слушай, очень даже идейка. Да, он обновляется каждый раунд, но есть тапочки играющие на дм серверах) Спасибо за идею)
 
Rias Gremory
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2019
Сообщения
96
Реакции[?]
27
Поинты[?]
0
Можно кае-то сделать, чтобы хит от гранаты тоже засчитывался?
 
Начинающий
Статус
Оффлайн
Регистрация
15 Июл 2022
Сообщения
3
Реакции[?]
1
Поинты[?]
0
const auto hit = memory.Read<std::uintptr_t>(localPlayer + 0x99a8);
вот и все, и будет считать хиты, точнее урон но считает весь и гранат и молик, обнулсяется сам, понимаю что тема старая но может кому понадобиться
 
Пользователь
Статус
Оффлайн
Регистрация
30 Апр 2019
Сообщения
141
Реакции[?]
33
Поинты[?]
4K
const auto hit = memory.Read<std::uintptr_t>(localPlayer + 0x99a8);
вот и все, и будет считать хиты, точнее урон но считает весь и гранат и молик, обнулсяется сам, понимаю что тема старая но может кому понадобиться
Не видел ещё такого, спасибо большое. Вот название оффсета кому нужно - m_unTotalRoundDamageDealt
 
Сверху Снизу