Сompiler warning 213: tag mismatch не найду способа как его убрать

polki

Пользователь
Регистрация
22 Сен 2017
Сообщения
25
Симпатии
2
Amx Mod X
AMXX 1.10.0
Ошибка
Код:
AMX Mod X Compiler 1.10.0.5461
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2013 AMX Mod X Team

ggmat_chooser.sma(102) : warning 213: tag mismatch
ggmat_chooser.sma(104) : warning 213: tag mismatch
ggmat_chooser.sma(127) : warning 213: tag mismatch
ggmat_chooser.sma(132) : warning 213: tag mismatch
ggmat_chooser.sma(136) : warning 217: loose indentation
ggmat_chooser.sma(141) : warning 217: loose indentation
ggmat_chooser.sma(155) : warning 217: loose indentation
ggmat_chooser.sma(155) : warning 213: tag mismatch
ggmat_chooser.sma(156) : warning 213: tag mismatch
ggmat_chooser.sma(158) : warning 217: loose indentation
ggmat_chooser.sma(166) : warning 217: loose indentation
ggmat_chooser.sma(168) : warning 217: loose indentation
ggmat_chooser.sma(199) : warning 213: tag mismatch
ggmat_chooser.sma(200) : warning 213: tag mismatch
ggmat_chooser.sma(262) : warning 217: loose indentation
ggmat_chooser.sma(287) : warning 217: loose indentation
ggmat_chooser.sma(328) : warning 213: tag mismatch
ggmat_chooser.sma(329) : warning 213: tag mismatch
ggmat_chooser.sma(329) : warning 213: tag mismatch
ggmat_chooser.sma(334) : warning 213: tag mismatch
Header size: 1168 bytes
Code size: 8688 bytes
Data size: 5796 bytes
Stack/heap size: 16384 bytes
Total requirements: 32036 bytes

20 Warnings.
Done.
Исходник
Код:
#include <amxmodx>
#include <amxmisc>
#include <reapi>

//#include "include/GGMat/ggmat_modes.inl"

// Режимы игры для системы ggmat
enum ModeType {
Single, // 0 — Одиночный режим (индивидуальный прогресс)
Command, // 1 — Командный режим (общий прогресс по командам)
FFA // 2 — Free-for-all (без команд)
}


// Заголовки и пункты меню — встроены в код
new const g_szMenuHeader[] = "Выберите режим:";
new const g_szMenuItem[ModeType][] = {
"Одиночный",
"Командный",
"Каждый сам за себя"
};

//Все что нужно для отсчета времени и вывода на экран сообщения
#define TASK_SHOWTIMER 102
new g_iVoteTimer = 5; // текущее значение таймера (в секундах)
new g_iHudTime = 5; // сколько последних секунд показывать HUD (можно настроить)
new g_iSoundTime = 5; // до скольки секунд проигрывать звуки (макс. 10)
//new g_iTimer = 5; //Счетчик звука g_szSound
// Цвет и позиция HUD
new g_iTimerColor[3] = {255, 100, 0}; // оранжевый по умолчанию
new Float:g_fTimerHud[2] = {0.45, 0.85}; // центр-низ экрана

// Звуки обратного отсчёта
new const g_szSound[][] = {
"", "fvox/one", "fvox/two", "fvox/three", "fvox/four", "fvox/five",
"fvox/six", "fvox/seven", "fvox/eight", "fvox/nine", "fvox/ten"
};

////////////////////////////////////////////////////////////

// === Глобальные переменные для заморозки и затемнения ===
new g_msgScreenFade; // ID сообщения ScreenFade
new HookChain:HookSpawn; // Хук на спавн
new HookChain:HookResetSpeed; // Хук на сброс скорости
new bool:g_bVoteInProcess = false; // Идёт ли голосование
new g_iTotalVotes; // Общее число голосующих
new g_iVotedCount; // Счётчик проголосовавших (только увеличивается)
new bool:g_bVoted[33]; // Флаг проголосовал ли игрок (индексация с 1)
new g_iVotes[ModeType]; // Счётчики голосов за режимы
new g_iAlpha = 200; // Прозрачность затемнения (0-255)
new bool:g_bWasVote = false; // Было ли голосование на этой карте

