Гайд Music kit changer

Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
Привет югейм. Сегодня я будет простенький гайдец на то, как сделать MusicKit ченджер ( то есть привнести больше функционала в ваш суперский скинченджер ). Для начала, стоит запарсить все данные, связанные с музыкальными наборами, к счастью CCStrike15ItemSchema хранит не только в парсинг скинов, стикеров и всякого другого аморального говна, но и наши любезные музик киты. Я лично получаю это как CUtlMap ( как и все в принципе ).

C++:
CUtlMap<int, CMusicKit*, int>* GetMusicKitDefinitions()
{
    return GET_OFFSET(0x4F8, CUtlMap<int, CMusicKit*, int>);
}
Но мой юный читатель спросит, а что насчёт CMusicKit ? Структура с CS:GO не получила никаких изменений, так что вот она:
C++:
class CMusicKit
{
public:
    int32_t nID; //0x0000
    int32_t nRarity; //0x0004
    char* sName; //0x0008
    char* sNameLocToken; //0x0010 Используется для локализации
    char* sLocDescription; //0x0018
    char* sPedestalDisplayModel; //0x0020
    char* sInventoryImage; //0x0028
    char pad_0030[16]; //0x0030
}; //Size: 0x0040
И вот вы такой довольный, всё спарсили, но как внедрить свою нанонаработку в игру ? Разбираем 2 случая: мы в матче, мы в главном меню.

Относительно первого случая всё очень даже просто. Всё что нужно, это поменять CCSPlayerController_InventoryServices->m_unMusicID. Всё это найдете в классе CCSPlayerController.

А вот 2 случай поинтереснее. Поискав что-либо на просторах гугла и UC, есть одна бедная и старая тема с каким-то количеством мороки. Мне это не очень подходило, так что принялся за лёгкий ревёрс игры.

Порыскав достаточное количество времени и поискав всё что может быть хоть как-то связано с меню и звуком на заднем фоне, наткнулся на функцию, содержащую строки Background.Music.%s. Стало быть, что здесь и творится то что мне нужно. Поставив бряк на эту функцию и посмотрев, что за первый аргумент, понимаем следующее: функция берёт music id у игрока, проверяет, что id музыкального набора не является стандартным и не выходит за рамки. Берёт название набора (sName) и подставляется в форматируемою строку и отправляется в топку функции для воспроизведения. Посмотрев первый аргумент функции убеждаюсь что это функция класса CLegacyUI. Поискав что-то по адресу этого класса наткнулся на строку, которая относится к текущему воспроизводимому музыкальному набору ( а именно, его название ). Следовательно, смотрим что записывается в этот адрес и смотрим эту функции ! Начав играть другой набор музыки ( легаси кс ), который дан по умолчанию в инвентаре, выследил того, кто нужен. Так перейдём же к этой функции!

C++:
@ref: client.dll "48 89 5C 24 10 48 89 6C 24 18 56 48 83 EC 40 32"
char __fastcall set_music_background(__int64 a1, const char* a2, const char* a3, float a4);
Параметры:
a1 - просто указатель на CLegacyGameUI ( interface: CLegacyGameUI001 )
a2 - название набора музыки
a3 - без понятия, тоже строка, но непонятно зачем нужна
a4 - без понятия.

Для того, чтобы сменить музыку, играющую в главном меню достаточно вызвать эту функцию: set_music_background(legacy_game_ui, "beartooth01", nullptr, 0);

Но давайте не будем насиловать игру и будем ставить музончик, только, когда это нужно:

C++:
// Любой хук, я об этом не задумывался и делал в FSN

// current_music_kit находится по офсету 0x290.
const auto current_music_kit = g_game_legacy_ui->current_music_kit;
if(std::strcmp(current_music_kit, "what_i_need") != 0)
{
     set_music_background(legacy_game_ui, "what_i_need", nullptr, 0);
}
Для того, чтобы ресетнуть и вернуть прежний/дефолтный музыкальный набор, просто передайте nullptr, вместо названия.

Теперь ты можешь написать сам свой music kit changer. Такой подробный гайд расписан, чтобы те, кто тоже захочет повторить это с лёгкостью нашли новые сигнатуры и офсеты самостоятельно. Надеюсь, что до скорых встреч :)
 
Сверху Снизу