Плагин lite_nightmode

Сообщения
2,288
Реакции
1,739
Помог
31 раз(а)
Имеется данный плагин, но так как сервер работает в режиме winlimit потребовалась переделка плагина для работы с winlimit. Сдаётся мне, что не всё так просто...Пожалуйста проверьте и подскажите что еще изменить и как лучше. (не смейтесь громко:rofl:)
Код:
#include <amxmodx>
#tryinclude <reapi>

#define STARTTIME    01        // Время начала ночного режима. Тестировал только с 00 часов. Поддежка раннего времени есть, но не проверялось:)
#define ENDTIME        10        // Окончание ночного режима
#define MAP         "de_dust2_2x2"    // Карта ночного режима
#define AUTORR        25        // Авторестарт карты (sv_restart 1) каждые n раундов. Установите 0 для отключения данной плюшки.

-new g_pTimeLimit, g_iOldTime, Float:g_flResetTime;
+new g_pWinLimit, g_iOldTime, Float:g_flResetTime;
new bool:g_bNight;
#if AUTORR > 0
new g_iRound;
#endif
#if AMXX_VERSION_NUM < 183
    #define engine_changelevel(%0) server_cmd("changelevel %s", %0)
#endif

public plugin_init()
{
#define VERSION "1.1"
    register_plugin("Lite NightMode", VERSION, "neygomon");
    register_cvar("lite_nightmode", VERSION, FCVAR_SERVER | FCVAR_SPONLY);

    register_event("TextMsg",     "eGameCommencing", "a", "2=#Game_Commencing", "2=#Game_will_restart_in");   
    register_event("HLTV",         "eRoundStart", "a", "1=0", "2=0");

    register_clcmd("say rtv", "RtvHook");
    register_clcmd("say_team rtv", "RtvHook");
    register_clcmd("say /rtv", "RtvHook");
    register_clcmd("say_team rtv", "RtvHook");
    register_clcmd("amx_rtv", "RtvHook");
    
-    g_pTimeLimit = get_cvar_pointer("mp_timelimit");
+    g_pWinLimit = get_cvar_pointer("mp_winlimit");
}

public plugin_end()
    if(g_iOldTime)
-        set_pcvar_num(g_pTimeLimit, g_iOldTime);
+        set_pcvar_num(g_pWinLimit, g_iOldTime);

public client_putinserver(id)
    if(g_bNight)
        remove_user_flags(id, ADMIN_MAP|ADMIN_VOTE);
        
public eGameCommencing()
{
    g_flResetTime = get_gametime();
#if AUTORR > 0   
    g_iRound = 0;
#endif   
}   

public eRoundStart()
{
    static szCurMap[32], CurHour; time(CurHour);

#if STARTTIME > ENDTIME
    if(CurHour >= STARTTIME || CurHour < ENDTIME)
#else
    if(STARTTIME <= CurHour < ENDTIME)
#endif   
    {   
        if(!szCurMap[0])
            get_mapname(szCurMap, charsmax(szCurMap));
        
        if(!equal(szCurMap, MAP))
            engine_changelevel(MAP);   
        else if(!g_bNight)
        {
            g_bNight = true;
            RemovePlayersFlags();
-            g_iOldTime = get_pcvar_num(g_pTimeLimit);
-            set_pcvar_num(g_pTimeLimit, 0);
+            g_iOldTime = get_pcvar_num(g_pWinLimit);
+            set_pcvar_num(g_pWinLimit, 0);
        }
#if AUTORR > 0           
        static iRound; iRound = AUTORR - ++g_iRound;
        if(iRound > 0) ChatColor(0, "^1[^4Only ^3%s^1] ^4Через ^3%d ^4раундов авторестарт карты. ^1[ ^4Тек. раунд: ^3%d ^1| ^4Всего: ^3%d^1 ]", MAP, iRound, g_iRound, AUTORR);
        else
        {
            server_cmd("sv_restart 1");
        #if defined _reapi_included
            rg_swap_all_players();
        #endif
        }
#endif           
    }   
    else if(g_bNight)
    {
-        set_pcvar_num(g_pTimeLimit, floatround(get_gametime() - g_flResetTime) / 60 + 5);
+        set_pcvar_num(g_pWinLimit, floatround(get_gametime() - g_flResetTime) / 60 + 5);
        g_bNight = false;
    }
}