////////////////////////////////////////////////////////////



new g_iFwdSetGameMode; // Форвард для установки режима игры


// Инициализация
public plugin_init() {
register_plugin("Simple Chooser (No Lang File)", "1.0.1", "Me");
register_clcmd("say /choose", "cmd_choose");
register_clcmd("say_team /choose", "cmd_choose");
// Регистрируем хуки (цепочки вызовов) на ключевые игровые события:
RegisterForwards();
// Получаем уникальный ID системного сообщения "ScreenFade" из движка игры.
g_msgScreenFade = get_user_msgid("ScreenFade");

// Создаём мультифорвард для передачи выбранного режима игры
g_iFwdSetGameMode = CreateMultiForward("gg_set_game_mode", ET_IGNORE, FP_CELL);

register_logevent("EventGameCommencing", 2, "0=World triggered", "1=Game_Commencing");

}


RegisterForwards()
{
// Хук на отключение игрока (для корректного завершения голосования)
RegisterHookChain(RH_SV_DropClient, "SV_DropClient", true);

// Хук на спавн — отключаем сразу, включим только во время голосования
DisableHookChain(HookSpawn = RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true));

// Хук на сброс скорости — блокируем разморозку во время голосования
DisableHookChain(HookResetSpeed = RegisterHookChain(RG_CBasePlayer_ResetMaxSpeed, "CBasePlayer_ResetMaxSpeed", false));
}




// Обработчик начала карты — СБРАСЫВАЕМ ВСЁ состояние голосования
public EventGameCommencing()
{
g_bWasVote = false; // ← КРИТИЧЕСКИ ВАЖНО: разрешаем новое голосование
g_bVoteInProcess = false; // на случай, если предыдущее не завершилось
g_iVoteTimer = 5; // сбрасываем таймер в начальное значение

// Опционально: очищаем остаточные данные
//arrayset(g_iVotes, 0, ModeType);
for (new i = 0; i < ModeType; i++)
{
g_iVotes = 0;
}
arrayset(g_bVoted, false, 33);
g_iTotalVotes = 0;
g_iVotedCount = 0;
}


// Обработчик меню — ничего не делает (можно расширить позже)
public MenuHandler(id, menu, item)
{
if (item == MENU_EXIT || !g_bVoteInProcess) {
return PLUGIN_HANDLED;
}

// Проверка: уже голосовал?
if (g_bVoted[id]) {
client_print(id, print_chat, "Вы уже проголосовали!");
return PLUGIN_HANDLED;
}

// === ЗАПИСЬ ВЫБОРА ===
g_bVoted[id] = true; // Помечаем игрока как проголосовавшего
g_iVotes[item]++; // Увеличиваем счётчик за выбранный режим
g_iVotedCount++; // Увеличиваем счётчик голосов
// Выводим в чат информацию о выборе
new szName[32];
get_user_name(id, szName, charsmax(szName));
client_print(0, print_chat, "^3%s^1 выбрал режим: ^4%s", szName, g_szMenuItem[item]);

// === ДОСРОЧНОЕ ЗАВЕРШЕНИЕ ===
// Считаем, сколько игроков уже проголосовало
if (g_iVotedCount >= g_iTotalVotes)
{
EndVoting();
}

return PLUGIN_HANDLED;
}


