Не удаляется таск

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
Решил сделать плагин, который будет удерживать определенную карту, если на сервере нет игроков.

Код:
#include <amxmodx>

#define PLUGIN "Название"
#define VERSION "0.1"
#define AUTHOR "Nordic Warrior"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    new map[32]
    get_mapname(map,31)
    if(equal(map,"35hp_2",6)) set_task(5.0, "check_players_1", 1,.flags="b")
}

public check_players_1(id)
{
    new players[32], Count
    get_players(players, Count, "ch")
    server_print("players: %d", players)
    new timec = get_cvar_num("mp_timelimit")
    server_print("(task1) time: %d", timec)
    if(players[31] == 0)
    {
        set_cvar_num("mp_timelimit", 0)
        remove_task(1)
        set_task(5.0, "check_players_2", 2,.flags="b")
    }
}
public check_players_2(id)
{
    new players[32], Count
    get_players(players, Count, "ch")
    server_print("players: %d", players)
    new timec = get_cvar_num("mp_timelimit")
    server_print("(task 2) time: %d", timec)
    if(players[31] > 0)
    {
        set_cvar_num("mp_timelimit", 20)
        remove_task(2)
        set_task(5.0, "check_players_1", 1,.flags="b")
    }
}
Тут возникла проблема, с первого на второй таск переходит успешно(если 0 игроков), а вот обратно уже не хочет (когда я захожу). В чем загвоздка?

Снимок.PNG
 
Сообщения
66
Реакции
34
Помог
3 раз(а)
На 32-ух игроках пробовали? Только тогда, внезапно, в 32-ой ячейке массива появится id игрока.
Посмотрите сюда, подумайте, перепишите.
 
Сообщения
484
Реакции
88
Помог
4 раз(а)
На просторах интернета, нашел кое-что полезное:
Код:
stock playersnum_without_bots()
{
    static max_players
    max_players || (max_players = get_maxplayers())

    static players_count
    players_count = 0
    for (new i = 1; i <= max_players; i++)
    {
        if(is_user_bot(i) || is_user_hltv(i) || !is_user_connected(i)) continue;
        players_count++
    }

    return players_count
}
24 Окт 2018
if(playersnum_without_bots() == 0)
if(playersnum_without_bots() > 0)
И подключаешь stock сообщением выше :secret:
24 Окт 2018
juice, Что не так?
 
Последнее редактирование:
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
AleXr, get_playersnum получает игроков вместе с ботами.
Я видел эту функцию, мне такое не надо
24 Окт 2018
Окей, пришлось сделать циклом


Diff:
#include <amxmodx>

#define PLUGIN "Название"
#define VERSION "0.1"
#define AUTHOR "Nordic Warrior"

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    new map[32]
    get_mapname(map,31)
    if(equal(map,"35hp_2",6)) set_task(5.0, "check_players_1", 1,.flags="b")
}

public check_players_1(id)
{
    new players[32], Count, i, player
    
    get_players(players, Count, "ch")
+    for (i=0; i<Count; i++) {
+    player = players[i]
+    }
    server_print("players: %d", player)
    new timec = get_cvar_num("mp_timelimit")
    server_print("(task1) time: %d", timec)
    if(player == 0)
    {
        set_cvar_num("mp_timelimit", 0)
        remove_task(1)
        set_task(5.0, "check_players_2", 2,.flags="b")
    }
}
public check_players_2(id)
{
    new players[32], Count, i, player
    get_players(players, Count, "ch")
+    for (i=0; i<Count; i++) {
+    player = players[i]
+    }
    server_print("players: %d", player)
    new timec = get_cvar_num("mp_timelimit")
    server_print("(task 2) time: %d", timec)
    if(player > 0)
    {
        set_cvar_num("mp_timelimit", 20)
        remove_task(2)
        set_task(5.0, "check_players_1", 1,.flags="b")
    }
}
 
Сообщения
317
Реакции
131
Помог
4 раз(а)
неугомон делал что-то подобное, как пример
Код:
/*
    neygomon created ^_^ | http://www.neugomon.ru
    
    No Players Map - для пустых серверов =) Меняет карту на заданную
    Особенности:
        * Вызывает голосование если на сервере игроков меньше чем указано
        * Если сервер пустой, то карта меняется на указанную
        * Если карта в плагине и текущая карта на сервере совпадают - плагин отключается
        * Карту меняет в начале раунда, аля Last Round
        * Сообщения в чат о результатах голосования

    Credits:
        * death_error. За идею
    
    Information:
        * Скальпель, соси болт причмокивая :)
*/


#include <amxmodx>

#if AMXX_VERSION_NUM < 183
    #define engine_changelevel(%0) server_cmd("changelevel %s", %0)
#endif

#define MIN_PLAYERS    5        // Минимум игроков, после которых начинают считаться проверки
#define NUM_CHECKS    3        // Число проверок пустого сервера или с малым кол-вом игроков. Далее запуск голосования.
#define VOTETIME    20        // Время голосования
#define MAP        "de_dust2_2x2"    // Карта, на которую менять
// #define NO_ROUND            // Поддержка бесконечного раунда

