0%
Обязательно ознакомьтесь с правилами форума!
Требуются люди в Команду форума для наполнения сайта ресурсами и полезным контентом. Писать в Telegram: @g_r_e_a_t_z_a_r_a_z_a
Чат для серверодержателей CS 1.6

Чат для серверодержателей Counter-Strike 1.6 а так же владельцев сайтов на движке GameCMS

Сообщество администраторов, разработчиков и владельцев серверов

GameCMS обсуждение Разработка плагинов Администрирование Опытные специалисты Безопасность и оптимизация
Чат помощи XenForo

Чат помощи по XenForo

Вопросы и обсуждения · Реклама · Услуги · Исполнители

XenForo помощь Услуги и исполнители Обсуждение движка Реклама проектов Разработка дополнений
Рекламное место

Рекламное место свободно

Разместите свою рекламу прямо здесь!

Активная аудитория Высокая конверсия Доступная цена Эффективная реклама
Music Round End

CS 1.6 Amxx Music Round End 1.2.7

Музыка в конце раунда для сервера CS 1.6
Код:
#pragma semicolon 1

#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <time>
#include <nvault>

//////////////////////// Настройки ////////////////////////
// Через сколько дней удалять настройку из nVault,
// если игрок не заходил
stock const VAULT_PRUNE_DAYS = 7;

// Файл для сохранения настроек
stock const VAULT_FILE[] = "music_data";

// Танец в конце раунда
//#define DANCE
///////////////////////////////////////////////////////////

#if defined DANCE
    new const g_szModels[] = "models/MusicRoundEnd/v_music_round_sound.mdl";
#endif

new const VERSION[] = "1.2.7";
new const CONFIG_NAME[] = "MusicRoundEnd.ini";

#define IsMp3Format(%1)    bool:(equali(%1[strlen(%1) - 4], ".mp3"))
#define IsWavFormat(%1)    bool:(equali(%1[strlen(%1) - 4], ".wav"))

enum {
    MUSIC_DISABLED = 1,
    MUSIC_ENABLED
};

enum (+=1) {
    SectionNone = -1,
    CTSWins,
    TerroristsWins,
    Draw
};

new Array:g_MusicForCT, Array:g_MusicForTerrorist, Array:g_MusicForDraw;
new g_MusicForCTNum, g_MusicForTerroristNum, g_MusicForDrawNum, g_Section,
    g_Sound[MAX_RESOURCE_PATH_LENGTH], g_iPlayMusic[MAX_PLAYERS +1];
new g_hVault = INVALID_HANDLE;

public plugin_init() {
    register_plugin("Music Round End", VERSION, "Jumper");
    register_dictionary("MusicRoundEnd.txt");
    RegisterHookChain(RG_RoundEnd, "RoundEnd_Post", .post = true);

    new const music_cmd[][] = { "say /music", "say_team /music" };
    for(new i; i < sizeof music_cmd; i++) {
        register_clcmd(music_cmd[i], "PlayMusicToggle");
    }
}

public plugin_end() {
    if(g_hVault != INVALID_HANDLE) {
        nvault_close(g_hVault);
    }
}

public plugin_cfg() {
    if((g_hVault = nvault_open(VAULT_FILE)) == INVALID_HANDLE) {
        set_fail_state("ERROR: Opening nVault %s failed!", VAULT_FILE);
    }
    nvault_prune(g_hVault, 0, get_systime() - (SECONDS_IN_DAY * VAULT_PRUNE_DAYS));
}

public client_authorized(id, const authid[]){
    if(!(g_iPlayMusic[id] = nvault_get(g_hVault, authid))){
        g_iPlayMusic[id] = MUSIC_ENABLED;
    }
}

public plugin_precache() {
    g_MusicForCT = ArrayCreate(MAX_RESOURCE_PATH_LENGTH);
    g_MusicForTerrorist = ArrayCreate(MAX_RESOURCE_PATH_LENGTH);
    g_MusicForDraw = ArrayCreate(MAX_RESOURCE_PATH_LENGTH);
#if defined DANCE
    precache_model(g_szModels);
#endif
    new filedir[MAX_RESOURCE_PATH_LENGTH];
    get_localinfo("amxx_configsdir", filedir, charsmax(filedir));
    format(filedir, charsmax(filedir), "%s/%s", filedir, CONFIG_NAME);

    if(!file_exists(filedir)) {
        set_fail_state("File '%s' not found!", filedir);
    }

    if(!parseConfigINI(filedir)) {
        set_fail_state("Fatal parse error!");
    }

    if(g_MusicForCT) {
        g_MusicForCTNum = ArraySize(g_MusicForCT);
    }

    if(g_MusicForTerrorist) {
        g_MusicForTerroristNum = ArraySize(g_MusicForTerrorist);
    }

    if(g_MusicForDraw) {
        g_MusicForDrawNum = ArraySize(g_MusicForDraw);
    }
}

