v1.2.1: фикс доступа для не-админов + диагностика лога

- HasCustomRoundsAccess теперь требует хотя бы один админ-флаг
  (фикс случая когда admin_overrides.cfg "sm_cr" с пустым флагом
   пропускал обычных игроков)
- Защитный re-check в MenuHandler_Main / QueueCustomRound /
  CancelPendingRound — двойная защита
- IsFakeClient для блокировки ботов
- Дублирующий LogMessage в стандартный SM-лог для диагностики
This commit is contained in:
deidara
2026-05-01 17:34:07 +03:00
parent e17f642eed
commit e1317c677d
2 changed files with 43 additions and 2 deletions
+6 -1
View File
@@ -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** (только хедшоты)
- Полное сохранение/восстановление инвентаря: гранаты, броня, шлем, дефузер, патроны
+37 -1
View File
@@ -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<date>.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);
}