// Форвард, вызываемый из другого плагина (например, ggmat_warmup)
// Используется для запуска обратного отсчёта перед показом меню выбора режима
public gg_show_chooser()
{
remove_task(TASK_SHOWTIMER);
DebugVoteVariables("BEFORE gg_show_chooser");
// ← ДОБАВЬ ЭТИ СТРОКИ:
g_bVoteInProcess = true; // Начинаем голосование
g_iTotalVotes = 0; // Сбрасываем счётчики
//arrayset(g_iVotes, 0, ModeType);
for (new i = 0; i < ModeType; i++) {
g_iVotes = 0;
}
arrayset(g_bVoted, false, 33);

// Получаем число живых игроков
new players[32], num;
get_players(players, num, "ach");
g_iTotalVotes = num;
g_iVotedCount = 0; // Сбрасываем счётчик голосов

DebugVoteVariables("AFTER gg_show_chooser");
// Запускаем таймер
set_task(1.0, "Show_Timer", TASK_SHOWTIMER);
return PLUGIN_HANDLED;
// // Удаляем предыдущую задачу (если она была), чтобы избежать дублирования
// remove_task(TASK_SHOWTIMER);
//
// // Запускаем повторяющуюся задачу:
// // - первый вызов через 1.0 секунду,
// // - функция Show_Timer будет вызываться каждую секунду,
// // - всего вызовов: g_iVoteTimer + 1 = 6 раз.
// // Почему +1? Потому что в Show_Timer мы сразу делаем g_iVoteTimer--,
// // и чтобы отсчитать 5 → 4 → 3 → 2 → 1 → 0 (6 состояний),
// // нужно 6 вызовов.
// set_task(1.0, "Show_Timer", TASK_SHOWTIMER, _, _, "a", g_iVoteTimer);
//
// return PLUGIN_HANDLED;
}




// Команда для вызова меню
public cmd_choose(id) {
ShowChooseMenu(id);
return PLUGIN_HANDLED;
}

// Функция показа меню
ShowChooseMenu(id) {
new menu = menu_create(g_szMenuHeader, "MenuHandler");

// Добавляем все 3 пункта
for (new i = 0; i < ModeType; i++) {
menu_additem(menu, g_szMenuItem, "", 0);
}

menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
menu_display(id, menu, 0);
}

public Show_Timer()
{
// 1. Получаем правильную форму слова "секунда/секунды/секунд"
// в зависимости от текущего значения g_iVoteTimer (например: "5 секунд", "1 секунда")
new szSec[16];
get_ending_simple(g_iVoteTimer, szSec, charsmax(szSec));

// 2. Если осталось <= g_iHudTime секунд — показываем HUD всем подключённым игрокам
// (например, если g_iHudTime = 5, то HUD покажется при 5, 4, 3, 2, 1 секунде)
if (g_iVoteTimer <= g_iHudTime) {
for (new i = 1; i <= 32; i++) { // Перебираем всех возможных игроков (ID от 1 до 32)
if (!is_user_connected(i)) continue; // Пропускаем, если игрок не подключён

// Устанавливаем параметры HUD-сообщения:
// - цвет из массива g_iTimerColor,
// - позицию из g_fTimerHud[X], g_fTimerHud[Y],
// - длительность отображения — 1.0 секунда,
// - остальные параметры — стандартные (без эффектов, без канала и т.д.)
set_hudmessage(
g_iTimerColor[0], g_iTimerColor[1], g_iTimerColor[2], // RGB цвет
g_fTimerHud[0], g_fTimerHud[1], // X, Y позиция
0, // канал (авто)
0.0, // время появления
1.0, // время удержания
0.0, // fade-in
0.0, // fade-out
1 // приоритет
);

// Отображаем сообщение: "До выбора режима осталось 3 секунды!"
show_hudmessage(i, "До выбора режима осталось %d %s!", g_iVoteTimer, szSec);
}
}
/*
// 3. Проверяем, пора ли завершить отсчёт
if (g_iVoteTimer-- <= g_iTimer)
{
if( g_iTimer <= 1)
{
new players[32], num;
get_players(players, num, "ch");

for (new i = 0; i < num; i++)
{
ShowChooseMenu(players);
}
}
client_cmd(0, "spk %s", g_szSound[g_iTimer--]);
}
*/




// Проигрываем звук ДО уменьшения таймера (для текущего значения)
if (g_iVoteTimer <= g_iSoundTime && g_iVoteTimer <= 10 && g_iVoteTimer > 0) {
client_cmd(0, "spk %s", g_szSound[g_iVoteTimer]);
}


if (g_iVoteTimer-- <= 0) {
// Включаем хуки для новых спавнов
EnableHookChain(HookSpawn);
EnableHookChain(HookResetSpeed);

// Затемняем всех
BlackScreen(0);

// Замораживаем и показываем меню всем живым игрокам
new players[32], num;
get_players(players, num, "ach");
for (new i = 0; i < num; i++) {
FreezePlayer(players);
ShowChooseMenu(players);
}

return; // СТОП — не ставим новую задачу
}

// Продолжаем таймер
set_task(1.0, "Show_Timer", TASK_SHOWTIMER);
}

