[CSGO] Скрытие админов в плагине Admin List.

smoke96

Участник
Сообщения
1,134
Реакции
175
Есть небольшой плагин, который выводит список админов которые онлайн. Я старался реализовать в нем функцию скрытия админов , то есть заносишь определенный стим Ид в файл и все админ не отображается при написании команды !admins , но не тут-то было. Почему-то не работает. Помогите :) Код плагина приложил.
PHP:
#pragma semicolon 1;
#include <sourcemod>

new    g_Mode;
new bool:g_Timer;
new bool:InList[MAXPLAYERS+1];
new Handle:ListInvis;

public Plugin:myinfo =
{
    name = "[SM] Admins Online",
    author = "smoke",
    version = "1.0",
    url = ""
}

public OnPluginStart()
{
    decl Handle:hCvar;
    HookConVarChange((hCvar = CreateConVar("sm_adminsonline_mode", "1", "2 мода отображения, 1 - в чате, 2 - в меню")), OnChange);
    g_Mode = GetConVarInt(hCvar);
    HookConVarChange((hCvar = CreateConVar("sm_adminsonline_timer", "0", "Если у вас стоит плагин на подобии cmd_5sec то ставите 1")), OnChange1);
    g_Timer = GetConVarBool(hCvar);
    AutoExecConfig(true, "AdminsOnline");
    ListInvis = CreateArray(32);
    LoadAdminInvis();
    RegConsoleCmd("sm_admins", Admins_CMD);
    AddCommandListener(CacheReload, "sm_reloadadmins");
}

public OnChange(Handle:hCvar, const String:sOldValue[], const String:sNewValue[]) g_Mode = GetConVarInt(hCvar);
public OnChange1(Handle:hCvar, const String:sOldValue[], const String:sNewValue[]) g_Timer = GetConVarBool(hCvar);

public OnClientPostAdminCheck(client)
{
    if(g_Timer)    CreateTimer(6.0, Timer, client);
    else IsInList(client);
}

public Action:Timer(Handle:timer, any:client)
{
    IsInList(client);
    return Plugin_Stop;
}

public Action:Admins_CMD(client, args)
{
    switch(g_Mode)
    {
        case 1:
        {
            decl String:AdminNames[MAXPLAYERS+1][MAX_NAME_LENGTH+1];
            new count = 0;
            for(new i = 1 ; i <= GetMaxClients();i++)
            {
                if(InGame(i) && InList[i])
                {
                    GetClientName(i, AdminNames[count], sizeof(AdminNames[]));
                    count++;
                }
            }
            decl String:buffer[1024];
            ImplodeStrings(AdminNames, count, ",", buffer, sizeof(buffer));
            PrintToChat(client, " \x01[\x04Админы Онлайн\x01] -> \x03%s", buffer);
        }
        case 2:
        {
            decl String:AdminName[MAX_NAME_LENGTH];
            new Handle:g_Menu = CreateMenu(MenuListHandler);
            SetMenuTitle(g_Menu, "[Админы Онлайн]");                      
            for(new i = 1; i <= GetMaxClients(); i++)
            {
                if(InGame(i) && InList[i])
                {
                    GetClientName(i, AdminName, sizeof(AdminName));
                    AddMenuItem(g_Menu, AdminName, AdminName);
                }
            }
            SetMenuExitButton(g_Menu, true);
            DisplayMenu(g_Menu, client, 15);
        }
    }
    return Plugin_Handled;
}

public Action:CacheReload(client, const String:command[], args)
{
    for(new i= 1;i <= GetMaxClients(); i++)
        if(IsClientInGame(i)) IsInList(i);
}
  
public MenuListHandler(Handle:menu, MenuAction:action, param1, param2)
{
    if (action == MenuAction_End)
    CloseHandle(menu);
}

LoadAdminInvis()
{
    if(FileExists("cfg/sourcemod/adminvis.txt"))
    {
        new Handle:hFile = OpenFile("cfg/sourcemod/adminvis.txt", "r");
        if (hFile != INVALID_HANDLE)
        {
            decl String:str_value[150];
            while (!IsEndOfFile(hFile) && ReadFileLine(hFile, str_value, 150)) PushArrayString(ListInvis, str_value);
            CloseHandle(hFile);
        }
    }
    else
        LogError("OpenFile error: cfg/sourcemod/adminvis.txt");
}

