• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь dr_duels Дуэль Ошибки в логах

Evgen

Участник
Сообщения
33
Реакции
4
Баллы
8
Нужна помощь по плагину dr_duel есть исходник и ошибки в логах при debug
Проблема на сервере, когда игроки выбирают дуэль с Очередью.
Когда идет дуэль с очередью, должно быть 1 стрельнул, потом другой, а тут 1 может стрелять много раз а другой иногда.
Изначальный исходник:
C++:
#include < amxmodx >
#include < amxmisc >
#include < colorchat >
#include < hamsandwich >
#include < fakemeta >
#include < fun >
#include < dr_mode >

/*
* 1. Дуэль + Бетсы
* 2. Спавны
*/

#define fm_set_user_ammo(%1,%2) set_pdata_int(get_pdata_cbase(%1, 373), 51, %2, 4)

#define BETS_DELAY 20
#define TASK_BETS 31413

#define TIME_ATTACK 10
#define TASK_ATTACK 24141

#define DELAY_INFORMER 0.5
#define TASK_INFORMER 13413

#define DUEL_TIME 120
#define TASK_DUEL 12513

#define SOUND_PATH "sound/dr_mode/duels"

//DUEL
enum _: wData { wName[32], wIName[32], wIndex, wAmmo, oAmmo }
new sWeapons[][wData] = {
    {"weapon_deagle", "Дигл", CSW_DEAGLE, 255, 1},
    {"weapon_m4a1", "M4A1", CSW_M4A1, 255, 1},
    {"weapon_hegrenade", "Гранаты", CSW_HEGRENADE, 255, 255},
    {"weapon_awp", "AWP", CSW_AWP, 255, 1},
    {"weapon_ak47", "AK47", CSW_AK47, 255, 1},
    {"weapon_usp", "USP", CSW_USP, 255, 1},
    {"weapon_scout", "Муха", CSW_SCOUT, 255, 1},
    {"weapon_m249", "Пулемет", CSW_M249, 255, 1}
}
new tId, cId, wId, dOch, tName[32], cName[32], duel = false, bets = false, dVstr[33], gTime, dTime, g_SyncHud, dSound[33];
new duelSound[][] = { "fight1.mp3", "fight2.mp3", "fight3.mp3" };
new AttackSound[][] = {"attack.mp3"};
//BETS
new aBet[33], mBet[33], cBet[2], tBet[2], bSound[33];
new betSound[][] = { "bet1.mp3", "bet2.mp3", "bet3.mp3" };
//SPAWNS
new Float: dOrigins[2][3], szFile[128];

new fwdStart;
new exploSpr;

public plugin_init(){
    register_plugin("DR Duels", "1.0", "PAffAEJIkA :3");
   
    register_clcmd("say /dr", "LastOpen");
    register_clcmd("say /lr", "LastOpen");
    register_clcmd("say_team /dr", "LastOpen");
    register_clcmd("say_team /lr", "LastOpen");
   
    register_clcmd("say /bets_sound", "clcmd_bSound");
    register_clcmd("say /duel_sound", "clcmd_dSound");
   
    register_clcmd("say /duel_settings", "openMenu");
   
    RegisterHookChain(RG_RoundEnd, "round_end");
    RegisterHookChain(RG_CBasePlayer_Killed, "PlayerKilled");
   
    RegisterHam(Ham_Touch, "weaponbox", "BlockUSE", 0);
    //RegisterHam(Ham_Use, "func_conveyor", "BlockUSE", 0);
    RegisterHam(Ham_Touch, "trigger_teleport", "BlockUSE", 0);
    register_clcmd("drop", "clcmd_Drop");
   
    g_SyncHud = CreateHudSyncObj();
   
    for(new i = 0; i < sizeof(sWeapons); i ++)
        RegisterHam(Ham_Weapon_PrimaryAttack, sWeapons[i][wName], "fw_attack", false);
   
    fwdStart = CreateMultiForward("DR_DuelStart", ET_CONTINUE, FP_CELL, FP_CELL);
}

public plugin_precache(){
    new buffer[128];
    for(new i = 0; i < sizeof(betSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, betSound[i]);
        precache_generic(buffer);
    }
   
    for(new i = 0; i < sizeof(duelSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, duelSound[i]);
        precache_generic(buffer);
    }  
   
    for(new i = 0; i < sizeof(AttackSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, AttackSound[i]);
        precache_generic(buffer);
    }
   
    exploSpr = precache_model("sprites/shockwave.spr");
}

public client_putinserver(id){
    dSound[id] = true;
    bSound[id] = true;
}

public clcmd_bSound(id){
    bSound[id] = bSound[id] ? false : true;
    client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время ставок!", bSound[id] ? "включили" : "выключили");
}

public clcmd_dSound(id){
    dSound[id] = dSound[id] ? false : true;
    client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время дуэли!", dSound[id] ? "включили" : "выключили");
}

public BlockUSE(ent, id){
    if(!is_user_alive(id))  
        return HAM_IGNORED;  
   
    if(duel)
        return HAM_SUPERCEDE;
   
    return HAM_IGNORED;
}

//Спавны
public plugin_cfg(){
    new gMapName[35];
    get_mapname(gMapName, charsmax(gMapName));  
    format(szFile, charsmax(szFile), "/addons/amxmodx/configs/dr_mode/dr_duels/%s.ini", gMapName);
   
    if(!file_exists(szFile))
        return;
   
    new buffer[256], file = fopen(szFile, "r");
    while(!feof(file)){
        fgets(file, buffer, charsmax(buffer));
        if(buffer[0] && buffer[0] != ';'){
            new orig[3][32], tName[5];
            parse(buffer, tName, charsmax(tName), orig[0], charsmax(orig[]), orig[1], charsmax(orig[]), orig[2], charsmax(orig[]));
           
            if(equali(tName, "TT:")){
                dOrigins[0][0] = str_to_float(orig[0]);
                dOrigins[0][1] = str_to_float(orig[1]);
                dOrigins[0][2] = str_to_float(orig[2]);          
                }else{
                dOrigins[1][0] = str_to_float(orig[0]);
                dOrigins[1][1] = str_to_float(orig[1]);
                dOrigins[1][2] = str_to_float(orig[2]);      
            }
        }
    }
    fclose(file);
}