public RoundEnd_Post(WinStatus:status, ScenarioEventEndRound:event){
    switch(status) {
        case WINSTATUS_CTS: {
            if(g_MusicForCTNum != 0) {
                ArrayGetString(g_MusicForCT, random(g_MusicForCTNum), g_Sound, charsmax(g_Sound));
                PlayMusic(g_Sound);
            }
        }
        case WINSTATUS_TERRORISTS: {
            if(g_MusicForTerroristNum != 0) {
                ArrayGetString(g_MusicForTerrorist, random(g_MusicForTerroristNum), g_Sound, charsmax(g_Sound));
                PlayMusic(g_Sound);
            }
        }
        case WINSTATUS_DRAW: {
            if(g_MusicForDrawNum != 0) {
                ArrayGetString(g_MusicForDraw, random(g_MusicForDrawNum), g_Sound, charsmax(g_Sound));
                PlayMusic(g_Sound);
            }
        }
    }
}

public PlayMusicToggle(id) {
    if(g_iPlayMusic[id] == MUSIC_ENABLED) {
        g_iPlayMusic[id] = MUSIC_DISABLED;
        client_cmd(id, "stopsound; mp3 stop");
    } else {
        g_iPlayMusic[id] = MUSIC_ENABLED;
    }
   
    new authid[MAX_AUTHID_LENGTH], buffer[MAX_NAME_LENGTH];
    get_user_authid(id, authid, charsmax(authid));
    formatex(buffer, charsmax(buffer), "%d", g_iPlayMusic[id]);
    nvault_set(g_hVault, authid, buffer);
   
    formatex(buffer, charsmax(buffer), "ROUND_END_MUSIC_STATUS_%d", g_iPlayMusic[id]);
    client_print_color(id, print_team_red, "%L %L", LANG_PLAYER, "ROUND_END_MUSIC_TOGGLE", LANG_PLAYER, buffer);
   
    return PLUGIN_HANDLED_MAIN;
}

bool:parseConfigINI(const configFile[]) {
    new INIParser:parser = INI_CreateParser();

    if(parser != Invalid_INIParser) {
        INI_SetReaders(parser, "ReadCFGKeyValue", "ReadCFGNewSection");
        INI_ParseFile(parser, configFile);
        INI_DestroyParser(parser);
        return true;
    }

    return false;
}

public bool:ReadCFGNewSection(INIParser:handle, const section[], bool:invalid_tokens, bool:close_bracket) {
    if(!close_bracket) {
        log_amx("Closing bracket was not detected! Current section name '%s'.", section);
        return false;
    }
   
    if(equal(section, "cts_wins")) {
        g_Section = CTSWins;
        return true;
    }
   
    if(equal(section, "terrorists_wins")) {
        g_Section = TerroristsWins;
        return true;
    }

    if(equal(section, "draw")) {
        g_Section = Draw;
        return true;
    }

    return false;
}

public bool:ReadCFGKeyValue(INIParser:handle, const key[], const value[]) {
    switch(g_Section) {
        case SectionNone: {
             return false;
        }
        case CTSWins: {
            if(key[0]) {
                 PrecacheSoundEx(g_MusicForCT, key);
            }
        }
        case TerroristsWins: {
            if(key[0]) {
                PrecacheSoundEx(g_MusicForTerrorist, key);
            }
        }
        case Draw: {
            if(key[0]) {
                 PrecacheSoundEx(g_MusicForDraw, key);
            }
        }
    }

    return true;
}

bool:PrecacheSoundEx(Array:arr, const keys[]) {
    if((keys[0] && !IsWavFormat(keys)) && (keys[0] && !IsMp3Format(keys))) {
        log_amx("Invalid sound file! Parse string '%s'. Only sound files in wav or mp3 format should be used!", keys);
        return false;
    }

    static Sound[MAX_RESOURCE_PATH_LENGTH];
    formatex(Sound, charsmax(Sound), "sound/%s", keys);

    if(!file_exists(Sound)) {
        log_amx("File missing '%s'.", Sound);
        return false;
    }

    if(IsMp3Format(keys)) {
        ArrayPushString(arr, Sound);
    } else {
        ArrayPushString(arr, keys);
    }

    if(IsMp3Format(keys)) {
        precache_generic(Sound);
    } else {
        precache_sound(keys);
    }

    return true;
}

PlayMusic(const sound[]) {
    new players[MAX_PLAYERS], count;
    get_players_ex(players, count, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);

    for(new i, id; i < count; i++) {
        id = players[i];
        if(g_iPlayMusic[id] == MUSIC_ENABLED) {
#if defined DANCE
            if(is_user_alive(id)) {
                set_entvar(id, var_viewmodel, g_szModels);
            }
#endif
            if(IsMp3Format(sound)) {
                client_cmd(id, "mp3 play %s", sound);
            } else {
                rg_send_audio(id, sound);
            }
        }
    }
}
Верх Низ