From b2129a2762fcf0c359a5a2041cd414e8675e0955 Mon Sep 17 00:00:00 2001 From: deidara Date: Fri, 1 May 2026 17:47:45 +0300 Subject: [PATCH] =?UTF-8?q?v1.2.2:=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3-=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20(OpenFile=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20LogToFileEx)=20+=20HUD?= =?UTF-8?q?=20overlay=20backup=20=D0=B4=D0=BB=D1=8F=20MOTD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Лог: переход на OpenFile с относительным путём — на MyArena LogToFileEx с absolute путём от BuildPath молча не создавал файл - MOTD: используется стандартный ShowMOTDPanel (правильный KeyValues format) - Добавлен гарантированный HUD-overlay в центре экрана с названием+описанием режима (~6 сек). Покажется даже если клиент отключил HTML MOTD --- README.md | 6 ++- scripting/ArcaneGame_CustomRounds_Core.sp | 60 ++++++++++++++++------- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c83b3eb..52d2321 100644 --- a/README.md +++ b/README.md @@ -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` — даже если меню каким-то образом окажется у игрока без прав, действия не выполнятся diff --git a/scripting/ArcaneGame_CustomRounds_Core.sp b/scripting/ArcaneGame_CustomRounds_Core.sp index 4058bf5..3e19950 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.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); - } - delete kv; + // 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); + } +} + +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.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 на запись."); + } }