// Функция определяет правильную форму слова "секунда" в русском языке
// в зависимости от числа (например: 1 секунда, 2 секунды, 5 секунд).
// Результат записывается в строку output[].
stock get_ending_simple(num, output[], len)
{
// Получаем последнюю цифру числа (например, у 23 → 3, у 101 → 1)
new mod10 = num % 10;

// Получаем последние две цифры числа (например, у 112 → 12, у 5 → 5)
// Это нужно, чтобы обработать исключения: 11, 12, 13, 14 — они не склоняются как обычные
new mod100 = num % 100;

// Правило 1: если число оканчивается на 1, но НЕ на 11 → "секунда"
// Примеры: 1, 21, 31, 101 → "секунда"
// Исключение: 11, 111, 211 → не "секунда", а "секунд"
if (mod10 == 1 && mod100 != 11) {
formatex(output, len, "секунда");
}
// Правило 2: если число оканчивается на 2, 3 или 4,
// И при этом НЕ входит в диапазон 10–19 (где 12, 13, 14 — исключения),
// то используется форма "секунды"
// Примеры: 2, 3, 4, 22, 23, 34, 102 → "секунды"
// Исключения: 12, 13, 14, 112, 113 → "секунд"
else if (mod10 >= 2 && mod10 <= 4 && (mod100 < 10 || mod100 >= 20)) {
formatex(output, len, "секунды");
}
// Правило 3: во всех остальных случаях — "секунд"
// Это включает: 0, 5–20, 25–30, 100, 111, 112 и т.д.
else {
formatex(output, len, "секунд");
}
}



EndVoting() {
// Находим режим с максимальным числом голосов
new winner = 0;
for (new i = 1; i < ModeType; i++) {
if (g_iVotes > g_iVotes[winner]) winner = i;
}


// Вывод результата
client_print(0, print_chat, "Голосованием выбран режим: %s", g_szMenuItem[winner]);



//Вызов форварда с параметром режима
new iRet;
ExecuteForward(g_iFwdSetGameMode, iRet, winner);



// Разморозка и очистка эффектов
UnFreezePlayers();
DelBlackScreen(0);
DisableHookChain(HookSpawn);
DisableHookChain(HookResetSpeed);

g_bVoteInProcess = false;
g_bWasVote = true;

}

// === Хук: игрок спавнится во время голосования ===
public CBasePlayer_Spawn(id)
{
if (is_user_alive(id) && g_bVoteInProcess) {
FreezePlayer(id); // Заморозить
BlackScreen(id); // Затемнить
g_iTotalVotes++; // Увеличить счётчик голосующих
ShowChooseMenu(id); // Показать меню
}
return HC_CONTINUE;
}

// === Хук: попытка сбросить скорость (разморозиться) ===
public CBasePlayer_ResetMaxSpeed(id)
{
if (g_bVoteInProcess && is_user_alive(id)) {
return HC_SUPERCEDE; // БЛОКИРУЕМ сброс скорости
}
return HC_CONTINUE;
}

// === Хук: игрок отключился во время голосования ===
public SV_DropClient(id, bCrash, szFmt[])
{
if (g_bVoteInProcess) {
g_iTotalVotes--; // ← Уменьшаем ТОЛЬКО число участников

// Если игрок уже проголосовал — корректируем счётчик
if (g_bVoted[id]) {
g_iVotedCount--;
}

// Проверяем завершение
if (g_iVotedCount >= g_iTotalVotes && g_iTotalVotes > 0) {
EndVoting();
}
}
return HC_CONTINUE;
}





// === Заморозка игрока ===
FreezePlayer(const id)
{
set_entvar(id, var_maxspeed, 0.1); // Скорость ≈ 0
set_member(id, m_bIsDefusing, true); // Визуальный эффект "дефуз"
}

