Как полностью забрать вип? (as_ режим)

Сообщения
22
Реакции
0
Сделал код на то что бы в вип режиме каждые 2 раунда менялись команды.
Каждые 2 раунда меняются команды, но только с випом что то не так, не получается нормально забрать випку. Постоянно какие то баги при смене команд.


Вопрос: Самый нормальный и не баганный способ забрать вип(строчки 42,43)

C++:
#include <amxmodx>
#include <reapi>
#include <cstrike>
new IRound = 1
new blockmap
new maplistplug[][] =  {
    "as_",
    "vip_"
};

public plugin_init()
{
        register_plugin("Changeteam","ya","manitor")
        new MapName[62]
        get_mapname(MapName, 61)
        for(new i ; i < sizeof maplistplug ; i++)
        {
            if(containi(MapName, maplistplug[i]) == -1)
            {
                continue;
            }
            blockmap = true
        }

        if(!blockmap)
        pause("a")

        RegisterHookChain(RG_RoundEnd, "RG_RoundEnd_pre")
}

public RG_RoundEnd_pre()
{
    if(IRound >= 2)
    {
    client_print(0, print_chat, "Смена команд!")
    new Players[32]
    new Count, player, i
    get_players(Players, Count, "h")
    for (i=0; i<Count; i++)
    {
    player = Players[i]
    if(get_member(player, m_bIsVIP))
    set_member(player, m_bIsVIP, false)
    }
    rg_swap_all_players()
    IRound = 1
    }
    else
    {
    IRound = IRound + 1
    }
}
 
Последнее редактирование:
Сообщения
3
Реакции
0
C++:
#include <amxmodx>
#include <reapi>
#include <cstrike>

new IRound = 0; // Переменная для отслеживания количества раундов

public plugin_init() {
    register_plugin("Changeteam", "1.0", "manitor");

    // Список карт, на которых плагин активируется (карты с VIP режимом)
    new const maplistplug[][] = {
        "as_",
        "vip_"
    };

    bool blockmap = false;
    new MapName[32];
    get_mapname(MapName, charsmax(MapName));

    // Проверяем, текущая ли карта является VIP картой
    for (new i = 0; i < sizeof maplistplug; i++) {
        if (containi(MapName, maplistplug[i]) != -1) {
            blockmap = true;
            break;
        }
    }

    // Если карта не VIP, завершить выполнение плагина
    if (!blockmap) {
        set_fail_state("This plugin is disabled on this map.");
        return;
    }

    // Регистрируем событие завершения раунда
    register_event("HLTV", "event_round_end", "a", "1=0", "2=0");
}

public event_round_end() {
    IRound++; // Увеличиваем счетчик раундов

    // Проверяем, пора ли менять команды (каждые два раунда)
    if (IRound % 2 == 0) {
        client_print(0, print_chat, "Teams are switching!");

        new players[32], num;
        get_players(players, num, "h");

        // Проходим по всем игрокам сервера
        for (new i = 0; i < num; i++) {
            new player = players[i];
            new CsTeams: old_team = cs_get_user_team(player);
            new CsTeams: new_team;

            // Определяем, в какую команду перевести игрока
            switch (old_team) {
                case CS_TEAM_CT:
                    new_team = CS_TEAM_T;
                    break;
                case CS_TEAM_T:
                    new_team = CS_TEAM_CT;
                    break;
                case CS_TEAM_VIP:
                    // VIP игроки переводятся в команду противоположную их текущей
                    // VIP могут быть либо в команде CT (их основная команда), либо, если они были переведены, в команде T
                    new_team = CS_TEAM_CT; // Начальное значение, используется как значение по умолчанию

                    // Учитываем, что VIP могут быть и в команде T после перевода:
                    if (old_team == CS_TEAM_CT) {
                        new_team = CS_TEAM_T;
                    } else if (old_team == CS_TEAM_T) {
                        new_team = CS_TEAM_CT;
                    }
                    break;
                default:
                    continue;
            }

            // Устанавливаем игроку новую команду
            cs_set_user_team(player, new_team);
        }

        IRound = 0; // Сбрасываем счетчик раундов
    }
}
 