public openMenu(id){  
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Меню раставления спавнов");
    new menu = menu_create(caption, "settings_handle");
   
    new item[5][64];
    format(item[0], charsmax(item[]), "\%sУстановтиь спавн TT", dOrigins[0][0] ? "d" : "w");
    format(item[1], charsmax(item[]), "\%sУстановтиь спавн CT", dOrigins[1][0] ? "d" : "w");
    format(item[2], charsmax(item[]), "\wПротестировать спавны");
    format(item[3], charsmax(item[]), "\wУдалить все спавны");
    format(item[4], charsmax(item[]), "\wСохранить изменения");
   
    for(new i = 0, temp[10]; i < sizeof(item); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, item[i], temp);
    }
   
    menu_setprop(menu, MPROP_EXITNAME, "\rВыход");  
    return menu_display(id, menu);
}

public settings_handle(id, menu, item){  
    if(item == MENU_EXIT)
        return 0;

    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    new Float: fOrigins[3];
    get_entvar(id, var_origin, fOrigins);
   
    switch(key){
        case 1:{
            if(!dOrigins[0][0])
                dOrigins[0] = fOrigins;
        }
        case 2:{
            if(!dOrigins[1][0])
                dOrigins[1] = fOrigins;
        }
        case 3:{
            set_entvar(id, var_origin, dOrigins[0]);
            set_task(1.0, "setOrigin2", id);
        }
        case 4:{
            dOrigins[0][0] = 0.0;
            dOrigins[1][0] = 0.0;
        }
        case 5:{
            new buffer[255];
           
            format(buffer, charsmax(buffer), "TT: %f %f %f", dOrigins[0][0], dOrigins[0][1], dOrigins[0][2]);
            write_file(szFile, buffer, 0);

            format(buffer, charsmax(buffer), "CT: %f %f %f", dOrigins[1][0], dOrigins[1][1], dOrigins[1][2]);
            write_file(szFile, buffer, 1);
        }
    }
    return openMenu(id);
}

public setOrigin2(id)
    set_entvar(id, var_origin, dOrigins[1]);
//Спавны

public client_disconnect(id){
    if(duel && (id == cId || id == tId))
        StopDuel();
}
   
public round_end()
    StopDuel();

public PlayerKilled(){
    if(!duel && checkDuel()){
        new players[32], count;
        get_players(players, count, "ache", "CT");
       
        if(is_user_alive(players[0]))
            ShowLastCTMenu(players[0]);
    }
}

public clcmd_Drop(id){
    if(!is_user_alive(id))  
        return PLUGIN_CONTINUE;  
   
    if(duel)
        return PLUGIN_HANDLED;
   
    return PLUGIN_CONTINUE;  
}

public LastOpen(id){
    if(checkDuel())
        ShowLastCTMenu(id);
}

