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

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

Прежде всего, там где у вас инклуды, подключаем след. библиотеку:
C++:
Expand Collapse Copy
#pragma comment(lib, "Winmm.lib")

Теперь нам нужно получить локального игрока, и делается это очень просто:
В моём случае:
C++:
Expand Collapse Copy
DWORD localPlayer = Player::GetPlayer();
В вашем:
C++:
Expand Collapse Copy
DWORD localPlayer = Mem.Read<DWORD>(clientModule + dwLocalPlayer);

Теперь нам нужно получить общее кол-во попаданий на сервере, делается это также просто:
C++:
Expand Collapse Copy
int hitsCount = Mem.Read<int>(localPlayer + m_totalHitsOnServer);

Ах да, ещё над циклом while(true) нам понадобиться переменная типа int, в которой мы будем хранить старое кол-во попаданий:
C++:
Expand Collapse Copy
int oldHitsCount = 0;

Теперь, чтобы наши супериор хитсаунды работали после смены карты, нам понадобиться маленькая проверочка:
C++:
Expand Collapse Copy
if (hitsCount == 0) oldHitsCount = 0;
Думаю, не стоит обьяснять, зачем она нужна? (напоминаю: hitsCount - общее кол-во попаданий на сервере)

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

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

Но, теперь встал вопрос: как менять громкость самих хитсаундов? Мы же не интернал читло кодим, громкость самой кс нас не волнует.
Всё очень просто:
C++:
Expand Collapse Copy
// 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++:
Expand Collapse Copy
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);
}

Вода полезна для здоровья. Всем хорошего настроения! :)
 
А нахуя эти лишние строки кода с олдхитсаундом если достаточно лишь проверки на локалплеера?
 
А нахуя эти лишние строки кода с олдхитсаундом если достаточно лишь проверки на локалплеера?
Типа если localPlayer == 0 тогда обнуляем oldHitsCount? Если да, то код всё равно в обьеме меньше не станет.
 
+rep Но счётчик останавливается на значении 255 попаданий. Я пытался писать 0, но увы у меня он замораживается. Если пишу if (hit == 254) записать 1, после следующего попадания все равно становится 255. Ты случайно не нашел как решить эту проблему?
 
+rep Но счётчик останавливается на значении 255 попаданий. Я пытался писать 0, но увы у меня он замораживается. Если пишу if (hit == 254) записать 1, после следующего попадания все равно становится 255. Ты случайно не нашел как решить эту проблему?
Увы. Думал писать 0, когда количество хитов == 255, но тогда хитсаунды звучали бы каждую миллисекунду. Как вариант, можно ещё прикрутить проверку на количество шотов > 0 && != старому кол-ву шотов (m_iShotsFired вроде), но хз, звучит как тупейший костыль. В любом случае, m_totalHitsOnServer обнуляется каждый раунд.
 
Увы. Думал писать 0, когда количество хитов == 255, но тогда хитсаунды звучали бы каждую миллисекунду. Как вариант, можно ещё прикрутить проверку на количество шотов > 0 && != старому кол-ву шотов (m_iShotsFired вроде), но хз, звучит как тупейший костыль. В любом случае, m_totalHitsOnServer обнуляется каждый раунд.
Слушай, очень даже идейка. Да, он обновляется каждый раунд, но есть тапочки играющие на дм серверах) Спасибо за идею)
 
Можно кае-то сделать, чтобы хит от гранаты тоже засчитывался?
 
const auto hit = memory.Read<std::uintptr_t>(localPlayer + 0x99a8);
вот и все, и будет считать хиты, точнее урон но считает весь и гранат и молик, обнулсяется сам, понимаю что тема старая но может кому понадобиться
 
const auto hit = memory.Read<std::uintptr_t>(localPlayer + 0x99a8);
вот и все, и будет считать хиты, точнее урон но считает весь и гранат и молик, обнулсяется сам, понимаю что тема старая но может кому понадобиться
Не видел ещё такого, спасибо большое. Вот название оффсета кому нужно - m_unTotalRoundDamageDealt
 
Назад
Сверху Снизу