#include <sdktools>
public Plugin:myinfo = {
name = "[SM] Set Tags Clients",
author = "css-help",
version = "1.1.0",
description = "",
url = "",
};
new bool:g_bIsTag[66];
new String:g_AuthId_Steam2[66][64];
new String:g_sGetTag[66][100];
new String:g_sGetColorTag[66][16];
new g_iTimeTag[66];
new bool:g_bCreateTag[66];
new String:g_sBufferTag[66][100];
new String:g_sBufferColor[66][16];
new Handle:g_arInAdvanceTag = INVALID_HANDLE;
new g_iNuM_Tag[66];
new g_id_Target[66];
new Handle:g_hTIMER = INVALID_HANDLE;
new Handle:g_hDB_TagClients = INVALID_HANDLE;
public OnPluginStart()
{
DBI_Create();
RegAdminCmd("sm_tag", OpenGlobalMenu, 16384, _, _, 0);
RegAdminCmd("sm_prefix", OpenGlobalMenu, 16384, _, _, 0);
g_arInAdvanceTag = CreateArray(100, 0);
}
public OnMapStart()
{
if (FileExists("addons/sourcemod/logs/prefix.txt", false))
{
DeleteFile("addons/sourcemod/logs/prefix.txt");
}
ClearArray(g_arInAdvanceTag);
OnCreateFile_SetTagCFG("cfg/sourcemod/prefix.cfg");
OnOpenFile_SetTagCFG("cfg/sourcemod/prefix.cfg");
if (g_hTIMER == INVALID_HANDLE)
{
g_hTIMER = CreateTimer(5.0, OnCheckTagPlayer, 0, 1);
}
}
public Action:OnCheckTagPlayer(Handle:timer)
{
new iTheTime = GetTime(_);
for (new iClient = 1; iClient <= MaxClients; iClient++)
{
if (IsClientInGame(iClient) && !IsFakeClient(iClient))
{
if (g_bIsTag[iClient] && g_sGetTag[iClient][0] && iTheTime > g_iTimeTag[iClient] && g_iTimeTag[iClient] != -1)
{
g_bIsTag[iClient] = false;
g_sGetTag[iClient][0] = '\0';
}
}
}
}
OnCreateFile_SetTagCFG(String:filename[])
{
if (!FileExists(filename, false))
{
new Handle:file = OpenFile(filename, "w+");
if (file)
{
WriteFileLine(file, "[VIP]\n[ADMIN]\n[BOSS]");
CloseHandle(file);
}
}
}
OnOpenFile_SetTagCFG(String:filename[])
{
new Handle:file = OpenFile(filename, "r");
if (file)
{
new String:buffer[100];
while (!IsEndOfFile(file))
{
ReadFileLine(file, buffer, 100);
new pos = 0;
pos = StrContains(buffer, "//", true);
if (pos != -1)
{
buffer[pos] = '\0';
}
pos = StrContains(buffer, "#", true);
if (pos != -1)
{
buffer[pos] = '\0';
}
pos = StrContains(buffer, ";", true);
if (pos != -1)
{
buffer[pos] = '\0';
}
TrimString(buffer);
if (buffer[0] == 0)
{
continue;
}
if (FindStringInArray(g_arInAdvanceTag, buffer) != -1)
{
continue;
}
PushArrayString(g_arInAdvanceTag, buffer);
}
CloseHandle(file);
}
}
public OnClientPutInServer(client)
{
if (IsClientInGame(client) && !IsFakeClient(client))
{
GetClientAuthId(client, AuthId_Steam2, g_AuthId_Steam2[client], 64, true);
decl String:Name[64];
GetClientName(client, Name, 64);
LogToFileEx("addons/sourcemod/logs/prefix.txt", "OnClientPutInServer :: %s %s", Name, g_AuthId_Steam2[client]);
DBI_SelectInfo(client);
}
}
public OnClientDisconnect(client)
{
decl String:Name[64];
GetClientName(client, Name, 64);
LogToFileEx("addons/sourcemod/logs/prefix.txt", "OnClientDisconnect :: %s %s", Name, g_AuthId_Steam2[client]);
DBI_UpdateInfo(client);
}
public Action:OpenGlobalMenu(client, args)
{
if (client && IsClientInGame(client))
{
MenuGlobal(client);
}
}
MenuGlobal(client)
{
new Handle:menu = CreateMenu(_MenuGlobal, MENU_ACTIONS_DEFAULT);
SetMenuTitle(menu, "Запись Префиксов\n");
AddMenuItem(menu, "", "Установить Префикс", 0);
AddMenuItem(menu, "", "Удалить Префикс", 0);
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuGlobal(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
if (item == 0)
{
MenuTag(client);
}
else
{
MenuDelTag(client);
}
}
else
{
if (action == MenuAction:16)
{
CloseHandle(menu);
}
}
}
MenuTag(client)
{
new size_array = 0;
if ((size_array = GetArraySize(g_arInAdvanceTag)) > 0)
{
new Handle:menu = CreateMenu(_MenuTag, MENU_ACTIONS_DEFAULT);
SetMenuTitle(menu, "Выберите префикс:\n");
new String:NuM[16], String:buffer[100];
AddMenuItem(menu, "new", "Свой префикс", 0);
for (new i = 0; i < size_array; i++)
{
GetArrayString(g_arInAdvanceTag, i, buffer, 100);
IntToString(i, NuM, 15);
AddMenuItem(menu, NuM, buffer, 0);
}
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
else
{
g_iNuM_Tag[client] = -1;
g_bCreateTag[client] = true;
PrintToChat(client, "[SM] Напишите в чат желаемый префикс");
}
}
public _MenuTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
new String:buffer[64];
GetMenuItem(menu, item, buffer, 64, _, _, 0);
if (StrEqual(buffer, "new", true))
{
g_iNuM_Tag[client] = -1;
g_bCreateTag[client] = true;
PrintToChat(client, "[SM] Напишите в чат желаемый префикс");
}
else
{
g_iNuM_Tag[client] = StringToInt(buffer, 10);
MenuColorTag(client);
}
}
else
{
if (action == MenuAction:16)
{
CloseHandle(menu);
}
}
}
MenuColorTag(client)
{
new Handle:menu = CreateMenu(_MenuColorTag, MENU_ACTIONS_DEFAULT);
SetMenuTitle(menu, "Каким цветом будет Тег:\n");
AddMenuItem(menu, "{DEFAULT}", "Желтый", 0);
AddMenuItem(menu, "{GREEN}", "Зеленый", 0);
AddMenuItem(menu, "{LIGHTGREEN}", "Салатовый", 0);
AddMenuItem(menu, "{TEAM}", "Цвет команды", 0);
AddMenuItem(menu, "{RED}", "Красный", 0);
AddMenuItem(menu, "{BLUE}", "Синий", 0);
AddMenuItem(menu, "{GRAY}", "Серый", 0);
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuColorTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
GetMenuItem(menu, item, g_sBufferColor[client], 16, _, _, 0);
MenuPlayerTag(client);
DBI_UpdateInfo(client);
}
else
{
if (action == MenuAction:16)
{
CloseHandle(menu);
}
}
}
MenuPlayerTag(client)
{
new Handle:menu = CreateMenu(_MenuPlayerTag, MENU_ACTIONS_DEFAULT);
new String:userid[8], String:sTar[64];
SetMenuTitle(menu, "Кому установить префикс:\n");
for (new iClient = 1; iClient <= MaxClients; iClient++)
{
if (IsClientInGame(iClient) && !IsFakeClient(iClient))
{
IntToString(GetClientUserId(iClient), userid, 15);
GetClientName(iClient, sTar, 64);
AddMenuItem(menu, userid, sTar, 0);
}
}
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuPlayerTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
decl String:userid[16];
GetMenuItem(menu, item, userid, 15, _, _, 0);
new target = GetClientOfUserId(StringToInt(userid, 10));
if (target < 1 || !IsClientInGame(target))
{
PrintToChat(client, "[SM] Игрок больше не доступен.");
MenuPlayerTag(client);
}
else
{
g_id_Target[client] = target;
MenuTimerTag(client);
}
}
}
MenuTimerTag(client)
{
new Handle:menu = CreateMenu(_MenuTimerTag, MENU_ACTIONS_DEFAULT);
SetMenuTitle(menu, "На сколько довать Тег");
new String:sTimeTag[16];
IntToString(86400, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "1 день", 0);
IntToString(604800, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "7 дней", 0);
IntToString(2419200, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "1 месяц", 0);
IntToString(4838400, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "2 месяца", 0);
IntToString(7257600, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "3 месяца", 0);
IntToString(12096000, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "5 месяцев", 0);
IntToString(29030400, sTimeTag, 16);
AddMenuItem(menu, sTimeTag, "1 год", 0);
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuTimerTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
new target = g_id_Target[client];
if (!IsClientInGame(target))
{
PrintToChat(client, "[SM] Игрок больше не доступен.");
MenuPlayerTag(client);
return;
}
decl String:sTimeTag[16];
GetMenuItem(menu, item, sTimeTag, 16, _, _, 0);
if (g_iNuM_Tag[client] != -1)
{
decl String:buffer[100];
GetArrayString(g_arInAdvanceTag, g_iNuM_Tag[client], buffer, 100);
strcopy(g_sGetTag[target], 100, buffer);
}
else
{
strcopy(g_sGetTag[target], 100, g_sBufferTag[client]);
}
g_bIsTag[target] = true;
g_iTimeTag[target] = GetTime(_) + StringToInt(sTimeTag, 10);
strcopy(g_sGetColorTag[target], 16, g_sBufferColor[client]);
decl String:sAdmin[64], String:sTarger[64];
GetClientName(client, sAdmin, 64);
GetClientName(target, sTarger, 64);
PrintToChat(target, "[SM] Админ \x03%s установил вам префикс.", sAdmin);
PrintToChat(client, "[SM] Вы установили \x03%s префикс.", sTarger);
DBI_UpdateInfo(target);
}
else
{
if (action == MenuAction:16)
{
CloseHandle(menu);
}
}
}
MenuDelTag(client)
{
new Handle:menu = CreateMenu(_MenuDelTag, MENU_ACTIONS_DEFAULT);
new String:userid[8], String:sTar[64];
SetMenuTitle(menu, "У кого удалить Тег:\n");
for (new iClient = 1; iClient <= MaxClients; iClient++)
{
if (IsClientInGame(iClient) && !IsFakeClient(iClient) && g_bIsTag[iClient])
{
IntToString(GetClientUserId(iClient), userid, 15);
GetClientName(iClient, sTar, 64);
AddMenuItem(menu, userid, sTar, 0);
}
}
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuDelTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
decl String:userid[16];
GetMenuItem(menu, item, userid, 15, _, _, 0);
new target = GetClientOfUserId(StringToInt(userid, 10));
if (target < 1 || !IsClientInGame(target))
{
PrintToChat(client, "[SM] Игрок больше не доступен.");
MenuDelTag(client);
}
else
{
decl String:sAdmin[64], String:sTarger[64];
GetClientName(client, sAdmin, 64);
GetClientName(target, sTarger, 64);
PrintToChat(target, "[SM] Админ \x03%s удалил Ваш префикс.", sAdmin);
PrintToChat(client, "[SM] Вы удалили префикс игроку \x03%s.", sTarger);
g_bIsTag[target] = false;
g_sGetTag[target][0] = '\0';
MenuDelTag(client);
DBI_UpdateInfo(target);
}
}
}
MenuConfirmTag(client)
{
new Handle:menu = CreateMenu(_MenuConfirmTag, MENU_ACTIONS_DEFAULT);
new String:buffer[256];
Format(buffer, 255, "Вы написали этот префикс:\n%10s%s\nВсе верно?\n \n", " ", buffer);
SetMenuTitle(menu, buffer);
AddMenuItem(menu, "", "Да. Продолжить", 0);
AddMenuItem(menu, "", "Нет. Написать другой", 0);
if (GetArraySize(g_arInAdvanceTag))
{
AddMenuItem(menu, "", "Нет. Выбрать из списка", 0);
}
SetMenuExitButton(menu, true);
DisplayMenu(menu, client, 0);
}
public _MenuConfirmTag(Handle:menu, MenuAction:action, client, item)
{
if (action == MenuAction:4)
{
if (item == 0)
{
MenuColorTag(client);
}
else
{
if (item == 1)
{
g_bCreateTag[client] = true;
PrintToChat(client, "[SM] Напишите в чат свой желаемый префикс");
}
else
{
if (item == 2)
{
MenuTag(client);
}
}
}
}
else
{
if (action == MenuAction:16)
{
CloseHandle(menu);
}
}
}
public Action:OnClientSayCommand(client, const String:command[], const String:sArgs[])
{
if (client && IsClientInGame(client))
{
decl String:sText[256];
strcopy(sText, 255, sArgs);
TrimString(sText);
StripQuotes(sText);
if (sArgs[1] == 64 || sArgs[1] == 47)
{
return Plugin_Continue;
}
if (g_bCreateTag[client])
{
if (strlen(sText) < 2)
{
PrintToChat(client, "[SM] Ошибка. Минимальное количество символов \x03(2)");
return Plugin_Handled;
}
strcopy(g_sBufferTag[client], 100, sText);
MenuConfirmTag(client);
g_bCreateTag[client] = false;
return Plugin_Handled;
}
if (g_bIsTag[client])
{
decl String:buffer[256], String:sName[64];
GetClientName(client, sName, 64);
new iColor = ReplaceColors(g_sGetColorTag[client]);
FormatEx(buffer, 255, "%s[%s] %s: %s", (iColor == -2) ? "" : ((iColor == -1) ? "" : "\x03"), g_sGetTag[client], sName, sText);
switch (iColor)
{
case -2, -1, 0:
{
for (new target = 1; target <= MaxClients; target++)
{
if (IsClientInGame(target) && !IsFakeClient(client))
{
PrintToChat(target, buffer);
}
}
}
case 1, 2, 3:
{
PrintSayToChatAll(buffer, iColor);
}
case 4:
{
PrintSayAll(client, buffer);
}
}
return Plugin_Handled;
}
}
return Plugin_Continue;
}
PrintSayAll(client, String:text[])
{
new Handle:h = StartMessageAll("SayText2", 0);
if (h)
{
BfWriteByte(h, client);
BfWriteByte(h, 1);
BfWriteString(h, text);
EndMessage();
}
}
PrintSayToChatAll(String:text[], iColor)
{
new iTarget = FindPlayerByTeam(iColor);
if (iTarget)
{
new Handle:h = StartMessageAll("SayText2", 0);
if (h)
{
BfWriteByte(h, iTarget);
BfWriteByte(h, 1);
BfWriteString(h, text);
EndMessage();
}
}
else
{
PrintMsgToAll(text);
}
}
PrintMsgToAll(String:text[])
{
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i))
{
new Handle:hBf = StartMessageOne("SayText2", i, 0);
if (hBf)
{
BfWriteByte(hBf, i);
BfWriteByte(hBf, 1);
BfWriteString(hBf, text);
EndMessage();
}
}
}
}
ReplaceColors(String:color[])
{
if (StrContains(color, "{GREEN}", true) != -1)
{
return -1;
}
if (StrContains(color, "{LIGHTGREEN}", true) != -1)
{
return 0;
}
if (StrContains(color, "{GRAY}", true) != -1)
{
return 1;
}
if (StrContains(color, "{RED}", true) != -1)
{
return 2;
}
if (StrContains(color, "{BLUE}", true) != -1)
{
return 3;
}
if (StrContains(color, "{TEAM}", true) != -1)
{
return 4;
}
return -2;
}
FindPlayerByTeam(iTeam)
{
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientInGame(i) && GetClientTeam(i) == iTeam)
{
return i;
}
}
return -1;
}
OnClearInfo(client)
{
g_bIsTag[client] = false;
g_iTimeTag[client] = 0;
g_sGetTag[client][0] = '\0';
strcopy(g_sGetColorTag[client], 16, "{DEFAULT}");
}
DBI_Create()
{
decl String:buffer[256];
g_hDB_TagClients = SQLite_UseDatabase("prefix", buffer, 255);
if (!g_hDB_TagClients)
{
LogError("SQLite_UseDatabase error: %s", buffer);
SetFailState("SQLite_UseDatabase error: %s", buffer);
}
SQL_LockDatabase(g_hDB_TagClients);
Format(buffer, 255, "CREATE TABLE IF NOT EXISTS %s (steam TEXT(%i), tag_name TEXT(%i), color_tag TEXT(%i), time INT);", "prefix", 64, 100, 16);
SQL_FastQuery(g_hDB_TagClients, buffer, -1);
SQL_UnlockDatabase(g_hDB_TagClients);
}
DBI_SelectInfo(client)
{
if (!IsClientInGame(client) || IsFakeClient(client))
{
return;
}
decl String:buffer[256];
Format(buffer, 255, "SELECT * FROM %s WHERE steam = '%s' LIMIT 1;", "prefix", g_AuthId_Steam2[client]);
SQL_TQuery(g_hDB_TagClients, OnSelectClient, buffer, GetClientUserId(client), DBPrio_Normal);
}
DBI_AddInfo(client)
{
if (!IsClientInGame(client) || IsFakeClient(client))
{
return;
}
decl String:buffer[256];
Format(buffer, 255, "INSERT INTO %s (steam, tag_name, color_tag, time) VALUES ('%s', '', '{DEFAULT}', 0);", "prefix", g_AuthId_Steam2[client]);
SQL_TQuery(g_hDB_TagClients, OnSQLRequest, buffer, 0, DBPrio_Normal);
decl String:Name[64];
GetClientName(client, Name, 64);
LogToFileEx("addons/sourcemod/logs/prefix.txt", "OnAddClient :: %s %s [enable='%s' | time='%i' | tag='%s' | color='%s']", Name, g_AuthId_Steam2[client], (g_bIsTag[client]) ? "true" : "false", g_iTimeTag[client], g_sGetTag[client], g_sGetColorTag[client]);
}
DBI_UpdateInfo(client)
{
if (IsClientInGame(client) && !IsFakeClient(client))
{
decl String:buffer[256];
Format(buffer, 255, "UPDATE %s SET tag_name = '%s', color_tag = '%s', time = %i WHERE steam = '%s';", "prefix", g_sGetTag[client], g_sGetColorTag[client], g_iTimeTag[client], g_AuthId_Steam2[client]);
SQL_TQuery(g_hDB_TagClients, OnSQLRequest, buffer, client, DBPrio_Normal);
decl String:Name[64];
GetClientName(client, Name, 64);
LogToFileEx("addons/sourcemod/logs/prefix.txt", "OnUpdateClient :: %s %s [enable='%s' | time='%i' | tag='%s' | color='%s']\n \n", Name, g_AuthId_Steam2[client], (g_bIsTag[client]) ? "true" : "false", g_iTimeTag[client], g_sGetTag[client], g_sGetColorTag[client]);
}
}
public OnSelectClient(Handle:owner, Handle:hndl, String:error[], any:data)
{
if (!hndl)
{
LogError("OnSelectClient error: %s", error);
return;
}
new client = GetClientOfUserId(data);
if (!client)
{
return;
}
OnClearInfo(client);
if (SQL_FetchRow(hndl))
{
if (IsClientInGame(client) && !IsFakeClient(client))
{
SQL_FetchString(hndl, 1, g_sGetTag[client], 100, _);
if (!StrEqual(g_sGetTag[client], "", true))
{
SQL_FetchString(hndl, 2, g_sGetColorTag[client], 16, _);
g_iTimeTag[client] = SQL_FetchInt(hndl, 3, _);
g_bIsTag[client] = true;
decl String:Name[64];
GetClientName(client, Name, 64);
LogToFileEx("addons/sourcemod/logs/prefix.txt", "OnSelectClient :Get Array: %s %s [enable='%s' | time='%i' | tag='%s' | color='%s']\n \n", Name, g_AuthId_Steam2[client], (g_bIsTag[client]) ? "true" : "false", g_iTimeTag[client], g_sGetTag[client], g_sGetColorTag[client]);
}
}
}
else
{
DBI_AddInfo(client);
}
}
public OnSQLRequest(Handle:owner, Handle:hndl, String:error[], any:data)
{
if (!hndl)
{
LogError("OnSQLRequest error: %s", error);
return;
}
}