//Last
public ShowLastCTMenu(id){  
    new TeamName:gTeam = get_member(id, m_iTeam);
    if(gTeam != TEAM_CT)
        return 0;
   
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Будем играть дуэль?");
    new menu = menu_create(caption, "HANDLE_LastCT");
   
    menu_additem(menu, "Да", "1");
    menu_additem(menu, "Нет", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_LastCT(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1:    return ShowMenuPeople(id);
        case 2: return PLUGIN_HANDLED;
    }
    return ShowLastCTMenu(id);
}

//People
public ShowMenuPeople(id){
    new players[32], count;
    get_players(players, count, "ache", "TERRORIST");
   
    if(count == 1){
        tId = dr_get_leader();
        return ShowOCHMenu(id);
    }
   
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите противника");
    new menu = menu_create(caption, "HANDLE_PEOPLE");
   
    for(new i = 0, temp[10], szName[32]; i < count; i ++){
        num_to_str(i + 1, temp, charsmax(temp));
       
        get_user_name(players[i], szName, charsmax(szName));
        menu_additem(menu, szName, temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_PEOPLE(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    new players[32], count;
    get_players(players, count, "ache", "TERRORIST");
    tId = players[key - 1];
   
    return ShowOCHMenu(id);
}

//OCH
public ShowOCHMenu(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите режим игры");
    new menu = menu_create(caption, "HANDLE_OCH");
   
    menu_additem(menu, "Без очереди", "1");
    menu_additem(menu, "\rС очередью", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_OCH(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1: dOch = false;
        case 2:    dOch = true;
    }
   
    return ShowMenuWeapon(id);
}

//Weapon
public ShowMenuWeapon(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите оружие дуэли");
    new menu = menu_create(caption, "HANDLE_WPN");
   
    for(new i = 0, temp[10]; i < sizeof(sWeapons); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, sWeapons[i][wIName], temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_WPN(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;

    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    wId = key - 1;
   
    return ShowMenuAccept(id);
}

//Accept
public ShowMenuAccept(id){  
    new caption[164];
    get_user_name(tId, tName, charsmax(tName));
    get_user_name(id, cName, charsmax(cName));
    format(caption, charsmax(caption), "\d[DUELS]\w Противник:\r %s^n\wОружие:\r %s^n\wРежим:\r %s^n\wНачинаем?", tName, sWeapons[wId][wIName], dOch ? "по очереди" : "без очереди");
    new menu = menu_create(caption, "HANDLE_ACCEPT");
   
    menu_additem(menu, "Да", "1");
    menu_additem(menu, "\rНет", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_ACCEPT(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1:    return StartBets(id);
        case 2: return ShowLastCTMenu(id);
    }
    return ShowMenuAccept(id);
}

//Bets
public StartBets(id){
    dr_stop_game(STOP_GAME);
    bets = true;
    off_func(false);
    set_task(DELAY_INFORMER, "ShowInformer", TASK_INFORMER, .flags = "b");
    cId = id;
   
    strip_user_weapons(tId);
    strip_user_weapons(cId);
   
    new players[32], count, iTrack = random_num(0, charsmax(betSound));
    get_players(players, count, "ch");
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(!bSound[player])
            continue;
       
        client_cmd(player, "mp3 play %s/%s", SOUND_PATH, betSound[iTrack]);
    }

    set_entvar(id, var_origin, dOrigins[0]);
    set_entvar(tId, var_origin, dOrigins[1]);

    set_freeze(true);
   
    if(count == 2)
        return StartDuel();
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(player == cId || player == tId)
            continue;
       
        ShowMenuBet(player);
    }
   
    gTime = BETS_DELAY;
    set_task(1.0, "timer_gTime", TASK_BETS, .flags = "a", .repeat = BETS_DELAY);
   
    return PLUGIN_CONTINUE;
}

public ShowMenuBet(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w На кого хотите поставить?");
    new menu = menu_create(caption, "HANDLE_BETS");
   
    new item[3][128];
    format(item[0], charsmax(item[]), "\w%s \d[\rTT\d]", tName);
    format(item[1], charsmax(item[]), "\w%s \d[\rCT\d]", cName);
    format(item[2], charsmax(item[]), "\rОтказываюсь делать ставку");
   
    menu_additem(menu, item[0], "1");
    menu_additem(menu, item[1], "2");
    menu_additem(menu, item[2], "3");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}
   
public HANDLE_BETS(id, menu, item){
    if(item == MENU_EXIT || !bets)
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    aBet[id] = 0;
    switch(key){
        case 1:    aBet[id] = tId;
        case 2: aBet[id] = cId;
        case 3: return PLUGIN_HANDLED;
    }
    return ShowMenuBetMoney(id);
}

public ShowMenuBetMoney(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Сколько хотите поставить?");
    new menu = menu_create(caption, "HANDLE_BETSMONEY");
   
    new item[6][128], szMoney = get_member(id, m_iAccount);
    format(item[0], charsmax(item[]), "\%s100$", szMoney >= 100 ? "w" : "d");
    format(item[1], charsmax(item[]), "\%s500$", szMoney >= 500 ? "w" : "d");
    format(item[2], charsmax(item[]), "\%s1000$", szMoney >= 1000 ? "w" : "d");
    format(item[3], charsmax(item[]), "\%s5000$", szMoney >= 5000 ? "w" : "d");
    format(item[4], charsmax(item[]), "\%s10000$", szMoney >= 10000 ? "w" : "d");
    format(item[5], charsmax(item[]), "Все\r %d$", szMoney);
   
    for(new i = 0, temp[10]; i < sizeof(item); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, item[i], temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_BETSMONEY(id, menu, item){
    if(item == MENU_EXIT || !bets)
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data), szMoney = get_member(id, m_iAccount);
   
    mBet[id] = -1;
    switch(key){
        case 1:{
            if(szMoney >= 100)
                mBet[id] = 100;
        }
        case 2:{
            if(szMoney >= 500)
                mBet[id] = 500;
        }
        case 3:{
            if(szMoney >= 1000)
                mBet[id] = 1000;
        }
        case 4:{
            if(szMoney >= 5000)
                mBet[id] = 5000;
        }
        case 5:{
            if(szMoney >= 10000)
                mBet[id] = 10000;
        }
        case 6: mBet[id] = szMoney;
    }
    if(mBet[id] == -1)
        return ShowMenuBetMoney(id);
    else{
        if(mBet[id] == 0)
            return PLUGIN_CONTINUE;
       
        dr_set_user_money(id, szMoney - mBet[id]);
        if(aBet[id] == tId){
            ++ tBet[0];
            tBet[1] += mBet[id];
        }else{
            ++ cBet[0];
            cBet[1] += mBet[id];
        }
       
        new szName[32];
        get_user_name(id, szName, charsmax(szName));
        client_print_color(0, 0, "^3[^4BETS^3] Игрок^4 %s^3 поставил^4 %d$^3 на^1 %s^3!", szName, mBet[id], aBet[id] == tId ? tName : cName);
    }
    return PLUGIN_CONTINUE;
}

public StartDuel(){
    if(!is_user_alive(tId) || !is_user_alive(cId))
        return StopDuel();
   
    bets = false;
    duel = true;
   
    new players[32], count, iTrack = random_num(0, charsmax(duelSound));
    get_players(players, count, "ch");
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(!dSound[player])
            continue;
       
        client_cmd(player, "mp3 play %s/%s", SOUND_PATH, duelSound[iTrack]);
    }
   
    ExecuteForward(fwdStart, iTrack, tId, cId);
   
    rg_set_user_model(tId, "leet");
    rg_set_user_model(cId, "gign");
   
    set_freeze(false);
    off_effects(tId);
    off_effects(cId);
   
    gTime = DUEL_TIME;
   
    set_entvar(tId, var_health, 100.0);
    set_entvar(cId, var_health, 100.0);
   
    rg_give_item(tId, sWeapons[wId][wName]);
    rg_give_item(cId, sWeapons[wId][wName]);
   
    if(dOch){
        dVstr[cId] = true;
        dVstr[tId] = false;
        dTime = TIME_ATTACK;
       
        switch(sWeapons[wId][wIndex]){
            case CSW_HEGRENADE:{
                rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
                rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
            }
            default:{
                fm_set_user_ammo(cId, 1);
                fm_set_user_ammo(tId, 1);
            }
        }
       
        set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
    }else{
        rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
        rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
    }
   
    set_task(1.0, "timer_gTime", TASK_DUEL, .flags = "a", .repeat = DUEL_TIME);
    return PLUGIN_CONTINUE;
}

public fw_attack(weap){
    if(!dOch || !duel)  
        return HAM_IGNORED;
   
    new id = get_entvar(weap, var_owner);
    if(!is_user_alive(id))
        return HAM_IGNORED;

    if(!dVstr[id])
        return HAM_SUPERCEDE
    else
        ChangeAttack(id);
       
    return HAM_IGNORED  
}

public ChangeAttack(id){  
    dVstr[id] = false;
   
    new vId = id == cId ? tId : cId;
   
    if(is_user_connected(vId)){
        dVstr[vId] = true;
       
        fm_set_user_ammo(vId, 1);  
        client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[random_num(0, sizeof AttackSound)]);
    }
   
    dTime = TIME_ATTACK;
   
    remove_task(TASK_ATTACK);
    set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}

public timer_dTime(){
    if(-- dTime == 0)
        ChangeAttack(dVstr[cId] ? cId : tId);
}

public timer_gTime(tid){
    if(-- gTime == 0){
        switch(tid){
            case TASK_BETS:{
                StartDuel();
                remove_task(TASK_BETS);
            }
            case TASK_DUEL:{          
                if(is_user_alive(tId) && is_user_alive(cId)){
                    new w;
                   
                    if(get_user_health(tId) > get_user_health(cId))
                        w = 2;
                    else if(get_user_health(tId) < get_user_health(cId))
                        w = 1;
                    else
                        w = random_num(1, 2);
                   
                    user_kill(w == 1 ? tId : cId);
                }
           
                StopDuel();
                remove_task(TASK_DUEL);
            }
        }
    }else if (tid == TASK_BETS){
        new Float: fOrigin[3];
       
        pev(tId, pev_origin, fOrigin);
        set_krujok(fOrigin, TEAM_TERRORIST);      
       
        pev(cId, pev_origin, fOrigin);
        set_krujok(fOrigin, TEAM_CT);
    }
}

native dr_set_duels(id, bool:st);
public StopDuel(){
    bets = false;
    off_func(true);
   
    remove_task(TASK_INFORMER);
    remove_task(TASK_DUEL);
    remove_task(TASK_BETS);
    remove_task(TASK_ATTACK);
   
    client_cmd(0, "mp3 stop");
   
    if(duel){
        new win = 0, szWin, szMoney;
        if(!is_user_alive(tId)){
            win = cId;
            client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", cName);
           
            if(is_user_connected(cId)){
                if(cBet[0])
                    szWin = cBet[1]/cBet[0] + 5000
                else
                    szWin = 5000;
                szMoney = get_member(cId, m_iAccount);
               
                dr_set_user_money(cId, szMoney + szWin);
                client_print_color(cId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
            }
        }else if(!is_user_alive(cId)){
            win = tId
            client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", tName);  
           
            if(is_user_connected(tId)){
                if(tBet[0])
                    szWin = tBet[1]/tBet[0] + 5000
                else
                    szWin = 5000;
                szMoney = get_member(tId, m_iAccount);
               
                dr_set_user_money(tId, szMoney + szWin);
                client_print_color(tId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
            }
        }
       
        dr_set_duels(win == tId ? tId : cId, true);
        dr_set_duels(win == tId ? cId : tId, false);
       
       
        new players[32], count; get_players(players, count);
        for(new i = 0, player; i < count; i ++){
            player = players[i];
            if(aBet[player] == win){
                if(mBet[player] == 0)
                    continue;
               
                szWin = mBet[player] * 2;
               
                szMoney = get_member(player, m_iAccount);
                dr_set_user_money(player, szMoney + szWin);
               
                client_print_color(player, 0, "^3[^4BETS^3] Вы выиграли^4 %d$^3!!", szWin);
            }
        }
    }
    cBet = {0, 0};
    tBet = {0, 0};
    arrayset(aBet, 0, sizeof(aBet))
    arrayset(mBet, 0, sizeof(mBet))
    duel = false;
    return PLUGIN_CONTINUE;
}

public ShowInformer(){  
    new szBuffer[512], iLen;
    iLen = format(szBuffer, charsmax(szBuffer), "[~] Режим: Дуэль [%s]", dOch ? "с очередью" : "без очереди");  
    iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Оружие: %s", sWeapons[wId][wIName]);
   
    iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] %s[%d%%] VS %s[%d%%]", tName, get_user_health(tId), cName, get_user_health(cId));
   
    if(dOch && duel){
        if(dVstr[cId])
            iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", cName, dTime);
        else
            iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", tName, dTime);
    }
   
    if(bets)
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Делаем ставки! [%d]", gTime);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] До конца дуэли [%d] сек", gTime);
   
    if(!cBet[0])
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", cName);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", cName, cBet[0], cBet[1]);  
   
    if(!tBet[0])
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", tName);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", tName, tBet[0], tBet[1]);
   
    set_hudmessage(255, 159, 61, 0.01, 0.19, 0, 0.1, 1.0, _, _, -1);  
   
    new players[32], count;
    get_players(players, count);
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        ShowSyncHudMsg(player, g_SyncHud, szBuffer);
    }
}

bool: checkDuel(){
    if(get_member_game(m_iNumTerrorist) == 0)
        return false;

    if(!dr_active())
        return false;
       
    if(duel || bets)
        return false;
   
    if(dr_get_gameid() == -1)
        return false;
   
    new players[32], count;
    get_players(players, count, "ache", "CT");
   
    if(count > 1)
        return false;
   
    return true;
}

off_func(func){
    dr_set_active_shop(0, func);
    dr_set_informer(func);
    dr_set_bhop(func);
}

off_effects(id){
    set_entvar(id, var_maxspeed, 250.0);
    set_entvar(id, var_gravity, 1.0);
   
    set_entvar(id, var_rendermode, kRenderNormal);
    set_entvar(id, var_renderamt, 100);
    set_entvar(id, var_rendercolor, {0.0, 0.0, 0.0});
    set_entvar(id, var_renderfx, kRenderFxGlowShell);
}

set_freeze(func){
    new flags;
   
    flags = get_entvar(cId, var_flags);
    if(func)
        set_entvar(cId, var_flags, flags | FL_FROZEN);
    else
        set_entvar(cId, var_flags, flags & ~FL_FROZEN);

    flags = get_entvar(tId, var_flags);
    if(func)
        set_entvar(tId, var_flags, flags | FL_FROZEN);
    else
        set_entvar(tId, var_flags, flags & ~FL_FROZEN);
}

set_krujok(Float:gOrigin[3], TeamName: gTeam){
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, gOrigin, 0)
    write_byte(TE_BEAMCYLINDER);
    engfunc(EngFunc_WriteCoord, gOrigin[0])
    engfunc(EngFunc_WriteCoord, gOrigin[1])
    engfunc(EngFunc_WriteCoord, gOrigin[2])
    engfunc(EngFunc_WriteCoord, gOrigin[0])
    engfunc(EngFunc_WriteCoord, gOrigin[1])
    engfunc(EngFunc_WriteCoord, gOrigin[2] + 555.5)  
    write_short(exploSpr);
    write_byte(0);
    write_byte(0);
    write_byte(5);
    write_byte(60);
    write_byte(0);
    write_byte(gTeam == TEAM_TERRORIST ? 255 : 0);
    write_byte(0);
    write_byte(gTeam == TEAM_TERRORIST ? 0 : 255);
    write_byte(255);
    write_byte(0);
    message_end();
}
ошибки
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::timer_dTime (line 668)

Потом попробовал вот так:
C++:
#include < amxmodx >
#include < amxmisc >
#include < colorchat >
#include < hamsandwich >
#include < fakemeta >
#include < fun >
#include < dr_mode >

/*
* 1. Дуэль + Бетсы
* 2. Спавны
*/

#define fm_set_user_ammo(%1,%2) set_pdata_int(get_pdata_cbase(%1, 373), 51, %2, 4)

#define BETS_DELAY 20
#define TASK_BETS 31413

#define TIME_ATTACK 10
#define TASK_ATTACK 24141

#define DELAY_INFORMER 0.5
#define TASK_INFORMER 13413

#define DUEL_TIME 120
#define TASK_DUEL 12513

#define SOUND_PATH "sound/dr_mode/duels"

//DUEL
enum _: wData { wName[32], wIName[32], wIndex, wAmmo, oAmmo }
new sWeapons[][wData] = {
    {"weapon_deagle", "Дигл", CSW_DEAGLE, 255, 1},
    {"weapon_m4a1", "M4A1", CSW_M4A1, 255, 1},
    {"weapon_hegrenade", "Гранаты", CSW_HEGRENADE, 255, 255},
    {"weapon_awp", "AWP", CSW_AWP, 255, 1},
    {"weapon_ak47", "AK47", CSW_AK47, 255, 1},
    {"weapon_usp", "USP", CSW_USP, 255, 1},
    {"weapon_scout", "Муха", CSW_SCOUT, 255, 1},
    {"weapon_m249", "Пулемет", CSW_M249, 255, 1}
}
new tId, cId, wId, dOch, tName[32], cName[32], duel = false, bets = false, dVstr[33], gTime, dTime, g_SyncHud, dSound[33];
new duelSound[][] = { "fight1.mp3", "fight2.mp3", "fight3.mp3" };
new AttackSound[][] = {"attack.mp3"};
//BETS
new aBet[33], mBet[33], cBet[2], tBet[2], bSound[33];
new betSound[][] = { "bet1.mp3", "bet2.mp3", "bet3.mp3" };
//SPAWNS
new Float: dOrigins[2][3], szFile[128];

new fwdStart;
new exploSpr;

public plugin_init(){
    register_plugin("DR Duels", "1.0", "PAffAEJIkA :3");
   
    register_clcmd("say /dr", "LastOpen");
    register_clcmd("say /lr", "LastOpen");
    register_clcmd("say_team /dr", "LastOpen");
    register_clcmd("say_team /lr", "LastOpen");
   
    register_clcmd("say /bets_sound", "clcmd_bSound");
    register_clcmd("say /duel_sound", "clcmd_dSound");
   
    register_clcmd("say /duel_settings", "openMenu");
   
    RegisterHookChain(RG_RoundEnd, "round_end");
    RegisterHookChain(RG_CBasePlayer_Killed, "PlayerKilled");
   
    RegisterHam(Ham_Touch, "weaponbox", "BlockUSE", 0);
    //RegisterHam(Ham_Use, "func_conveyor", "BlockUSE", 0);
    RegisterHam(Ham_Touch, "trigger_teleport", "BlockUSE", 0);
    register_clcmd("drop", "clcmd_Drop");
   
    g_SyncHud = CreateHudSyncObj();
   
    for(new i = 0; i < sizeof(sWeapons); i ++)
        RegisterHam(Ham_Weapon_PrimaryAttack, sWeapons[i][wName], "fw_attack", false);
   
    fwdStart = CreateMultiForward("DR_DuelStart", ET_CONTINUE, FP_CELL, FP_CELL);
}

public plugin_precache(){
    new buffer[128];
    for(new i = 0; i < sizeof(betSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, betSound[i]);
        precache_generic(buffer);
    }
   
    for(new i = 0; i < sizeof(duelSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, duelSound[i]);
        precache_generic(buffer);
    }  
   
    for(new i = 0; i < sizeof(AttackSound); i ++){
        format(buffer, charsmax(buffer), "%s/%s", SOUND_PATH, AttackSound[i]);
        precache_generic(buffer);
    }
   
    exploSpr = precache_model("sprites/shockwave.spr");
}

public client_putinserver(id){
    dSound[id] = true;
    bSound[id] = true;
}

public clcmd_bSound(id){
    bSound[id] = bSound[id] ? false : true;
    client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время ставок!", bSound[id] ? "включили" : "выключили");
}

public clcmd_dSound(id){
    dSound[id] = dSound[id] ? false : true;
    client_print_color(id, 0, "^3[^4SOUND^3] Вы^4 %s^3 музыку во время дуэли!", dSound[id] ? "включили" : "выключили");
}

public BlockUSE(ent, id){
    if(!is_user_alive(id))  
        return HAM_IGNORED;  
   
    if(duel)
        return HAM_SUPERCEDE;
   
    return HAM_IGNORED;
}

//Спавны
public plugin_cfg(){
    new gMapName[35];
    get_mapname(gMapName, charsmax(gMapName));  
    format(szFile, charsmax(szFile), "/addons/amxmodx/configs/dr_mode/dr_duels/%s.ini", gMapName);
   
    if(!file_exists(szFile))
        return;
   
    new buffer[256], file = fopen(szFile, "r");
    while(!feof(file)){
        fgets(file, buffer, charsmax(buffer));
        if(buffer[0] && buffer[0] != ';'){
            new orig[3][32], tName[5];
            parse(buffer, tName, charsmax(tName), orig[0], charsmax(orig[]), orig[1], charsmax(orig[]), orig[2], charsmax(orig[]));
           
            if(equali(tName, "TT:")){
                dOrigins[0][0] = str_to_float(orig[0]);
                dOrigins[0][1] = str_to_float(orig[1]);
                dOrigins[0][2] = str_to_float(orig[2]);          
                }else{
                dOrigins[1][0] = str_to_float(orig[0]);
                dOrigins[1][1] = str_to_float(orig[1]);
                dOrigins[1][2] = str_to_float(orig[2]);      
            }
        }
    }
    fclose(file);
}

public openMenu(id){  
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Меню раставления спавнов");
    new menu = menu_create(caption, "settings_handle");
   
    new item[5][64];
    format(item[0], charsmax(item[]), "\%sУстановтиь спавн TT", dOrigins[0][0] ? "d" : "w");
    format(item[1], charsmax(item[]), "\%sУстановтиь спавн CT", dOrigins[1][0] ? "d" : "w");
    format(item[2], charsmax(item[]), "\wПротестировать спавны");
    format(item[3], charsmax(item[]), "\wУдалить все спавны");
    format(item[4], charsmax(item[]), "\wСохранить изменения");
   
    for(new i = 0, temp[10]; i < sizeof(item); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, item[i], temp);
    }
   
    menu_setprop(menu, MPROP_EXITNAME, "\rВыход");  
    return menu_display(id, menu);
}