// === Разморозка игрока ===
UnFreezePlayer(const id)
{
rg_reset_maxspeed(id); // Восстанавливаем скорость
set_member(id, m_bIsDefusing, false);
}

// === Разморозка всех игроков ===
UnFreezePlayers()
{
new players[32], num;
get_players(players, num, "ach"); // alive + connected + human
for (new i = 0; i < num; i++) {
UnFreezePlayer(players);
}
}

// === Затемнение экрана ===
BlackScreen(const id)
{
message_begin(id ? MSG_ONE : MSG_ALL, g_msgScreenFade, _, id ? id : 0);
write_short(1<<0); // duration
write_short(1<<0); // holdtime
write_short(1<<2); // flags: FFADE_STAYOUT
write_byte(0); // R
write_byte(0); // G
write_byte(0); // B
write_byte(g_iAlpha); // Alpha (прозрачность)
message_end();
}

// === Убрать затемнение ===
DelBlackScreen(const id)
{
message_begin(id ? MSG_ONE : MSG_ALL, g_msgScreenFade, _, id ? id : 0);
write_short(1<<0);
write_short(1<<0);
write_short(1<<0); // flags: FFADE_OUT
write_byte(0);
write_byte(0);
write_byte(0);
write_byte(0); // Alpha = 0 (полная прозрачность)
message_end();
}




// Выводит в консоль сервера значения всех переменных, используемых в системе голосования режимов
// Вызывается для отладки перед/после запуска голосования через gg_show_chooser
stock DebugVoteVariables(const szContext[])
{
server_print("=== DebugVoteVariables [%s] ===", szContext);

// Основные флаги состояния
server_print("g_bVoteInProcess = %s", g_bVoteInProcess ? "true" : "false");
server_print("g_bWasVote = %s", g_bWasVote ? "true" : "false");

// Счётчики голосования
server_print("g_iTotalVotes = %d", g_iTotalVotes);
server_print("g_iVotedCount = %d", g_iVotedCount);

// Счётчики голосов за режимы (одиночный/командный/каждый сам за себя)
server_print("g_iVotes[Single] = %d", g_iVotes[Single]);
server_print("g_iVotes[Command] = %d", g_iVotes[Command]);
server_print("g_iVotes[FFA] = %d", g_iVotes[FFA]);

// Состояние проголосовавших игроков (индексы 1-32)
server_print("g_bVoted players:");
new iVotedPlayers = 0;
for (new i = 1; i <= 32; i++) {
if (g_bVoted) {
server_print(" Player %d: voted", i);
iVotedPlayers++;
}
}
if (!iVotedPlayers) server_print(" (no players voted yet)");

// Таймеры и настройки отображения
server_print("g_iVoteTimer = %d", g_iVoteTimer);
server_print("g_iHudTime = %d", g_iHudTime);
server_print("g_iSoundTime = %d", g_iSoundTime);
server_print("g_iAlpha = %d", g_iAlpha);

// Текущий выбранный режим (после голосования)
// server_print("g_iCurMode = %d (%s)", g_iCurMode, g_szMenuItem[g_iCurMode]);

// Список живых игроков (для проверки количества участников голосования)
new players[32], num;
get_players(players, num, "ach"); // alive + connected + human
server_print("Current alive players: %d", num);
for (new i = 0; i < num; i++) {
new name[32];
get_user_name(players, name, charsmax(name));
server_print(" Player %d: %s (voted: %s)", players, name, g_bVoted[players] ? "YES" : "no");
}

server_print("=== End DebugVoteVariables ===");
}
На 8 строчке я создаю перечисление режимов игры.
На 49 строчке я создаю переменную для подсчета голосов за каждый из режимов
Далее я хочу сбросить счетчики за каждый режим.
Сначала я пытался сделать это методом на 101 строчке, компилятор выдает предупреждение,
ниже 101 строчки вы увидите другой способ, но компилятор также выдает предупреждение.

Подскажите как мне правильно сбросить массив что бы избавиться от предупреждения?
Вместо ModeType подставить цифру 3 не хочется.
 
Сверху Снизу