Универсальный плагин для работы со звуком

Сообщения
22
Реакции
2
Регулярно сталкиваюсь с модельками, где используются кастомные звуки.
К примеру, в модели шприца (хилшот) есть различные звуки. Но если в самом плагине эти звуки не предусмотрены, то на стороне клиента они проигрываться не будут.
Возможно есть плагин, через который можно загружать необходимый саунд клиенту? Допустим загружать оружия с кастомным звуком из CS GO, указать эти звуки в условном ини файле, и чтоб эти звуки подгрузились без доп плагинов.
 
Сообщения
3,526
Реакции
1,546
Помог
131 раз(а)
В рехлдс есть квар sv_auto_precache_sounds_in_models
 
Сообщения
22
Реакции
2
Nordic Warrior, спасибо. я правильно понял что его надо прописать в сервер кфг?
и волнует вопрос может есть нюансы с активацией этого квара? может ли он вызвать конфликты?
 
Сообщения
189
Реакции
19
Помог
5 раз(а)
Отсутствие загрузки звука не влияет на стабильность работы сервера, в отличии от того, если бы это был какой-нибудь mdl или spr...
 
Сообщения
3,526
Реакции
1,546
Помог
131 раз(а)
Сообщения
1,259
Реакции
2,244
Помог
57 раз(а)
RAMA21, Если речь про звуки, которые привязаны непосредственно к эвентам в модели, то помимо квара можно сток для прекеша звуков из модели использовать. Просто квар не всегда, не всем подходит. Иногда люди насуют модели, и ловят 'холостой" прекеш отсутствующих звуков, от которого не знают как избавиться.

в plugin_precache() вставляется
UTIL_PrecacheSoundsFromModel(путь_к_модели);

сам сток
Код:
// Автопрекеш звуков из модели: https://dev-cs.ru/resources/914/field?field=source
stock UTIL_PrecacheSoundsFromModel(const szModelPath[])
{
    new iFile;

    if((iFile = fopen(szModelPath, "rt")))
    {
        new szSoundPath[64];

        new iNumSeq, iSeqIndex;
        new iEvent, iNumEvents, iEventIndex;

        fseek(iFile, 164, SEEK_SET);
        fread(iFile, iNumSeq, BLOCK_INT);
        fread(iFile, iSeqIndex, BLOCK_INT);

        for(new k, i = 0; i < iNumSeq; i++)
        {
            fseek(iFile, iSeqIndex + 48 + 176 * i, SEEK_SET);
            fread(iFile, iNumEvents, BLOCK_INT);
            fread(iFile, iEventIndex, BLOCK_INT);
            fseek(iFile, iEventIndex + 176 * i, SEEK_SET);

            for(k = 0; k < iNumEvents; k++)
            {
                fseek(iFile, iEventIndex + 4 + 76 * k, SEEK_SET);
                fread(iFile, iEvent, BLOCK_INT);
                fseek(iFile, 4, SEEK_CUR);

                if(iEvent != 5004)
                    continue;

                fread_blocks(iFile, szSoundPath, 64, BLOCK_CHAR);

                if(strlen(szSoundPath))
                {
                    strtolower(szSoundPath);
                    engfunc(EngFunc_PrecacheSound, szSoundPath);
                }
            }
        }
    }

    fclose(iFile);
}
Суббота в 22:09
"привязаны непосредственно к эвентам в модели"

имею ввиду вот это
2024-09-14_22-09-12.jpg
 

Вложения

Сообщения
22
Реакции
2
BlackSignature, этот вариант интересный, но понять бы как использовать этот сток :crazy:
каждый раз под отдельную модель компилировать этот код в амхх?
 
Сообщения
68
Реакции
32
Помог
3 раз(а)
C++:
public stock const PluginName[]         = "Sound Precacher";
public stock const PluginVersion[]      = "2024.09.15";
public stock const PluginAuthor[]       = "Ragamafona";
public stock const PluginURL[]          = "https://t.me/nikolaygaus";
public stock const PluginDescription[]  = "Auto-precache sound from the list.";

//

#include <amxmodx>

#if !defined MAX_CONFIG_PATH_LEN
    const MAX_CONFIG_PATH_LEN = 128;
#endif

#if !defined MAX_RESOURCE_PATH_LEN
    const MAX_RESOURCE_PATH_LEN = 128;
#endif

#define DEBUG_MODE 1

//

public plugin_precache() {

    register_plugin(PluginName, PluginVersion, PluginAuthor);

    new szConfigFile[MAX_CONFIG_PATH_LEN];

    get_localinfo("amxx_configsdir", szConfigFile, charsmax(szConfigFile));
    strcat(szConfigFile, "/plugins/auto_precache_sound.ini", charsmax(szConfigFile));

    new hFileList = fopen(szConfigFile, "rt");

    if(hFileList)
    {
        new szLine[MAX_RESOURCE_PATH_LEN];
        new hFileModel;
        new szSoundPath[MAX_RESOURCE_PATH_LEN];
        new iNumSeq;
        new iSeqIndex;
        new iEvent;
        new iNumEvents;
        new iEventIndex;
        new i;
        new k;

        while(!feof(hFileList))
        {
            fgets(hFileList, szLine, charsmax(szLine));
            trim(szLine);

            if(!szLine[0] || szLine[0] == ';' || szLine[0] == '/')
            {
                continue;
            }

            hFileModel = fopen(szLine, "rt");

            if(hFileModel)
            {
                DEBUG_MODE && server_print("|  read model: '%s'", szLine);
                fseek(hFileModel, 164, SEEK_SET);
                fread(hFileModel, iNumSeq, BLOCK_INT);
                fread(hFileModel, iSeqIndex, BLOCK_INT);

                for(i = 0; i < iNumSeq; i++)
                {
                    fseek(hFileModel, iSeqIndex + 48 + 176 * i, SEEK_SET);
                    fread(hFileModel, iNumEvents, BLOCK_INT);
                    fread(hFileModel, iEventIndex, BLOCK_INT);
                    fseek(hFileModel, iEventIndex + 176 * i, SEEK_SET);

                    for(k = 0; k < iNumEvents; k++)
                    {
                        fseek(hFileModel, iEventIndex + 4 + 76 * k, SEEK_SET);
                        fread(hFileModel, iEvent, BLOCK_INT);
                        fseek(hFileModel, 4, SEEK_CUR);

                        if(iEvent != 5004)
                        {
                            continue;
                        }

                        fread_blocks(hFileModel, szSoundPath, charsmax(szSoundPath), BLOCK_CHAR);

                        if(strlen(szSoundPath))
                        {
                            precache_generic(fmt("sound/%s", szSoundPath));
                            DEBUG_MODE && server_print("|  > [%9s] precache sound: 'sound/%s'", file_exists(fmt("sound/%s", szSoundPath), true) ? "success" : "not found", szSoundPath);
                        }
                    }
                }

                fclose(hFileModel);
            }
        }

        fclose(hFileList);
    }
}
models/v_ak47.mdl
models/v_ump45.mdl

Ну и собственно sv_auto_precache_sounds_in_models "0"
 
Последнее редактирование:
Сообщения
91
Реакции
141
Помог
1 раз(а)
BlackSignature, strtolower лучше убрать, так как звуки могут быть с заглавными буквами, их преобразует все в нижний регистр и в итоге их прикешить не будет вовсе. Ну и звуки можно прикешить через precache_generic
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу