v1.2.1: фикс доступа для не-админов + диагностика лога
- HasCustomRoundsAccess теперь требует хотя бы один админ-флаг (фикс случая когда admin_overrides.cfg "sm_cr" с пустым флагом пропускал обычных игроков) - Защитный re-check в MenuHandler_Main / QueueCustomRound / CancelPendingRound — двойная защита - IsFakeClient для блокировки ботов - Дублирующий LogMessage в стандартный SM-лог для диагностики
This commit is contained in:
@@ -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** (только хедшоты)
|
||||
- Полное сохранение/восстановление инвентаря: гранаты, броня, шлем, дефузер, патроны
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user