public settings_handle(id, menu, item){  
    if(item == MENU_EXIT)
        return 0;

    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    new Float: fOrigins[3];
    get_entvar(id, var_origin, fOrigins);
   
    switch(key){
        case 1:{
            if(!dOrigins[0][0])
                dOrigins[0] = fOrigins;
        }
        case 2:{
            if(!dOrigins[1][0])
                dOrigins[1] = fOrigins;
        }
        case 3:{
            set_entvar(id, var_origin, dOrigins[0]);
            set_task(1.0, "setOrigin2", id);
        }
        case 4:{
            dOrigins[0][0] = 0.0;
            dOrigins[1][0] = 0.0;
        }
        case 5:{
            new buffer[255];
           
            format(buffer, charsmax(buffer), "TT: %f %f %f", dOrigins[0][0], dOrigins[0][1], dOrigins[0][2]);
            write_file(szFile, buffer, 0);

            format(buffer, charsmax(buffer), "CT: %f %f %f", dOrigins[1][0], dOrigins[1][1], dOrigins[1][2]);
            write_file(szFile, buffer, 1);
        }
    }
    return openMenu(id);
}

public setOrigin2(id)
    set_entvar(id, var_origin, dOrigins[1]);
//Спавны

public client_disconnect(id){
    if(duel && (id == cId || id == tId))
        StopDuel();
}
   