stock IsInList(client)
{
    if(InGame(client) && GetUserAdmin(client) == INVALID_ADMIN_ID) InList[client] = false;
    else
    {
        decl String:auth[40];
        GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
        if (FindStringInArray(ListInvis, auth) != -1) InList[client] = false;
        else InList[client] = true;
    }
}

stock bool:InGame(client)
{
    if(client && IsClientInGame(client) && !IsFakeClient(client)) return true;
    else return false;
}
Структура файла adminvis.txt
PHP:
STEAM_0:1:777777
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Попробуй вот этот вариант (чуть переделал, добавил отображение количества админов онлайн). У меня вроде всё нормально работает

UPD Немного обновил: теперь нет необходимости перезагружать кэш админов, если плагин был загружен/перезагружен во время игры.
 

Вложения

  • sm_adminsonline_ex.sp
    4 КБ · Просмотры: 80
Последнее редактирование:

smoke96

Участник
Сообщения
1,134
Реакции
175
Спасибо, приду с учёбы попробую.
--- Добавлено позже ---
Скажи, если админ скрыт то будет писать что нет администраторов?
--- Добавлено позже ---
Попробуй вот этот вариант (чуть переделал, добавил отображение количества админов онлайн). У меня вроде всё нормально работает

UPD Немного обновил: теперь нет необходимости перезагружать кэш админов, если плагин был загружен/перезагружен во время игры.
А можешь сделать чтобы файл adminvis.txt можно было перезагружать командой?
 
Последнее редактирование модератором:

-->KENT<--

На квартале
Сообщения
246
Реакции
50
Попробуй вот этот вариант (чуть переделал, добавил отображение количества админов онлайн). У меня вроде всё нормально работает

UPD Немного обновил: теперь нет необходимости перезагружать кэш админов, если плагин был загружен/перезагружен во время игры.
Спасиб)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
adminvis.txt можно было перезагружать командой
[HIDE="1"]
PHP:
#pragma semicolon 1
#include <sourcemod>

new bool:bLate;
new bool:g_Mode;
new bool:g_Timer;
new bool:InList[MAXPLAYERS+1];
new Handle:ListInvis;

public Plugin:myinfo =
{
	name	= "[SM] Admins Online",
	author	= "smoke",
	version	= "1.0.1hlmod",
	url		= ""
}

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
	bLate = late;
	return APLRes_Success;
}

public OnPluginStart()
{
	decl Handle:hCvar;
	HookConVarChange((hCvar = CreateConVar("sm_adminsonline_mode",	"1", "Режим отображения: 0 - в чате, 1 - в меню.", _, true, 0.0, true, 1.0)), OnChange);
	g_Mode = GetConVarBool(hCvar);
	HookConVarChange((hCvar = CreateConVar("sm_adminsonline_timer",	"0", "Если стоит плагин наподобие cmd_5sec, то ставьте 1.", _, true, 0.0, true, 1.0)), OnChange1);
	g_Timer = GetConVarBool(hCvar);
	AutoExecConfig(true, "AdminsOnline");
	ListInvis = CreateArray(32);
	LoadAdminInvis();
	RegConsoleCmd("sm_admins", Admins_CMD);
	RegAdminCmd("sm_reloadadmins", CacheReload, ADMFLAG_GENERIC);
	if(bLate) LoopClients();
}

public OnChange(Handle:hCvar, const String:sOldValue[], const String:sNewValue[]) g_Mode = GetConVarBool(hCvar);
public OnChange1(Handle:hCvar, const String:sOldValue[], const String:sNewValue[]) g_Timer = GetConVarBool(hCvar);

public Action:CacheReload(client, args)
{
	LoadAdminInvis();
	LoopClients();
	return Plugin_Handled;
}

LoopClients()
{
	for(new i = 1; i <= MaxClients; i++)
		IsInList(i);
}

public OnClientPostAdminCheck(client)
{
	if(g_Timer) CreateTimer(6.0, CmdTimer, client, TIMER_FLAG_NO_MAPCHANGE);
	else IsInList(client);
}

public OnClientDisconnect_Post(client) InList[client] = false;

public Action:CmdTimer(Handle:timer, any:client)
{
	IsInList(client);
	return Plugin_Stop;
}