Последнее редактирование:
Сообщения
3
Реакции
0
А, лучше вот так

C++:
#include <amxmodx>
#include <reapi>
#include <cstrike>

new IRound = 0; // Переменная для отслеживания количества раундов

public plugin_init() {
    register_plugin("Changeteam", "1.0", "manitor");

    // Список карт, на которых плагин активируется (карты с VIP режимом)
    new const maplistplug[][] = {
        "as_",
        "vip_"
    };

    bool blockmap = false;
    new MapName[32];
    get_mapname(MapName, charsmax(MapName));

    // Проверяем, является ли текущая карта VIP картой
    for (new i = 0; i < sizeof maplistplug; i++) {
        if (containi(MapName, maplistplug[i]) != -1) {
            blockmap = true;
            break;
        }
    }

    // Если карта не VIP, завершить выполнение плагина
    if (!blockmap) {
        set_fail_state("This plugin is disabled on this map.");
        return;
    }

    // Регистрируем событие завершения раунда
    register_event("HLTV", "event_round_end", "a", "1=0", "2=0");
}

public event_round_end() {
    IRound++; // Увеличиваем счетчик раундов

    // Проверяем, пора ли менять команды (каждые два раунда)
    if (IRound % 2 == 0) {
        client_print(0, print_chat, "VIP players are switching teams!");

        new players[32], num;
        get_players(players, num, "h");

        // Проходим по всем игрокам сервера
        for (new i = 0; i < num; i++) {
            new player = players[i];
            new CsTeams: old_team = cs_get_user_team(player);
            new CsTeams: new_team;

            // Проверяем, является ли игрок VIP
            if (old_team == CS_TEAM_CT || old_team == CS_TEAM_T) {
                // Определяем, в какую команду перевести VIP игрока
                if (cs_get_user_vip(player)) {
                    // Если игрок VIP и в команде CT
                    if (old_team == CS_TEAM_CT) {
                        new_team = CS_TEAM_T;
                    }
                    // Или если игрок VIP и в команде T
                    else if (old_team == CS_TEAM_T) {
                        new_team = CS_TEAM_CT;
                    }

                    // Устанавливаем игроку новую команду
                    cs_set_user_team(player, new_team);
                }
            }
        }

        IRound = 0; // Сбрасываем счетчик раундов
    }
}
 
Сообщения
137
Реакции
23
Помог
2 раз(а)
C++:
#include <amxmodx>
#include <reapi>
//#include <cstrike>

new blockmap, IRound;
new maplistplug[][] =  {
    "as_",
    "vip_"
};

public plugin_init()
{
        register_plugin("Changeteam","ya","manitor")
        new MapName[62]
        get_mapname(MapName, 61)
        for(new i ; i < sizeof maplistplug ; i++)
        {
            if(containi(MapName, maplistplug[i]) == -1)
            {
                continue;
            }
            blockmap = true
        }

        if(!blockmap)
        pause("a")

        RegisterHookChain(RG_CSGameRules_RestartRound, "@CSGameRules_RestartRound_Pre", .post = false)
}

@CSGameRules_RestartRound_Pre() {
    IRound = get_member_game(m_bCompleteReset) ? 0 : (IRound + 1)
    
    if (IRound >= 2) {
        new Players[32];
        new Count, player, i;
        get_players(Players, Count, "h");
        
        for (i = 0; i < Count; i++) {
            player = Players[i];
            if (get_member(player, m_bIsVIP)) {
                set_member(player, m_bIsVIP, false);
            }
        }
        
        rg_swap_all_players();
        client_print(0, print_chat, "Смена команд!");
        IRound = 0;
    }
}
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
mIDnight, Ему вроде нужна смена команда в конце раунда, судя по его коду.
И еще.
Delete!
Код:
new MapName[62]
        get_mapname(MapName, 61)
        for(new i ; i < sizeof maplistplug ; i++)
        {
            if(containi(MapName, maplistplug[i]) == -1)
            {
                continue;
            }
            blockmap = true
        }

        if(!blockmap)
        pause("a")