public round_end()
    StopDuel();

public PlayerKilled(){
    if(!duel && checkDuel()){
        new players[32], count;
        get_players(players, count, "ache", "CT");
       
        if(is_user_alive(players[0]))
            ShowLastCTMenu(players[0]);
    }
}

public clcmd_Drop(id){
    if(!is_user_alive(id))  
        return PLUGIN_CONTINUE;  
   
    if(duel)
        return PLUGIN_HANDLED;
   
    return PLUGIN_CONTINUE;  
}

public LastOpen(id){
    if(checkDuel())
        ShowLastCTMenu(id);
}

//Last
public ShowLastCTMenu(id){  
    new TeamName:gTeam = get_member(id, m_iTeam);
    if(gTeam != TEAM_CT)
        return 0;
   
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Будем играть дуэль?");
    new menu = menu_create(caption, "HANDLE_LastCT");
   
    menu_additem(menu, "Да", "1");
    menu_additem(menu, "Нет", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_LastCT(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1:    return ShowMenuPeople(id);
        case 2: return PLUGIN_HANDLED;
    }
    return ShowLastCTMenu(id);
}

//People
public ShowMenuPeople(id){
    new players[32], count;
    get_players(players, count, "ache", "TERRORIST");
   
    if(count == 1){
        tId = dr_get_leader();
        return ShowOCHMenu(id);
    }
   
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите противника");
    new menu = menu_create(caption, "HANDLE_PEOPLE");
   
    for(new i = 0, temp[10], szName[32]; i < count; i ++){
        num_to_str(i + 1, temp, charsmax(temp));
       
        get_user_name(players[i], szName, charsmax(szName));
        menu_additem(menu, szName, temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_PEOPLE(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    new players[32], count;
    get_players(players, count, "ache", "TERRORIST");
    tId = players[key - 1];
   
    return ShowOCHMenu(id);
}

//OCH
public ShowOCHMenu(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите режим игры");
    new menu = menu_create(caption, "HANDLE_OCH");
   
    menu_additem(menu, "Без очереди", "1");
    menu_additem(menu, "\rС очередью", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_OCH(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1: dOch = false;
        case 2:    dOch = true;
    }
   
    return ShowMenuWeapon(id);
}

//Weapon
public ShowMenuWeapon(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Выберите оружие дуэли");
    new menu = menu_create(caption, "HANDLE_WPN");
   
    for(new i = 0, temp[10]; i < sizeof(sWeapons); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, sWeapons[i][wIName], temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_WPN(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;

    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    wId = key - 1;
   
    return ShowMenuAccept(id);
}

//Accept
public ShowMenuAccept(id){  
    new caption[164];
    get_user_name(tId, tName, charsmax(tName));
    get_user_name(id, cName, charsmax(cName));
    format(caption, charsmax(caption), "\d[DUELS]\w Противник:\r %s^n\wОружие:\r %s^n\wРежим:\r %s^n\wНачинаем?", tName, sWeapons[wId][wIName], dOch ? "по очереди" : "без очереди");
    new menu = menu_create(caption, "HANDLE_ACCEPT");
   
    menu_additem(menu, "Да", "1");
    menu_additem(menu, "\rНет", "2");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_ACCEPT(id, menu, item){
    if(item == MENU_EXIT || !checkDuel() || !is_user_alive(id))
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    switch(key){
        case 1:    return StartBets(id);
        case 2: return ShowLastCTMenu(id);
    }
    return ShowMenuAccept(id);
}

//Bets
public StartBets(id){
    dr_stop_game(STOP_GAME);
    bets = true;
    off_func(false);
    set_task(DELAY_INFORMER, "ShowInformer", TASK_INFORMER, .flags = "b");
    cId = id;
   
    strip_user_weapons(tId);
    strip_user_weapons(cId);
   
    new players[32], count, iTrack = random_num(0, charsmax(betSound));
    get_players(players, count, "ch");
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(!bSound[player])
            continue;
       
        client_cmd(player, "mp3 play %s/%s", SOUND_PATH, betSound[iTrack]);
    }

    set_entvar(id, var_origin, dOrigins[0]);
    set_entvar(tId, var_origin, dOrigins[1]);

    set_freeze(true);
   
    if(count == 2)
        return StartDuel();
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(player == cId || player == tId)
            continue;
       
        ShowMenuBet(player);
    }
   
    gTime = BETS_DELAY;
    set_task(1.0, "timer_gTime", TASK_BETS, .flags = "a", .repeat = BETS_DELAY);
   
    return PLUGIN_CONTINUE;
}

public ShowMenuBet(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w На кого хотите поставить?");
    new menu = menu_create(caption, "HANDLE_BETS");
   
    new item[3][128];
    format(item[0], charsmax(item[]), "\w%s \d[\rTT\d]", tName);
    format(item[1], charsmax(item[]), "\w%s \d[\rCT\d]", cName);
    format(item[2], charsmax(item[]), "\rОтказываюсь делать ставку");
   
    menu_additem(menu, item[0], "1");
    menu_additem(menu, item[1], "2");
    menu_additem(menu, item[2], "3");
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}
   
public HANDLE_BETS(id, menu, item){
    if(item == MENU_EXIT || !bets)
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data);
   
    aBet[id] = 0;
    switch(key){
        case 1:    aBet[id] = tId;
        case 2: aBet[id] = cId;
        case 3: return PLUGIN_HANDLED;
    }
    return ShowMenuBetMoney(id);
}

public ShowMenuBetMoney(id){
    new caption[128];
    format(caption, charsmax(caption), "\d[DUELS]\w Сколько хотите поставить?");
    new menu = menu_create(caption, "HANDLE_BETSMONEY");
   
    new item[6][128], szMoney = get_member(id, m_iAccount);
    format(item[0], charsmax(item[]), "\%s100$", szMoney >= 100 ? "w" : "d");
    format(item[1], charsmax(item[]), "\%s500$", szMoney >= 500 ? "w" : "d");
    format(item[2], charsmax(item[]), "\%s1000$", szMoney >= 1000 ? "w" : "d");
    format(item[3], charsmax(item[]), "\%s5000$", szMoney >= 5000 ? "w" : "d");
    format(item[4], charsmax(item[]), "\%s10000$", szMoney >= 10000 ? "w" : "d");
    format(item[5], charsmax(item[]), "Все\r %d$", szMoney);
   
    for(new i = 0, temp[10]; i < sizeof(item); i ++){
        num_to_str(i + 1, temp, charsmax(temp));
        menu_additem(menu, item[i], temp);
    }
   
    menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
    return menu_display(id, menu);
}

public HANDLE_BETSMONEY(id, menu, item){
    if(item == MENU_EXIT || !bets)
        return 0;
   
    new data[30], iName[64], access, callback;  
    menu_item_getinfo(menu, item, access, data, charsmax(data), iName, charsmax(iName), callback);
    new key = str_to_num(data), szMoney = get_member(id, m_iAccount);
   
    mBet[id] = -1;
    switch(key){
        case 1:{
            if(szMoney >= 100)
                mBet[id] = 100;
        }
        case 2:{
            if(szMoney >= 500)
                mBet[id] = 500;
        }
        case 3:{
            if(szMoney >= 1000)
                mBet[id] = 1000;
        }
        case 4:{
            if(szMoney >= 5000)
                mBet[id] = 5000;
        }
        case 5:{
            if(szMoney >= 10000)
                mBet[id] = 10000;
        }
        case 6: mBet[id] = szMoney;
    }
    if(mBet[id] == -1)
        return ShowMenuBetMoney(id);
    else{
        if(mBet[id] == 0)
            return PLUGIN_CONTINUE;
       
        dr_set_user_money(id, szMoney - mBet[id]);
        if(aBet[id] == tId){
            ++ tBet[0];
            tBet[1] += mBet[id];
        }else{
            ++ cBet[0];
            cBet[1] += mBet[id];
        }
       
        new szName[32];
        get_user_name(id, szName, charsmax(szName));
        client_print_color(0, 0, "^3[^4BETS^3] Игрок^4 %s^3 поставил^4 %d$^3 на^1 %s^3!", szName, mBet[id], aBet[id] == tId ? tName : cName);
    }
    return PLUGIN_CONTINUE;
}

public StartDuel(){
    if(!is_user_alive(tId) || !is_user_alive(cId))
        return StopDuel();
   
    bets = false;
    duel = true;
   
    new players[32], count, iTrack = random_num(0, charsmax(duelSound));
    get_players(players, count, "ch");
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        if(!dSound[player])
            continue;
       
        client_cmd(player, "mp3 play %s/%s", SOUND_PATH, duelSound[iTrack]);
    }
   
    ExecuteForward(fwdStart, iTrack, tId, cId);
   
    rg_set_user_model(tId, "leet");
    rg_set_user_model(cId, "gign");
   
    set_freeze(false);
    off_effects(tId);
    off_effects(cId);
   
    gTime = DUEL_TIME;
   
    set_entvar(tId, var_health, 100.0);
    set_entvar(cId, var_health, 100.0);
   
    rg_give_item(tId, sWeapons[wId][wName]);
    rg_give_item(cId, sWeapons[wId][wName]);
   
    if(dOch){
        dVstr[cId] = true;
        dVstr[tId] = false;
        dTime = TIME_ATTACK;
       
        switch(sWeapons[wId][wIndex]){
            case CSW_HEGRENADE:{
                rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
                rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][oAmmo]);
            }
            default:{
                fm_set_user_ammo(cId, 1);
                fm_set_user_ammo(tId, 1);
            }
        }
       
        set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
    }else{
        rg_set_user_bpammo(tId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
        rg_set_user_bpammo(cId, WeaponIdType:sWeapons[wId][wIndex], sWeapons[wId][wAmmo]);
    }
   
    set_task(1.0, "timer_gTime", TASK_DUEL, .flags = "a", .repeat = DUEL_TIME);
    return PLUGIN_CONTINUE;
}

public fw_attack(weap){
    if(!dOch || !duel)  
        return HAM_IGNORED;
   
    new id = get_entvar(weap, var_owner);
    if(!is_user_alive(id))
        return HAM_IGNORED;

    if(!dVstr[id])
        return HAM_SUPERCEDE
    else
        ChangeAttack(id);
       
    return HAM_IGNORED  
}

public ChangeAttack(id){  
    dVstr[id] = false;
   
    new vId = id == cId ? tId : cId;
   
    if(is_user_connected(vId)){
        dVstr[vId] = true;
       
        fm_set_user_ammo(vId, 1);  
        client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[random_num(0, sizeof(AttackSound)-1)]);
    }
   
    dTime = TIME_ATTACK;
   
    remove_task(TASK_ATTACK);
    set_task(1.0, "timer_dTime", TASK_ATTACK, .flags = "a", .repeat = TIME_ATTACK);
}

public timer_dTime(){
    if(-- dTime == 0)
        ChangeAttack(dVstr[cId] ? cId : tId);
}

public timer_gTime(tid){
    if(-- gTime == 0){
        switch(tid){
            case TASK_BETS:{
                StartDuel();
                remove_task(TASK_BETS);
            }
            case TASK_DUEL:{          
                if(is_user_alive(tId) && is_user_alive(cId)){
                    new w;
                   
                    if(get_user_health(tId) > get_user_health(cId))
                        w = 2;
                    else if(get_user_health(tId) < get_user_health(cId))
                        w = 1;
                    else
                        w = random_num(1, 2);
                   
                    user_kill(w == 1 ? tId : cId);
                }
           
                StopDuel();
                remove_task(TASK_DUEL);
            }
        }
    }else if (tid == TASK_BETS){
        new Float: fOrigin[3];
       
        pev(tId, pev_origin, fOrigin);
        set_krujok(fOrigin, TEAM_TERRORIST);      
       
        pev(cId, pev_origin, fOrigin);
        set_krujok(fOrigin, TEAM_CT);
    }
}

native dr_set_duels(id, bool:st);
public StopDuel(){
    bets = false;
    off_func(true);
   
    remove_task(TASK_INFORMER);
    remove_task(TASK_DUEL);
    remove_task(TASK_BETS);
    remove_task(TASK_ATTACK);
   
    client_cmd(0, "mp3 stop");
   
    if(duel){
        new win = 0, szWin, szMoney;
        if(!is_user_alive(tId)){
            win = cId;
            client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", cName);
           
            if(is_user_connected(cId)){
                if(cBet[0])
                    szWin = cBet[1]/cBet[0] + 5000
                else
                    szWin = 5000;
                szMoney = get_member(cId, m_iAccount);
               
                dr_set_user_money(cId, szMoney + szWin);
                client_print_color(cId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
            }
        }else if(!is_user_alive(cId)){
            win = tId
            client_print_color(0, 0, "^3[^4DUELS^3] Победил^4 %s^3!!", tName);  
           
            if(is_user_connected(tId)){
                if(tBet[0])
                    szWin = tBet[1]/tBet[0] + 5000
                else
                    szWin = 5000;
                szMoney = get_member(tId, m_iAccount);
               
                dr_set_user_money(tId, szMoney + szWin);
                client_print_color(tId, 0, "^3[^4DUELS^3] Вы выиграли^4 %d$", szWin);
            }
        }
       
        dr_set_duels(win == tId ? tId : cId, true);
        dr_set_duels(win == tId ? cId : tId, false);
       
       
        new players[32], count; get_players(players, count);
        for(new i = 0, player; i < count; i ++){
            player = players[i];
            if(aBet[player] == win){
                if(mBet[player] == 0)
                    continue;
               
                szWin = mBet[player] * 2;
               
                szMoney = get_member(player, m_iAccount);
                dr_set_user_money(player, szMoney + szWin);
               
                client_print_color(player, 0, "^3[^4BETS^3] Вы выиграли^4 %d$^3!!", szWin);
            }
        }
    }
    cBet = {0, 0};
    tBet = {0, 0};
    arrayset(aBet, 0, sizeof(aBet))
    arrayset(mBet, 0, sizeof(mBet))
    duel = false;
    return PLUGIN_CONTINUE;
}

public ShowInformer(){  
    new szBuffer[512], iLen;
    iLen = format(szBuffer, charsmax(szBuffer), "[~] Режим: Дуэль [%s]", dOch ? "с очередью" : "без очереди");  
    iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Оружие: %s", sWeapons[wId][wIName]);
   
    iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] %s[%d%%] VS %s[%d%%]", tName, get_user_health(tId), cName, get_user_health(cId));
   
    if(dOch && duel){
        if(dVstr[cId])
            iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", cName, dTime);
        else
            iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Стреляет %s [%d]", tName, dTime);
    }
   
    if(bets)
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] Делаем ставки! [%d]", gTime);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] До конца дуэли [%d] сек", gTime);
   
    if(!cBet[0])
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", cName);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", cName, cBet[0], cBet[1]);  
   
    if(!tBet[0])
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s никто не поставил", tName);
    else
        iLen += format(szBuffer[iLen], charsmax(szBuffer) - iLen, "^n[~] На %s поставило %d[%d$]", tName, tBet[0], tBet[1]);
   
    set_hudmessage(255, 159, 61, 0.01, 0.19, 0, 0.1, 1.0, _, _, -1);  
   
    new players[32], count;
    get_players(players, count);
   
    for(new i = 0, player; i < count; i ++){
        player = players[i];
        ShowSyncHudMsg(player, g_SyncHud, szBuffer);
    }
}

