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