public RtvHook(id)
{
    if(!g_bNight) return PLUGIN_CONTINUE;
    ChatColor(id, "^1[^4Only ^3%s^1] ^4RTV не работает в ^3Ночном режиме!", MAP);
    return PLUGIN_HANDLED;
}

RemovePlayersFlags()
{
    static players[32], pcount;
    get_players(players, pcount, "ch");
    for(new i; i < pcount; i++)
        remove_user_flags(players[i], ADMIN_MAP|ADMIN_VOTE);
}

stock ChatColor(const id, const szMessage[], any:...)
{
    static pnum, players[32], szMsg[190], IdMsg;
    vformat(szMsg, charsmax(szMsg), szMessage, 3);
    
    if(!IdMsg) IdMsg = get_user_msgid("SayText");
    
    if(id)
    {
        if(!is_user_connected(id)) return;
        players[0] = id;
        pnum = 1;
    }
    else 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();
    }
}
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Так а в чем заключается проблема? Не работает? Или просто нужен совет по коду?
 
Сообщения
2,288
Реакции
1,739
Помог
31 раз(а)
Minni, Совет. и небольшая проблема есть в том, что в течении ночи winlimit увеличивается до 73 и не сбрасывается после окончания ночного режима (временно решил путём написания квара в amxx.cfg).
 
Последнее редактирование:
Сообщения
2,288
Реакции
1,739
Помог
31 раз(а)
Вот помогли. Может кому пригодится
Код:
#include <amxmodx>
#include <reapi>

#define STARTTIME   01
#define ENDTIME     08
#define MAP         "de_dust2"
#define AUTORR      50

new g_pWinLimit, g_OldWinLimit, g_RoundsNeed;
new HookChain:g_HookRoundStart;

public plugin_init() {
    register_plugin("[Fork] Lite NightMode", "1.1", "neygomon & NoNaMe");
 
    RegisterHookChain(RG_RoundEnd, "RoundEnd", true);
    g_HookRoundStart = RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound", true);
    DisableHookChain(g_HookRoundStart);
    
    g_pWinLimit = get_cvar_pointer("mp_winlimit");

    state disabled;
}

public plugin_end() <enabled> {
    set_pcvar_num(g_pWinLimit, g_OldWinLimit);
}

public plugin_end() <disabled> {}

public RoundEnd() <enabled> {
    if (!checkNightTime()) {
        set_pcvar_num(g_pWinLimit, g_OldWinLimit);
        state disabled;
        DisableHookChain(g_HookRoundStart);
        return HC_CONTINUE;
    }
    
    if (get_member_game(m_bCompleteReset)) {
        return HC_CONTINUE;
    }
    if (--g_RoundsNeed <= 0) {
        set_cvar_num("sv_restart", 1);
        rg_swap_all_players();
        g_RoundsNeed = AUTORR;
    }

    return HC_CONTINUE;
}

public RoundEnd() <disabled> {
    if (!checkNightTime()) {
        return HC_CONTINUE;
    }
    
    if (!checkNightMap()) {
        engine_changelevel(MAP);
        return HC_CONTINUE;
    }
    
    g_OldWinLimit = get_pcvar_num(g_pWinLimit);
    set_pcvar_num(g_pWinLimit, 0);

    state enabled;
    set_cvar_num("sv_restart", 1);
    EnableHookChain(g_HookRoundStart);
    g_RoundsNeed = AUTORR;
    
    return HC_CONTINUE;
}

public CSGameRules_RestartRound() {
    client_print_color(
        0, print_team_default,
        "^1[^4Only ^3%s^1] ^4Через ^3%d ^4раундов авторестарт карты. ^1[ ^4Тек. раунд: ^3%d ^1| ^4Всего: ^3%d^1 ]",
        MAP, g_RoundsNeed, get_member_game(m_iTotalRoundsPlayed) + 1, AUTORR
    );
}

bool:checkNightTime() {
    new hour;
    time(hour);

#if STARTTIME > ENDTIME
    return bool:(hour >= STARTTIME || hour < ENDTIME);
#else
    return bool:(STARTTIME <= hour < ENDTIME);
#endif
}

bool:checkNightMap() {
    new mapname[32];
    rh_get_mapname(mapname, charsmax(mapname), MNT_TRUE);
    return bool:equal(mapname, MAP);
}
 

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

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