Смена команд местами при 32 игроках.

Сообщения
61
Реакции
24
Помог
1 раз(а)
Здравствуйте, возник вопрос, сделать смену людей местами когда одна команда сильно доминирует другую.
Проблема в том что все что нашел из современного, не совсем правильно работает.

Первая конструкция.

C++:
RegisterHookChain(RG_CBasePlayer_Spawn, "fwdPlayerSpawn_Pre", false);

public fwdPlayerSpawn_Pre(const index)
{
        rg_switch_team(index);

}
при переводе 1-2 людей работает замечательно,но если сервер полный, и попытаться сменить команды, просто не срабатывает, не переводит не одного.

Далее


C++:
public endRound()
{
    rg_swap_all_players()
    return PLUGIN_HANDLED
}
Игроков просто выкидывает с сервака с ошибкой Reliable channel overflowed


Далее, команда swapteams работает хорошо, но она сбрасывает счет, и время карты. А хотелось бы просто замена команд и дальше продолжить играть, даже без рр.

Тестировал сразу на двух. результат одинаковый.

Код:
version
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.10.0.761-dev-mpath
Build date: 10:50:46 Jul 26 2021 (2662)
Build from: https://github.com/dreamstalker/rehlds/commit/aaffe43

game version
ReGameDLL version: 5.21.0.534-dev
Build date: 18:28:48 Sep 02 2021
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/9233f85

meta list
Currently loaded plugins:
      description      stat pend  file                        vers             src  load  unload
 [ 1] Reunion          RUN   -    reunion_mm_i386.so          v0.1.92d         ini  Start Never
 [ 2] ReAuthCheck      RUN   -    reauthcheck_mm_i386.so      v0.1.6           ini  Start Never
 [ 3] VoiceTranscoder  RUN   -    VoiceTranscoder.so          v2020MA2         ini  ANY   ANY 
 [ 4] SafeNameAndChat  RUN   -    SafeNameAndChat.so          v1.1             ini  ANY   ANY 
 [ 5] AMX Mod X        RUN   -    amxmodx_mm_i386.so          v1.10.0.5435     ini  Start ANY 
 [ 6] ReSemiclip       RUN   -    resemiclip_mm_i386.so       v2.3.9+MA        ini  Chlvl ANY 
 [ 7] WHBlocker        RUN   -    whblocker_mm_i386.so        v1.5.697         ini  Chlvl ANY 
 [ 8] hackdetector     RUN   -    hackdetector_amxx_i386.so   v0.15.328.lite   ini  ANY   ANY 
 [ 9] ProcessCmds      RUN   -    processcmds_mm_i386.so      v1.2.0           ini  Start Never
 [10] MySQL            RUN   -    mysql_amxx_i386.so          v1.10.0.5435     pl5  ANY   ANY 
 [11] VTC AMXX API     RUN   -    VtcApi_amxx_i386.so         v2017 RC         pl5  ANY   ANY 
 [12] ReAimDetector    RUN   -    reaimdetector_amxx_i386.so  v0.2.2           pl5  ANY   Never
 [13] Engine           RUN   -    engine_amxx_i386.so         v1.10.0.5435     pl5  ANY   ANY 
 [14] Ham Sandwich     RUN   -    hamsandwich_amxx_i386.so    v1.10.0.5435     pl5  ANY   ANY 
 [15] FakeMeta         RUN   -    fakemeta_amxx_i386.so       v1.10.0.5435     pl5  ANY   ANY 
 [16] CStrike          RUN   -    cstrike_amxx_i386.so        v1.10.0.5435     pl5  ANY   ANY 
 [17] Fun              RUN   -    fun_amxx_i386.so            v1.10.0.5435     pl5  ANY   ANY 
 [18] ReAPI            RUN   -    reapi_amxx_i386.so          v5.20.0.236-dev  pl5  ANY   Never
18 plugins, 18 running

Может кто подсказать, куда копать,может кто занимался чем то подобным?
 
Сообщения
101
Реакции
17
Помог
2 раз(а)
Are_you_ready, я в одном плагине видел, там перевод осуществляется пачками с задержкой через таск. Может специально, чтобы не было проблем.
Вот он, нашел.
 

Вложения

Последнее редактирование:
Сообщения
61
Реакции
24
Помог
1 раз(а)
muhycspb, полезно, спасибо, попробую используя таск через rg_switch_team(index); сменить, по результатам отпишусь.
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
К сожалению вот такая конструкция не сработала, при 7 людях онлайн уже не перекидывает никого. при одном, нормально...

C++:
public plugin_init()
{
register_clcmd("say /forceswdsap", "massive_transfer", ACCESS_FLAG);
RegisterHookChain(RG_RoundEnd, "fwdRoundEnd", true);
RegisterHookChain(RG_CBasePlayer_Spawn, "fw_Spawn", true);
g_forcetrans = false;
}

public fwdRoundEnd()
{
    if(g_forcetrans == true)
    {
        new players[32], num;
        get_players(players, num);
        for(new i; i < num; i++)
            add_delay(players[i]);
    }
}

add_delay(id)
{
    switch(id)
    {
        case 1..7: set_task(0.1, "changeTeam", id);
        case 8..15: set_task(0.2, "changeTeam", id);
        case 16..23: set_task(0.3, "changeTeam", id);
        case 24..32: set_task(0.4, "changeTeam", id);
    }
}


public changeTeam(id)
{
    if(g_forcetrans == true)
    {
        rg_switch_team(id);
    }
}

