Беда с массивом \ sounds_events

Сообщения
154
Реакции
46
Помог
1 раз(а)
Приветствую, нужна помощь с массивом, суть такая, плагин воспроизводит звук из происходящего события, я хочу немного расширить массив, и сделать так, чтобы была возможность указывать несколько звуков для события, и воспроизводился один из звуков рандомным способом.
Делить массивы под разные события я не хочу, хочется уместить всё в один, если это возможно.
Подскажите пожалуйста, как, или через что это возможно сделать, вроде всё очевидно, но я к сожалению не нашел то, что хочу сделать.

Код:
#include < amxmodx >
#include < reapi >

#pragma semicolon 1

const MAX_LENGTH__MESSAGE = 16;

enum _: EVENT_TYPE_ENUM
{
    ET__KNIFE_KILL,
    ET__GRENADE_KILL,
    ET__BOMB_PLANTED,
    ET__BOMB_DEFUSED
}

new const SOUND_EVENT[ EVENT_TYPE_ENUM ][ ] =
{
    "gmforce/sounds_events/knife_kill_1.wav",
    "gmforce/sounds_events/grenade_kill_1.wav",
    "gmforce/sounds_events/bomb_planted_1.wav",
    "gmforce/sounds_events/bomb_defused_1.wav"
};

public plugin_precache( )
{
    for( new i; i < EVENT_TYPE_ENUM; i++ )
    {
        precache_sound( SOUND_EVENT[ i ] );
    }
}

public plugin_init( )
{
    register_plugin( "Sounds Events", "1.0.0", "Javekson" );
    
    register_message( get_user_msgid( "SendAudio" ), "message_SendAudio" );
    
    RegisterHookChain( RG_CBasePlayer_Killed, "hook_PlayerKilled_Post", .post = true );
}

public message_SendAudio( )
{
    enum { ARG_MESSAGE = 2 }
    
    new sMessage[ MAX_LENGTH__MESSAGE ];
    get_msg_arg_string( ARG_MESSAGE, sMessage, charsmax( sMessage ) );
    
    if( equal( sMessage[ 7 ], "BOMBPL" ) )
    {
        set_msg_arg_string( ARG_MESSAGE, SOUND_EVENT[ ET__BOMB_PLANTED ] );
    }
    else if( equal( sMessage[ 7 ], "BOMBDEF" ) )
    {
        set_msg_arg_string( ARG_MESSAGE, SOUND_EVENT[ ET__BOMB_DEFUSED ] );
    }
}

public hook_PlayerKilled_Post( const iVictim, const iKiller )
{
    if( iVictim == iKiller || !is_user_connected( iKiller ) )
    {
        return HC_CONTINUE;
    }
    
    new iInflictor = get_entvar( iVictim, var_dmg_inflictor );
    
    if( iInflictor != iKiller )
    {
        if( get_member( iVictim, m_bKilledByGrenade ) )
        {
            rg_send_audio( 0, SOUND_EVENT[ ET__GRENADE_KILL ] );
        }
        
        return HC_CONTINUE;
    }
    
    new iActiveItem = get_member( iKiller, m_pActiveItem );
    
    if( !is_nullent( iActiveItem ) && get_member( iActiveItem, m_iId ) == WEAPON_KNIFE )
    {
        rg_send_audio( 0, SOUND_EVENT[ ET__KNIFE_KILL ] );
    }
    
    return HC_CONTINUE;
}
 

iPlague

♿️
Сообщения
230
Реакции
129
Помог
2 раз(а)
Код:
new const SOUND_EVENT[4][2][ ] =
{
    {"sound1.wav", "sound2.wav"},
    {"sound3.wav", "sound4.wav"},
    {"sound5.wav", "sound6.wav"},
    {"sound7.wav", "sound8.wav"}
};
 
Сообщения
154
Реакции
46
Помог
1 раз(а)
iPlague, большое спасибо, всё оказалось проще чем я думал.
этот вариант подходит для равного количества саудов под каждое событие,

а это вариант SergeyShorokhov,
только в этом случае можно указывать разное количество саундов под разные события,
спасибо вам, взял на вооружение.
Код:
#include amxmodx

enum EVENT_TYPE_ENUM
{
    ET__KNIFE_KILL,
    ET__GRENADE_KILL,
    ET__BOMB_PLANTED,
    ET__BOMB_DEFUSED
}

enum Sounds_s {
    EVENT_TYPE_ENUM: type,
    name[256]
}

new const SOUND_EVENT[ ][ Sounds_s ] =
{
    { ET__KNIFE_KILL, "gmforce/sounds_events/knife_kill_1.wav" },
    { ET__KNIFE_KILL, "gmforce/sounds_events/knife_kill_2.wav" },
    //
    { ET__GRENADE_KILL, "gmforce/sounds_events/grenade_kill_1.wav" },
    { ET__GRENADE_KILL, "gmforce/sounds_events/grenade_kill_2.wav" },
    //
    { ET__BOMB_PLANTED, "gmforce/sounds_events/bomb_planted_1.wav" },
    { ET__BOMB_PLANTED, "gmforce/sounds_events/bomb_planted_2.wav" },
    { ET__BOMB_PLANTED, "gmforce/sounds_events/bomb_planted_3.wav" },
    //
    { ET__BOMB_DEFUSED, "gmforce/sounds_events/bomb_defused_1.wav" }
};

GetRandom(EVENT_TYPE_ENUM: findType) {
    new soundsIdx[sizeof SOUND_EVENT], found
    for(new i; i < sizeof SOUND_EVENT; i++) {
        if(findType != SOUND_EVENT[i][type])
            continue
        
        soundsIdx[found++] = i
    }
    
    return soundsIdx[random(found)]
}

public plugin_init() {
    new soundIdx = GetRandom(ET__BOMB_PLANTED)
    server_print("Found=`%s`", SOUND_EVENT[soundIdx][name])
}
 
Последнее редактирование:

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

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