new iSelectKey[2];
#if !defined NO_ROUND
new bool:g_bChangeMap;
new bool:g_bFirstRound = true;
#endif
public plugin_init()
{
#define PLUGIN     "No Players Map"
#define VERSION "1.03"
    register_plugin(PLUGIN, VERSION, "neygomon");

    new map[32]; get_mapname(map, charsmax(map));
    if(!strcmp(map, MAP))
    {
        log_amx("Plugin %s[%s] stopped! Curr map %s contains in plugin %s", PLUGIN, VERSION, map, MAP);
        pause("ad");
        return;
    }
#if defined NO_ROUND
    set_task(60.0, "eRoundStart", .flags="b");
#else   
    register_event("HLTV", "eRoundStart", "a", "1=0", "2=0");
    register_logevent("LeRestartRound", 2, "1&Restart_Round_");
#endif
    register_menucmd(register_menuid(PLUGIN), MENU_KEY_1|MENU_KEY_2, "NPMHandler");   
}
#if !defined NO_ROUND
public LeRestartRound()
    g_bFirstRound = true;
#endif
public eRoundStart()
{
    static players[32], iCheck, iCheck2, pl;
#if !defined NO_ROUND
    if(g_bChangeMap)
    {
        engine_changelevel(MAP);
        return PLUGIN_CONTINUE;
    }
    if(g_bFirstRound)
    {
        iCheck = iCheck2 = 0;
        g_bFirstRound = false;
    }
#endif   
    get_players(players, pl, "ch");
    if(!pl)
    {
        if(++iCheck >= NUM_CHECKS)
            engine_changelevel(MAP);
    }
    else if(pl < MIN_PLAYERS)
    {
        if(++iCheck2 >= NUM_CHECKS)
        {
            new szMenu[256], iLen, iKeys = MENU_KEY_1|MENU_KEY_2;
            iLen = formatex(szMenu, charsmax(szMenu), "\d[\r%s\d] \yНа сервере мало игроков \d[\r%d чел\d]^n\wСменить карту на \r%s\w?^n^n", PLUGIN, pl, MAP);
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r1. \wДа^n");
            iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r2. \wНет^n");
            
            set_task(float(VOTETIME), "CheckResult");
            return show_menu(0, iKeys, szMenu, VOTETIME, PLUGIN);
        }
    }
    return PLUGIN_CONTINUE;
}

public NPMHandler(id, iKey)
{
    switch(iKey)
    {
        case 0: iSelectKey[0]++;
        case 1: iSelectKey[1]++;
    }
    return PLUGIN_HANDLED;
}

public CheckResult()
{
    if((iSelectKey[0] > iSelectKey[1]) || (!iSelectKey[0] && !iSelectKey[1]))
    {
        ChatColor("^1[^4%s^1] ^4Голосование состоялось! Следующая карта ^3%s", PLUGIN, MAP);
#if defined NO_ROUND
        engine_changelevel(MAP);
#else       
        g_bChangeMap = true;
#endif       
        return;
    }
    ChatColor("^1[^4%s^1] ^4Голосование ^3не ^4состоялось! В след. раунде спрошу еще раз :D", PLUGIN);
    arrayset(iSelectKey, 0, sizeof iSelectKey);
}

stock ChatColor(const szMessage[], any:...)
{
    static pnum, players[32], szMsg[190], IdMsg;
    vformat(szMsg, charsmax(szMsg), szMessage, 2);
    
    if(!IdMsg) IdMsg = get_user_msgid("SayText");
    
    get_players(players, pnum, "ch");
    
    for(new i; i < pnum; i++)
    {
        message_begin(MSG_ONE, IdMsg, .player = players[i]);
        write_byte(players[i]);
        write_string(szMsg);
        message_end();
    }
}
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
Sonyx, 793937.jpg
24 Окт 2018
alabamaster1337, потом гляну, сейчас на работе. Я вообще просто хотел изначально эту возможность в мап-менеджер мистрика вкрутить…
24 Окт 2018
Sonyx, а вообще, именно такой пример был на amxxmod.ru :pardon:
 
Сообщения
484
Реакции
88
Помог
4 раз(а)
Sonyx, не подскажете, чем мой вариант плох?
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
WILL_BE, тем, что вы сделали то, что уже есть в get_players.
А ТС видно не понимает что пишет.
 

SAM

Сообщения
47
Реакции
-29
Помог
3 раз(а)
ну и че то что get_playersnum получает с ботами? так ты флаги выстави в функции этой и не будет получать ни ботов, ни хлтв
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
Как вариант
Код:
getPlayersNum() {
    new result = 0;
    for (new id = 1; id <= MaxClients; id++) {
        if (is_user_conencted(id) && !is_user_bot(id) && !is_user_hltv(id)) {
            result++;
        }
    }
    return result;
}
24 Окт 2018
SAM, https://github.com/alliedmodders/amxmodx/blob/master/amxmodx/amxmodx.cpp#L2252 - как видно флагы ничего не дадут для отсеивания ботов
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
SAM, какие флаги?
Синтаксис:
get_playersnum ( [ flag ] )


Обычно не указывается ни какой флаг (это равно флагу 0), но если поставить 1 - то в число игроков войдут и те, кто только присоединяются к серверу.
24 Окт 2018
fantom, да тоже читал про этот способ на амххмод.ру, но потом вспомнил, что была функция с флагами — get_players
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
WILL_BE, ищем отличия
@AleXr, get_playersnum получает игроков вместе с ботами.
sbelov020, что вы делаете?
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
Mistrick, ну а как сделать иначе? Скажу честно — я не понимаю. Но код свою функцию выполняет…
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
sbelov020, Добавьте еще for(new i; i < 999999999; i++){}, код продолжит выполнять функцию.
Кроме того, что вы не знаете как работает mp_timelimit. Было 20, выставите 0, пройдет 20 минут и 1 секунда, у вас срабатывает возврат на 20. Итог у вас сразу меняется карта и никаких голосований не будет.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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