public massive_transfer(id)
{
    g_forcetrans = true;
    new name[32]; get_user_name(id, name, charsmax(name));
    client_print_color (0, 0, "^3 Админ ^4%s ^3сделал смену сторон! Смена в новом раунде!", name);
    return PLUGIN_HANDLED;
}

public fw_Spawn(id)
{
  if (is_user_alive(id))
  {
   другие функции плагина
  }
  g_forcetrans = false;
}
 
Последнее редактирование:
Сообщения
101
Реакции
17
Помог
2 раз(а)
Are_you_ready, я не скриптер, но вариант, что я скинул, точно рабочий, я когда-то брал оттуда именно этот кусок кода и при онлайне 20+ игроков он переводил без проблем. Возможно, чтобы разобраться, вас попросят скинуть код целиком. Опять же, я не скриптер, но может дело в g_forcetrans
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
muhycspb, код подправил, собственно все указал. Когда что и зачем, если бы не срабатывало для одного, я бы понял. что где то косяк, или потом кидало бы туда сюда. Нет для одного четко отрабатывает, по команда кидает в новом раунде 1 раз и все. Сейчас через rg_set_user_team попробую...Скорее реапи не хочет отрабатывать когда запросов много...
 
Сообщения
486
Реакции
89
Помог
5 раз(а)
Are_you_ready, могу и ошибаться, но тебе же нужно отловить игроков играющих, т.е. исключить Зрителей
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
@WILL_BE,команда rg_switch_team меняет только теров с ст местами, не трогает остальных. Поэтому даже если спектров посчитал, уже на уровне реапи должно их отсеять. В любом случае пытаюсь через rg_set_user_team и при 10 игроках получилось. Тут команды отлавливал, ст переводил за т и наоборот. Посмотрим как будет если народа будет больше...
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Are_you_ready, я в одном плагине видел, там перевод осуществляется пачками с задержкой через таск. Может специально, чтобы не было проблем.
Вот он, нашел.
Не надо так.

Are_you_ready, https://github.com/Sugisakii/FPUG-A...cc5a8b5a638afaab6c90d4692d8/pug_mod.sma#L1075 смотри в какой момент игроки свапаются.
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
d3m37r4, проверил, то как тут указанно, не знаю может конечно что то не так сделал.
Но при одном человеке онлайн, отрабатывает нормально, без багов, ровно 1 раз, без повторных переносов, и т.п. а вот при 32, вообще не кидает не одного, но хотя бы не кикнуло никого. В этот раз.
Код ниже.

Код:
#include <amxmodx>
#include <reapi>

#pragma semicolon 1

#define ACCESS_FLAG    ADMIN_BAN

new bool:g_forcetrans = false;
new bool:is_intermission = false;
new g_iMaxPlayers;

public plugin_init()
{
    register_clcmd("say /forceswdsap", "massive_transfer", ACCESS_FLAG);
    RegisterHookChain(RG_RoundEnd, "OnRoundEndPre", 0);
    RegisterHookChain(RG_CSGameRules_RestartRound, "OnStartRound", 0);
    RegisterHookChain(RG_CSGameRules_RestartRound, "OnStartRoundPost", 1);
    g_forcetrans = false;
    g_iMaxPlayers = get_maxplayers();
}

public massive_transfer(id)
{
    g_forcetrans = true;
    new name[32]; get_user_name(id, name, charsmax(name));
    client_print_color (0, 0, "^3Админ ^4%s ^3сделал смену сторон! Смена в новом раунде!", name);
    return PLUGIN_HANDLED;
}

public OnStartRound()
{
    if(is_intermission && g_forcetrans == true)
    {
        rg_swap_all_players();
        RequestFrame("OnStartRound_NextFrame");
    }
}

public OnRoundEndPre(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay)
{
    if(g_forcetrans == true)
    {
        StartIntermission();
    }
}

public StartIntermission()
{
    is_intermission = true;
}

public OnStartRoundPost()
{
    if(is_intermission)
    {
        is_intermission = false;
    }
}

public OnStartRound_NextFrame()
{
    for(new i = 1 ; i <= g_iMaxPlayers ; i++)
    {
        if(!is_user_connected(i))
        {
            continue;
        }
        if(is_user_alive(i))
        {
            if(get_member(i, m_bHasC4))
            {
                rg_remove_all_items(i);
                rg_give_default_items(i);
                rg_give_item(i, "weapon_c4");
                set_member(i, m_bHasC4, true);
                set_entvar(i, var_body, 1);
            }
            else
            {
                rg_remove_all_items(i);
                rg_give_default_items(i);
            }
            
            rg_set_user_armor(i, 0, ARMOR_NONE);
        }
    }
}
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Are_you_ready, во-первых, я вижу бездумную копипасту того кода, во-вторых, перебрасывать полностью всех и не будет, пока mp_limitteams будет задан.
 
Сообщения
3,583
Реакции
1,572
Помог
138 раз(а)
d3m37r4, я глядел исходник Switch Team() и чёт не увидел там проверки на этот квар. Можешь показать место, где чекается?
 
Сообщения
61
Реакции
24
Помог
1 раз(а)
d3m37r4, она и есть. А вот про квар, важное замечание. Проверю...
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
Nordic Warrior, нигде, ошибся. Тоже думал, что там проверка есть.
21 Окт 2021
В restartround, который к gamerules относится, кстати, есть свап игроков.
 
Последнее редактирование:
Сообщения
61
Реакции
24
Помог
1 раз(а)
d3m37r4, интересно, но как ее применить? Это ведь не готовая функция которую можно в плагин вписать...
 

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

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