bool: checkDuel(){
    if(get_member_game(m_iNumTerrorist) == 0)
        return false;

    if(!dr_active())
        return false;
       
    if(duel || bets)
        return false;
   
    if(dr_get_gameid() == -1)
        return false;
   
    new players[32], count;
    get_players(players, count, "ache", "CT");
   
    if(count > 1)
        return false;
   
    return true;
}

off_func(func){
    dr_set_active_shop(0, func);
    dr_set_informer(func);
    dr_set_bhop(func);
}

off_effects(id){
    set_entvar(id, var_maxspeed, 250.0);
    set_entvar(id, var_gravity, 1.0);
   
    set_entvar(id, var_rendermode, kRenderNormal);
    set_entvar(id, var_renderamt, 100);
    set_entvar(id, var_rendercolor, {0.0, 0.0, 0.0});
    set_entvar(id, var_renderfx, kRenderFxGlowShell);
}

set_freeze(func){
    new flags;
   
    flags = get_entvar(cId, var_flags);
    if(func)
        set_entvar(cId, var_flags, flags | FL_FROZEN);
    else
        set_entvar(cId, var_flags, flags & ~FL_FROZEN);

    flags = get_entvar(tId, var_flags);
    if(func)
        set_entvar(tId, var_flags, flags | FL_FROZEN);
    else
        set_entvar(tId, var_flags, flags & ~FL_FROZEN);
}

