v1.2.2: фикс лог-файла (OpenFile вместо LogToFileEx) + HUD overlay backup для MOTD

- Лог: переход на OpenFile с относительным путём — на MyArena
  LogToFileEx с absolute путём от BuildPath молча не создавал файл
- MOTD: используется стандартный ShowMOTDPanel (правильный KeyValues format)
- Добавлен гарантированный HUD-overlay в центре экрана с названием+описанием
  режима (~6 сек). Покажется даже если клиент отключил HTML MOTD
This commit is contained in:
deidara
2026-05-01 17:47:45 +03:00
parent e1317c677d
commit b2129a2762
2 changed files with 48 additions and 18 deletions
+5 -1
View File
@@ -104,10 +104,14 @@ addons/sourcemod/logs/custom_rounds.log
## Версия
`1.2.1` — Автор: deidara.dev
`1.2.2` — Автор: deidara.dev
### Changelog
- **1.2.2**
- Фикс лога: переход с `LogToFileEx(absolute_path)` на `OpenFile("addons/sourcemod/logs/custom_rounds.log", "a")`. На MyArena `LogToFileEx` с absolute путём от `BuildPath` молча не создавал файл.
- Фикс MOTD: используется стандартный `ShowMOTDPanel` (правильно сериализует KeyValues с типом как строкой)
- Добавлен **гарантированный HUD-overlay** с названием и описанием режима в центре экрана (~6 секунд), показывается всегда независимо от клиентского `cl_disablehtmlmotd`
- **1.2.1**
- Фикс: жёсткая проверка прав в `HasCustomRoundsAccess` — теперь обязательно требуется хотя бы один админ-флаг (раньше при пустом флаге в `admin_overrides.cfg sm_cr` мог пропускать обычных игроков)
- Защитные re-check вызовы в `MenuHandler_Main`, `QueueCustomRound`, `CancelPendingRound` — даже если меню каким-то образом окажется у игрока без прав, действия не выполнятся
+42 -16
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.1",
version = "1.2.2",
url = "https://deidara.dev"
};
@@ -1226,14 +1226,9 @@ void ShowFreezeImageToAll(CustomRoundType mode)
char url[256];
Format(url, sizeof(url), "%s%s.html", CR_MOTD_BASE_URL, slug);
char title[64];
char title[64], description[128];
GetRoundDisplayName(mode, title, sizeof(title));
KeyValues kv = new KeyValues("data");
kv.SetString("title", title);
kv.SetNum("type", 2); // MOTDPANEL_TYPE_URL
kv.SetString("msg", url);
kv.SetNum("customsvr", 1);
GetRoundDescription(mode, description, sizeof(description));
for (int i = 1; i <= MaxClients; i++)
{
@@ -1241,10 +1236,33 @@ void ShowFreezeImageToAll(CustomRoundType mode)
{
continue;
}
ShowVGUIPanel(i, "info", kv, true);
// 1) Попытка показать MOTD-картинку (требует cl_disablehtmlmotd 0 на клиенте)
ShowMOTDPanel(i, title, url, MOTDPANEL_TYPE_URL);
// 2) Гарантированный визуальный fallback — большой текст в центре экрана
// Покажется даже если у клиента отключён HTML MOTD
SetHudTextParams(-1.0, 0.18, 6.0, 255, 140, 0, 100, 0, 0.3, 0.3, 0.5);
ShowHudText(i, -1, "★ КАСТОМНЫЙ РАУНД ★\n%s\n\n%s", title, description);
}
}
delete kv;
void GetRoundDescription(CustomRoundType roundType, char[] buffer, int maxlen)
{
switch (roundType)
{
case CR_AWP: strcopy(buffer, maxlen, "Только AWP и нож");
case CR_NoScope: strcopy(buffer, maxlen, "AWP без прицела");
case CR_HE: strcopy(buffer, maxlen, "Только гранаты HE, бесконечный боезапас");
case CR_Knife: strcopy(buffer, maxlen, "Только ножи");
case CR_Scout: strcopy(buffer, maxlen, "Только SSG-08 и нож");
case CR_ScoutNoScope: strcopy(buffer, maxlen, "Scout без прицела");
case CR_Deagle: strcopy(buffer, maxlen, "Только Deagle и нож");
case CR_DeagleHS: strcopy(buffer, maxlen, "Только хедшоты наносят урон");
case CR_LowGravity: strcopy(buffer, maxlen, "Низкая гравитация");
case CR_OneHP: strcopy(buffer, maxlen, "У всех 1 HP");
default: strcopy(buffer, maxlen, "");
}
}
void LogCRAction(int client, const char[] format, any ...)
@@ -1252,9 +1270,6 @@ void LogCRAction(int client, const char[] format, any ...)
char message[256];
VFormat(message, sizeof(message), format, 3);
char path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), CR_LOG_FILE);
char timestamp[32];
FormatTime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S");
@@ -1283,9 +1298,20 @@ void LogCRAction(int client, const char[] format, any ...)
strcopy(roleTag, sizeof(roleTag), "REG");
}
// Дублируем в стандартный SM лог (L<date>.log) — для гарантии что запись проходит
// Стандартный SM лог — для надёжности на shared-хостингах
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);
// Свой файл — через OpenFile с относительным путём (LogToFileEx с absolute путём от BuildPath
// на MyArena не создавал файл).
File logFile = OpenFile("addons/sourcemod/logs/custom_rounds.log", "a");
if (logFile != null)
{
logFile.WriteLine("[%s] [%s] %s (%s) -> %s [раунд %d]",
timestamp, roleTag, adminName, adminSteam, message, g_RoundCounter);
delete logFile;
}
else
{
LogError("[CR] Не удалось открыть addons/sourcemod/logs/custom_rounds.log на запись.");
}
}