создаешь текстовый файл с названием карты, меняешь расширение на ".ini" (пример: plugins-awp_india.ini)
в нем прописываешь плагин который хочешь отключить (пример: weaponmenu.amxx disabled)
/addons/amxmodx/configs создаешь папку maps, туда кидаешь файл
 
Последнее редактирование:
Сообщения
657
Реакции
562
Предупреждения
8
Помог
9 раз(а)
Мб надо пробовать
Код:
/*
* Disappear a player from the world. Used when VIP reaches escape zone. Basically a silent kill.
*
* @param player                Player index.
*
* @noreturn
*/
native rg_disappear(const player);
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Vaqtincha,
Еслиб ты еще так сильно играл на сервере у Артема)))
, респект тебе
 
Сообщения
22
Реакции
0
Vaqtincha, Крашит сервер с такой ошибкой 1717295049552.png
 
Последнее редактирование:
Сообщения
22
Реакции
0
Vaqtincha, Ошибку эту исправил, сделав задержку перед сменой команд. Только теперь крашит клиента с ошибкой: "
Reliable channel overflowed"
 
Сообщения
657
Реакции
562
Предупреждения
8
Помог
9 раз(а)
manitor23, похоже на какую-то рекурсию. Те отправляет много сообщений.
 
Сообщения
22
Реакции
0
В общем способа хорошего я не нашёл. Поэтому буду переводить всех кроме випа (идею взял с fun режима DreamQuake)
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
manitor23, попробуй такой вариант. Если в plugin.ini плагин переведешь в дебаг режим, в консоль будет линковать кто стал випом (чтобы проверить корректность работы алгоритма).
Код:
#include <amxmodx>
#include <reapi>

const AFTER_ROUNDS = 2;

public plugin_init()
{
    if(get_member_game(m_bMapHasVIPSafetyZone)) {
        RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
        log_amx("Plugin starts its running on map '%s'.", MapName);

        if(plugin_flags() & AMX_FLAG_DEBUG) {
            RegisterHookChain(RG_CBasePlayer_MakeVIP, "CBasePlayer_MakeVIP_Post", true);
            log_amx("Debug mode is enable!");
        }
    }
}

public CSGameRules_RestartRound_Pre()
{
    (rg_get_current_round() % AFTER_ROUNDS == 0) && rg_swap_all_players();
}

public CBasePlayer_MakeVIP_Post(const this)
{
    log_amx("Player '%n' become VIP.", this);
}

stock rg_get_current_round()
{
    return (get_member_game(m_iTotalRoundsPlayed) + 1);
}
 
  • Нравится
Реакции: Murz

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
manitor23, если смотреть по коду регейма, то тебе просто достаточно делать свап и все. Регейм сам уже в момент рестарта раунда делает все за тебя: и очищает текущего вип-игрока, и находит следующего. Все начинается отсюда
Проверь, потести, отпишись
 
Сообщения
22
Реакции
0
hajimura, Скачал регейм, сделал такой код:
C++:
#include <amxmodx>
#include <reapi>
#include <cstrike>
new IRound
new blockmap
new maplistplug[][] =  {
    "as_",
    "vip_"
}

public plugin_init()
{
        register_plugin("Changeteam","ya","manitor")
        new MapName[62]
        get_mapname(MapName, 61)
        for(new i ; i < sizeof maplistplug ; i++)
        {
            if(containi(MapName, maplistplug[i]) == -1)
            {
                continue;
            }
            blockmap = true
        }

        if(!blockmap)
        pause("a")

        RegisterHookChain(RG_RoundEnd, "RG_RoundEnd_pre")
}

public RG_RoundEnd_pre()
{
    if(IRound >= 2)
    {
    client_print(0, print_chat, "Смена команд!")
    rg_swap_all_players()
    IRound = 0
    }
    else
    {
    IRound = IRound + 1
    }
}
И плагин вообще перестал работать
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
manitor23, покажи в каком статусе плагин в консоле amxx plugins
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
manitor23, плагин должен работать на картах с префиксом?
Код:
new maplistplug[][] =  {
    "as_",
    "vip_"
}
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
А как ты проверяешь? Команду местами меняет, проверил
 

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

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