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:
@@ -104,10 +104,14 @@ addons/sourcemod/logs/custom_rounds.log
|
|||||||
|
|
||||||
## Версия
|
## Версия
|
||||||
|
|
||||||
`1.2.1` — Автор: deidara.dev
|
`1.2.2` — Автор: deidara.dev
|
||||||
|
|
||||||
### Changelog
|
### 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**
|
- **1.2.1**
|
||||||
- Фикс: жёсткая проверка прав в `HasCustomRoundsAccess` — теперь обязательно требуется хотя бы один админ-флаг (раньше при пустом флаге в `admin_overrides.cfg sm_cr` мог пропускать обычных игроков)
|
- Фикс: жёсткая проверка прав в `HasCustomRoundsAccess` — теперь обязательно требуется хотя бы один админ-флаг (раньше при пустом флаге в `admin_overrides.cfg sm_cr` мог пропускать обычных игроков)
|
||||||
- Защитные re-check вызовы в `MenuHandler_Main`, `QueueCustomRound`, `CancelPendingRound` — даже если меню каким-то образом окажется у игрока без прав, действия не выполнятся
|
- Защитные re-check вызовы в `MenuHandler_Main`, `QueueCustomRound`, `CancelPendingRound` — даже если меню каким-то образом окажется у игрока без прав, действия не выполнятся
|
||||||
|
|||||||
@@ -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.1",
|
version = "1.2.2",
|
||||||
url = "https://deidara.dev"
|
url = "https://deidara.dev"
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1226,14 +1226,9 @@ void ShowFreezeImageToAll(CustomRoundType mode)
|
|||||||
char url[256];
|
char url[256];
|
||||||
Format(url, sizeof(url), "%s%s.html", CR_MOTD_BASE_URL, slug);
|
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));
|
GetRoundDisplayName(mode, title, sizeof(title));
|
||||||
|
GetRoundDescription(mode, description, sizeof(description));
|
||||||
KeyValues kv = new KeyValues("data");
|
|
||||||
kv.SetString("title", title);
|
|
||||||
kv.SetNum("type", 2); // MOTDPANEL_TYPE_URL
|
|
||||||
kv.SetString("msg", url);
|
|
||||||
kv.SetNum("customsvr", 1);
|
|
||||||
|
|
||||||
for (int i = 1; i <= MaxClients; i++)
|
for (int i = 1; i <= MaxClients; i++)
|
||||||
{
|
{
|
||||||
@@ -1241,10 +1236,33 @@ void ShowFreezeImageToAll(CustomRoundType mode)
|
|||||||
{
|
{
|
||||||
continue;
|
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 ...)
|
void LogCRAction(int client, const char[] format, any ...)
|
||||||
@@ -1252,9 +1270,6 @@ void LogCRAction(int client, const char[] format, any ...)
|
|||||||
char message[256];
|
char message[256];
|
||||||
VFormat(message, sizeof(message), format, 3);
|
VFormat(message, sizeof(message), format, 3);
|
||||||
|
|
||||||
char path[PLATFORM_MAX_PATH];
|
|
||||||
BuildPath(Path_SM, path, sizeof(path), CR_LOG_FILE);
|
|
||||||
|
|
||||||
char timestamp[32];
|
char timestamp[32];
|
||||||
FormatTime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S");
|
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");
|
strcopy(roleTag, sizeof(roleTag), "REG");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Дублируем в стандартный SM лог (L<date>.log) — для гарантии что запись проходит
|
// Стандартный SM лог — для надёжности на shared-хостингах
|
||||||
LogMessage("[CR] [%s] %s (%s) -> %s [раунд %d]", roleTag, adminName, adminSteam, message, g_RoundCounter);
|
LogMessage("[CR] [%s] %s (%s) -> %s [раунд %d]", roleTag, adminName, adminSteam, message, g_RoundCounter);
|
||||||
|
|
||||||
// Основной лог в отдельный файл
|
// Свой файл — через OpenFile с относительным путём (LogToFileEx с absolute путём от BuildPath
|
||||||
LogToFileEx(path, "[%s] [%s] %s (%s) -> %s [раунд %d]", timestamp, roleTag, adminName, adminSteam, message, g_RoundCounter);
|
// на 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 на запись.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user