Плагин меняет команды игроков местами каждые N раундов. И вроде он работает очень хорошо, но бывает, что у игрока не меняется скин.
Подскажите, как правильно реализовать подобный плагин, чтобы исключить такую ошибку. При маленьком онлайне на сервере есть боты.
Убивать оставшихся в живых игроков не хочется, но если это единственный путь, как лучше это сделать и чтобы им не засчитали смерть?
Подскажите, как правильно реализовать подобный плагин, чтобы исключить такую ошибку. При маленьком онлайне на сервере есть боты.
Убивать оставшихся в живых игроков не хочется, но если это единственный путь, как лучше это сделать и чтобы им не засчитали смерть?
C++:
#include <amxmodx>
#include <reapi>
#define PLUGIN_NAME "Auto Team Swap"
#define PLUGIN_VERSION "1.1"
#define PLUGIN_AUTHOR "kakavanAI"
// Глобальные переменные
new g_iCurrentRound = 0; // Счетчик прошедших раундов
new g_pCvarRounds; // Указатель на cvar количества раундов до смены
/**
* Инициализация плагина. Регистрирует cvar'ы и хук на окончание раунда.
*/
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
// Cvar: количество раундов, после которых произойдет смена (0 = отключено)
g_pCvarRounds = register_cvar("ats_rounds", "5");
// Хук на окончание раунда. post=true означает, что код выполнится ПОСЛЕ оригинальной логики игры
RegisterHookChain(RG_RoundEnd, "OnRoundEnd", .post = true);
}
public plugin_precache()
{
precache_sound("darkstar_meat/gong2.wav");
}
/**
* Хук RG_RoundEnd. Вызывается каждый раз, когда раунд завершается.
* Увеличивает счетчик и при достижении заданного порога вызывает смену команд.
*/
public OnRoundEnd(const WinStatus:status, const ScenarioEventEndRound:event, const Float:tmDelay)
{
g_iCurrentRound++;
new swapRounds = get_pcvar_num(g_pCvarRounds);
// Проверяем, делится ли текущий раунд на заданное число без остатка
if (swapRounds > 0 && g_iCurrentRound % swapRounds == 0)
{
SwapTeams();
}
return HC_CONTINUE;
}
/**
* Основная функция смены команд.
* Проходит по всем подключенным игрокам, меняет TERRORIST <-> CT,
* игнорирует спектаторов и корректно обрабатывает мертвых игроков.
*/
stock SwapTeams()
{
new players[MAX_PLAYERS], pnum;
// Получаем список всех подключенных игроков
get_players(players, pnum, "h");
new szName[MAX_NAME_LENGTH];
for (new i = 0; i < pnum; i++)
{
new id = players[i];
// Получаем текущую команду игрока через ReAPI member
new TeamName:currentTeam = get_member(id, m_iTeam);
// Пропускаем спектаторов и игроков без команды
if (currentTeam != TEAM_TERRORIST && currentTeam != TEAM_CT)
continue;
get_user_name(id, szName, charsmax(szName));
// Определяем новую команду: если был T -> станет CT, и наоборот
new TeamName:newTeam = (currentTeam == TEAM_TERRORIST) ? TEAM_CT : TEAM_TERRORIST;
// rg_set_user_team меняет команду БЕЗ убийства игрока.
// Параметры:
// id - индекс игрока
// newTeam - новая команда
// MODEL_AUTO - автоматически подобрать модель новой команды
// true - отправить TeamInfo сообщение клиенту (обновить табличку)
// false - НЕ запускать перепроверку условий победы (чтобы не сбросить раунд)
rg_set_user_team(id, newTeam, MODEL_AUTO, true, false);
client_cmd(id, "spk darkstar_meat/gong2");
client_print(id, print_chat, "[ATS] Команды поменялись местами!");
}
}