public Action:Admins_CMD(client, args)
{
	if(!client) return Plugin_Handled;

	decl String:AdminNames[MaxClients][MAX_NAME_LENGTH];
	new count;
	for(new i = 1; i <= MaxClients; i++)
	{
		if(InList[i])
		{
			GetClientName(i, AdminNames[count++], MAX_NAME_LENGTH);
		}
	}

	if(count)
	{
		if(g_Mode)
		{
			new Handle:g_Menu = CreateMenu(MenuListHandler);
			SetMenuTitle(g_Menu, "[Админы Онлайн]\n     Всего: %d\n ", count);
			for(new i; i < count; i++)
			{
				AddMenuItem(g_Menu, "", AdminNames[i], ITEMDRAW_DISABLED);
			}
			if(count < 10) SetMenuPagination(g_Menu, MENU_NO_PAGINATION);
			SetMenuExitButton(g_Menu, true);
			DisplayMenu(g_Menu, client, MENU_TIME_FOREVER);
		}
		else
		{
			decl String:buffer[192];
			ImplodeStrings(AdminNames, count, ", ", buffer, sizeof(buffer));
			PrintToChat(client, " \x01[\x04Админы Онлайн\x01] (%d): \x03%s", count, buffer);
		}
	}
	else PrintToChat(client, " \x01[\x04Админы Онлайн\x01]: \x03На сервере сейчас нет админов.");
	return Plugin_Handled;
}

public MenuListHandler(Handle:menu, MenuAction:action, param1, param2)
{
	if (action == MenuAction_End)
		CloseHandle(menu);
}

LoadAdminInvis()
{
	if(FileExists("cfg/sourcemod/adminvis.txt"))
	{
		decl Handle:hFile;
		if ((hFile = OpenFile("cfg/sourcemod/adminvis.txt", "r")) != INVALID_HANDLE)
		{
//			PrintToServer("Hidden admins:", PushArrayString(ListInvis, str_value), str_value);
			decl String:str_value[150];
			while (!IsEndOfFile(hFile) && ReadFileLine(hFile, str_value, 150))
			{
				PushArrayString(ListInvis, str_value);
//				PrintToServer("%d) %s", PushArrayString(ListInvis, str_value), str_value);
			}
			CloseHandle(hFile);
		}
	}
	else LogError("OpenFile error: cfg/sourcemod/adminvis.txt");
}

stock IsInList(client)
{
	if(IsClientInGame(client))
	{
		if(GetUserAdmin(client) != INVALID_ADMIN_ID)
		{
			decl String:auth[32];
			GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
//			PrintToServer("'%s' (%d)", auth, client);
			InList[client] = (FindStringInArray(ListInvis, auth) == -1);
		}
		else InList[client] = false;
	}
}
[/HIDE]
Значение квара изменено в целях оптимизации (удалить старый AdminsOnline.cfg). Устранён 1 возможный баг (особенно при sm_adminsonline_timer 1).
 

Roxen159

Участник
Сообщения
35
Реакции
6
Подскажите ПЖ как в этом Админ ЛИсте сделать так что бы не показывало админов онлайн с фдагами Z и Т.Д
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Roxen159, ты хочешь, чтобы плагин сам определял кого не надо показывать по их флагам, что ли?
Вообще просто внести их SteamID в файл adminvis.txt и не надо флаги чекать
 

Roxen159

Участник
Сообщения
35
Реакции
6
@Roxen159, ты хочешь, чтобы плагин сам определял кого не надо показывать по их флагам, что ли?
Вообще просто внести их SteamID в файл adminvis.txt и не надо флаги чекать
я просто хочу что бы плагин не показывал админов у которых флаг доступа ROOT
что бы он писал что админов нет онлайн, а я например в игре.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Roxen159, добавь свой SteamID в adminvis.txt и всё
 

PRINCESSA

Участник
Сообщения
64
Реакции
3
adminvis.txt он должен сам появиться (где?) или его надо куда-то добавить?
 
Сообщения
368
Реакции
114
adminvis.txt он должен сам появиться (где?) или его надо куда-то добавить?
cfg/sourcemod/adminvis.txt
Сообщения автоматически склеены:

А можешь сделать чтобы файл adminvis.txt можно было перезагружать командой?

Command reload:
sm_reloadcfg
 

Вложения

  • Admin Online.sp
    4.5 КБ · Просмотры: 13
Последнее редактирование:
Сверху Снизу