diff --git a/README.md b/README.md index 77dffa7..c83b3eb 100644 --- a/README.md +++ b/README.md @@ -104,10 +104,15 @@ addons/sourcemod/logs/custom_rounds.log ## Версия -`1.2.0` — Автор: deidara.dev +`1.2.1` — Автор: deidara.dev ### Changelog +- **1.2.1** + - Фикс: жёсткая проверка прав в `HasCustomRoundsAccess` — теперь обязательно требуется хотя бы один админ-флаг (раньше при пустом флаге в `admin_overrides.cfg sm_cr` мог пропускать обычных игроков) + - Защитные re-check вызовы в `MenuHandler_Main`, `QueueCustomRound`, `CancelPendingRound` — даже если меню каким-то образом окажется у игрока без прав, действия не выполнятся + - Добавлен `IsFakeClient` в проверку (боты заблокированы) + - Дополнительный `LogMessage` в стандартный SM-лог при логировании действий — для надёжности на shared-хостингах - **1.2.0** - Добавлены режимы: **Scout NoScope**, **Deagle Only**, **Deagle HS Only** (только хедшоты) - Полное сохранение/восстановление инвентаря: гранаты, броня, шлем, дефузер, патроны diff --git a/scripting/ArcaneGame_CustomRounds_Core.sp b/scripting/ArcaneGame_CustomRounds_Core.sp index 70b1fec..4058bf5 100644 --- a/scripting/ArcaneGame_CustomRounds_Core.sp +++ b/scripting/ArcaneGame_CustomRounds_Core.sp @@ -33,7 +33,7 @@ public Plugin myinfo = name = "ArcaneGame Custom Rounds Core", author = "deidara.dev", description = "Core plugin for custom rounds with AG Coin integration", - version = "1.2.0", + version = "1.2.1", url = "https://deidara.dev" }; @@ -227,6 +227,10 @@ bool HasCustomRoundsAccess(int client) { return false; } + if (IsFakeClient(client)) + { + return false; + } AdminId admin = GetUserAdmin(client); if (admin == INVALID_ADMIN_ID) @@ -234,11 +238,20 @@ bool HasCustomRoundsAccess(int client) return false; } + // DEIDARA / TESTER — полный доступ независимо от флагов if (IsClientInAllowedAdminGroup(admin, "DEIDARA") || IsClientInAllowedAdminGroup(admin, "TESTER")) { return true; } + // Без групп — обязательно должны быть админ-флаги + // Иначе CheckCommandAccess может вернуть true, если admin_overrides.cfg содержит "sm_cr" с пустым флагом + int userFlags = GetUserFlagBits(client); + if (userFlags == 0) + { + return false; + } + if (!gCvarAccessUseOverrides.BoolValue) { return false; @@ -375,6 +388,13 @@ public int MenuHandler_Main(Menu menu, MenuAction action, int client, int item) return 0; } + // Защитная re-check: вдруг кто-то открыл меню вне Command_CR + if (!HasCustomRoundsAccess(client)) + { + PrintToChat(client, "%s \x02У тебя нет доступа.", CR_PREFIX); + return 0; + } + char info[8]; menu.GetItem(item, info, sizeof(info)); @@ -411,6 +431,12 @@ public int MenuHandler_Main(Menu menu, MenuAction action, int client, int item) void QueueCustomRound(int client, CustomRoundType roundType) { + if (!HasCustomRoundsAccess(client)) + { + PrintToChat(client, "%s \x02У тебя нет доступа.", CR_PREFIX); + return; + } + int cooldown = GetCooldownRemaining(client); if (cooldown > 0) { @@ -439,6 +465,12 @@ void QueueCustomRound(int client, CustomRoundType roundType) void CancelPendingRound(int client) { + if (!HasCustomRoundsAccess(client)) + { + PrintToChat(client, "%s \x02У тебя нет доступа.", CR_PREFIX); + return; + } + if (g_PendingRound == CR_None) { PrintToChat(client, "%s \x02Сейчас нет запланированного кастомного раунда.", CR_PREFIX); @@ -1251,5 +1283,9 @@ void LogCRAction(int client, const char[] format, any ...) strcopy(roleTag, sizeof(roleTag), "REG"); } + // Дублируем в стандартный SM лог (L.log) — для гарантии что запись проходит + LogMessage("[CR] [%s] %s (%s) -> %s [раунд %d]", roleTag, adminName, adminSteam, message, g_RoundCounter); + + // Основной лог в отдельный файл LogToFileEx(path, "[%s] [%s] %s (%s) -> %s [раунд %d]", timestamp, roleTag, adminName, adminSteam, message, g_RoundCounter); }