Ну и зачем? Я не видел ни в одном плагине сохранение указателя на объект в админ-меню. Тем более с ним ничего не делается.
g_cEnable = CreateConVar("sm_admtex_mode", "0", "Вкл/Выкл технические работы на сервере!", FCVAR_DONTRECORD);
Зачем FCVAR_DONTRECORD? Тем более конвара и так не передаётся на клиенты. А даже если бы и передавалась, то клиент отвергал бы её, ибо подобной конвары нет у него самого.
WorksTime = CreateConVar("sm_admtex_time", "10", "Сколько секунд оповещать о начале технических работ ? Def: 10", _, true, 0.0, true, 60.0);
Зачем написано дефолтное значение в Description?
Зачем висит максимальный лимит на время об оповещении о начале тех работ? Может, я хочу в течении 5-и минут оповещать своих игроков, но из-за потолка в минуту не могу?
AutoExecConfig(true, "AdminTex");
Движок почему-то криво работает с конфигами, в имени которых содержатся буквы верхнего регистра. Не знаю, почему, но такой баг есть. Тем более конфиги плагинов запускает именно движок.
FormatEx(buffer, maxlength, techworks ? "Перейти в игровой режим" : "Перейти в технический режим");
В том варианте, который я наблюдаю сейчас, логичнее было бы заюзать strcopy().
А если и юзать FormatEx(), то так:
FormatEx(buffer, maxlength, "Перейти в %s режим", techworks ? "игровой" : "технический");
if(object_id == admtex) ClientCommand(param, "sm_admtex");
Такие костыли поискать ещё, конечно, надо.
Не проще сделать ли прямой вызов каллбека команды? Она такая же функция, как и все.
if(sec <= GetConVarInt(WorksTime))
GetConVarInt() - довольно ресурсозатратный вызов. Как и ConVar.IntValue.get, и ConVar.GetInt(). Лучше хукнуть, и отслеживать изменения.
ServerCommand("sm_admtex_mode 1");
Тоже тот ещё костыль... Лучше так:
g_cEnable.BoolValue = true;
if(newValue[0] == '1' && techworks == false)
{
techworks = true;
GSTATUS();
if(Start != null)
{
Start = null;
sec = 0;
}
}
else if(newValue[0] == '0' && techworks == true)
{
techworks = false;
}
У меня фейспалм наидичайший...
techworks = (newValue[0] != '0');
if (techworks)
{
GSTATUS();
Start = null;
}
public void OnClientPostAdminCheck(int client)
{
if(techworks && !IsFakeClient(client) && !IsClientAdmin(client))
KickClient(client, "На сервере идут Технические работы.\nВход только для Администрации!\nПриносим свои извинения за доставленные неудобства.");
}
void GSTATUS()
{
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && !IsFakeClient(i))
{
OnClientPostAdminCheck(i);
}
}
}
Для тех, кто не понял, за что я здесь зацепился:
void GSTATUS()
{
/* ... */
if(/* ... */ && !IsFakeClient(i))
/* ... */
}
public void OnClientPostAdminCheck(int client)
{
if(/* ... */ && !IsFakeClient(client) && /* ... */)
// ...
Зачем проверять игрока на бота два раза?! Много времени тик длится, что-ли?!
Снести нахер проверку из
GSTATUS().
public void OnLibraryRemoved(const char[] name) {if(StrEqual(name, "adminmenu")) g_TopMenu = null;}
А смысл? Указатель всё равно изменится.
void PrintToChats()
{
PrintToChatAll("Сервер переведён в %s!", techworks ? "технический режим" : "игровой режим");
}
По примеру выше, слово "режим" можно вынести из форматирования.
void PrintToChats()
{
PrintToChatAll("Сервер переведён в %s режим!", techworks ? "технический" : "игровой");
}