set_krujok(Float:gOrigin[3], TeamName: gTeam){
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, gOrigin, 0)
    write_byte(TE_BEAMCYLINDER);
    engfunc(EngFunc_WriteCoord, gOrigin[0])
    engfunc(EngFunc_WriteCoord, gOrigin[1])
    engfunc(EngFunc_WriteCoord, gOrigin[2])
    engfunc(EngFunc_WriteCoord, gOrigin[0])
    engfunc(EngFunc_WriteCoord, gOrigin[1])
    engfunc(EngFunc_WriteCoord, gOrigin[2] + 555.5)  
    write_short(exploSpr);
    write_byte(0);
    write_byte(0);
    write_byte(5);
    write_byte(60);
    write_byte(0);
    write_byte(gTeam == TEAM_TERRORIST ? 255 : 0);
    write_byte(0);
    write_byte(gTeam == TEAM_TERRORIST ? 0 : 255);
    write_byte(255);
    write_byte(0);
    message_end();
}
Теперь ошибка:
[AMXX] [0] dr_duels.sma::ChangeAttack (line 657)
[AMXX] [1] dr_duels.sma::fw_attack (line 643)
 
Где здесь написано Ошибка? Нужна помощь?- предоставляйте полную информацию.
Самое главное и не показал)
C++:
L 10/21/2020 - 15:46:56: [AMXX] Displaying debug trace (plugin "dr_duels.amxx", version "1.0")
L 10/21/2020 - 15:46:56: [AMXX] Run time error 4: index out of bounds
L 10/21/2020 - 15:46:56: [AMXX]    [0] dr_duels.sma::ChangeAttack (line 657)
L 10/21/2020 - 15:46:56: [AMXX]    [1] dr_duels.sma::fw_attack (line 643)
 
Evgen, В массиве всего один звук. Из чего там рандом брать?)
C++:
client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[0]);
 
Evgen, В массиве всего один звук. Из чего там рандом брать?)
C++:
client_cmd(vId, "mp3 play %s/%s", SOUND_PATH, AttackSound[0]);
Ещё убрал этот звук, т.к. при стрельбе всё портило и стало всё ок)
C++:
new AttackSound[][] = {"attack.mp3"};
Спасибо за помощь!
 
Назад
Сверху