#include <vip_core>
#include <clientprefs>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo =
{
name = "[VIP] Additional",
author = "Drumanid",
version = "1.0",
url = "Discord: Drumanid#9108"
};
enum
{
REMOVE, FREEZE, GIVE
};
static const char g_sFeature[][] =
{
"remove_status", "freeze_status", "give_status"
};
Handle g_hCookie;
char g_sCode[MAXPLAYERS +1][8], g_sData[MAXPLAYERS +1][128];
int g_iUse[MAXPLAYERS +1], g_iTarget[MAXPLAYERS +1];
bool g_bFeature[MAXPLAYERS +1][3];
public void OnPluginStart()
{
g_hCookie = RegClientCookie("VIP_Additional", "Дополнительные возможности вип", CookieAccess_Private);
RegConsoleCmd("sm_avip", AdditionalVipCmd);
if(VIP_IsVIPLoaded()) VIP_OnVIPLoaded();
}
public int VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_sFeature[REMOVE], BOOL, HIDE);
VIP_RegisterFeature(g_sFeature[FREEZE], BOOL, HIDE);
VIP_RegisterFeature(g_sFeature[GIVE], BOOL, HIDE);
}
public void OnPluginEnd()
{
if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
{
VIP_UnregisterFeature(g_sFeature[REMOVE]);
VIP_UnregisterFeature(g_sFeature[FREEZE]);
VIP_UnregisterFeature(g_sFeature[GIVE]);
}
}
public int VIP_OnVIPClientLoaded(int iClient)
{
if(g_sData[iClient][0])
{
g_bFeature[iClient][FREEZE] = VIP_GetClientFeatureBool(iClient, g_sFeature[FREEZE]);
CreateTimer(0.0, TimerRemoveVip, GetClientUserId(iClient));
}
else
{
g_bFeature[iClient][REMOVE] = VIP_GetClientFeatureBool(iClient, g_sFeature[REMOVE]);
g_bFeature[iClient][FREEZE] = VIP_GetClientFeatureBool(iClient, g_sFeature[FREEZE]);
g_bFeature[iClient][GIVE] = VIP_GetClientFeatureBool(iClient, g_sFeature[GIVE]);
}
}
public Action TimerRemoveVip(Handle hTimer, any iClient)
{
iClient = GetClientOfUserId(iClient);
if(iClient > 0 && IsClientInGame(iClient)) VIP_RemoveClientVIP(iClient, false, false);
return Plugin_Stop;
}
public void OnClientCookiesCached(int iClient)
{
char sBuffer[128];
GetClientCookie(iClient, g_hCookie, sBuffer, sizeof(sBuffer));
if(sBuffer[0]) g_sData[iClient] = sBuffer;
else g_sData[iClient][0] = 0;
}
public Action AdditionalVipCmd(int iClient, int iArgs)
{
if(iClient && VIP_IsClientVIP(iClient) || g_sData[iClient][0]) AdditionalVipMenu(iClient);
else PrintToChat(iClient, "Вы не являетесь вип игроком!");
return Plugin_Handled;
}
void AdditionalVipMenu(int iClient)
{
Menu hMenu = new Menu(AdditionalVipMenuItems);
hMenu.ExitButton = true;
hMenu.SetTitle("Дополнительное VIP\nЧто делать с вип статусом?\n ");
if(g_bFeature[iClient][FREEZE])
{
if(g_sData[iClient][0])
{
hMenu.AddItem("0", "Восстановить");
hMenu.Display(iClient, 0);
return;
}
else hMenu.AddItem("0", "Заморозить(остановить время)");
}
if(g_bFeature[iClient][REMOVE]) hMenu.AddItem("1", "Снять");
if(g_bFeature[iClient][GIVE]) hMenu.AddItem("2", "Передать игроку");
hMenu.Display(iClient, 0);
}
public int AdditionalVipMenuItems(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
char sItem[4];
hMenu.GetItem(iItem, sItem, sizeof(sItem));
switch(StringToInt(sItem))
{
case 0:
{
if(g_sData[iClient][0])
{
Database hDatabase = view_as<Database>(VIP_GetDatabase());
if(hDatabase != null)
{
char sQuery[256], sAuth[32];
GetClientAuthId(iClient, AuthId_Engine, sAuth, sizeof(sAuth), true);
FormatEx(sQuery, sizeof(sQuery), "SELECT `auth` FROM `vip_users` WHERE `auth` = '%s';", sAuth);
hDatabase.Query(SQL_Callback_CheckVip, sQuery, GetClientUserId(iClient));
}
}
else
{
g_iUse[iClient] = FREEZE;
UseCode(iClient, "Вы действительно хотите заморозить вип статус?");
}
}
case 1:
{
g_iUse[iClient] = REMOVE;
UseCode(iClient, "Вы действительно хотите снять вип статус?");
}
case 2:
{
Menu hMenu2 = new Menu(PlayerListMenuItems);
hMenu2.ExitButton = true;
hMenu2.SetTitle("Выберите игрока которому хотите передать вип статус\n ");
char sId[4], sName[32]; int iCount;
for(int i = 1; i <= MaxClients; i++)
{
if(IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i) && !VIP_IsClientVIP(i))
{
IntToString(GetClientUserId(i), sId, sizeof(sId));
GetClientName(i, sName, sizeof(sName));
hMenu2.AddItem(sId, sName);
iCount++;
}
}
if(iCount == 0) PrintToChat(iClient, "На данный момент нет подходящих игроков!");
hMenu2.Display(iClient, 0);
}
}
}
}
}
public int PlayerListMenuItems(Menu hMenu, MenuAction action, int iClient, int iItem)
{
switch(action)
{
case MenuAction_End: delete hMenu;
case MenuAction_Select:
{
char sId[4];
hMenu.GetItem(iItem, sId, sizeof(sId));
g_iTarget[iClient] = GetClientOfUserId(StringToInt(sId));
g_iUse[iClient] = GIVE;
UseCode(iClient, "Вы действительно хотите отдать вип статус?");
}
}
}
public void SQL_Callback_CheckVip(Database hDatabase, DBResultSet hResult, const char[] sError, any iUserID)
{
if(sError[0])
{
LogError("SQL_Callback_CheckVip: %s", sError);
CloseHandle(hDatabase);
return;
}
int iClient = GetClientOfUserId(iUserID);
if(iClient)
{
if(hResult.FetchRow())
{
char sExplodeString[2][64];
ExplodeString(g_sData[iClient], "__", sExplodeString, sizeof(sExplodeString), sizeof(sExplodeString[]));
if(VIP_IsValidVIPGroup(sExplodeString[0]))
{
VIP_RemoveClientVIP(iClient, true, false);
VIP_SetClientVIP(iClient, StringToInt(sExplodeString[1]), _, sExplodeString[0], true);
g_sData[iClient][0] = 0; SetClientCookie(iClient, g_hCookie, "");
}
else
{
PrintToChat(iClient, "К сожалению \x04%s\x01 больше не существует", sExplodeString[0]);
PrintToChat(iClient, "Обратитесь к гл.администратору за помощью!");
}
}
else
{
g_sData[iClient][0] = 0; SetClientCookie(iClient, g_hCookie, "");
PrintToChat(iClient, "Произошла ошибка, обратитесь к гл.администратору!");
}
}
CloseHandle(hDatabase);
}
public Action OnClientSayCommand(int iClient, const char[] sCommand, const char[] sArgs)
{
if(g_sCode[iClient][0])
{
if(StrContains(g_sCode[iClient], sArgs, true) == 0)
{
char sGroup[64], sTime[32];
VIP_GetClientVIPGroup(iClient, sGroup, sizeof(sGroup));
int iTime;
if((iTime = VIP_GetClientAccessTime(iClient)) > 0)
{
iTime -= GetTime();
IntToString(iTime, sTime, sizeof(sTime));
}
else sTime = "неиссякаемое";
switch(g_iUse[iClient])
{
case REMOVE:
{
VIP_RemoveClientVIP(iClient, true, false);
PrintToChat(iClient, "Вы сняли с себя вип статус!");
VIP_LogMessage("%L | группа: %s | оставшиеся время(unix): %s | снял с себя вип статус", iClient, sGroup, sTime);
}
case FREEZE:
{
char sBuffer[128];
FormatEx(sBuffer, sizeof(sBuffer), "%s__%s", sGroup, sTime);
g_sData[iClient] = sBuffer;
SetClientCookie(iClient, g_hCookie, sBuffer);
VIP_RemoveClientVIP(iClient, false, false);
//VIP_RemoveClientVIP(iClient, true, false);
PrintToChat(iClient, "Вы заморозили себе вип статус!");
VIP_LogMessage("%L | группа: %s | оставшиеся время(unix): %s | заморозил себе вип статус", iClient, sGroup, sTime);
}
case GIVE:
{
if(IsClientInGame(g_iTarget[iClient]) && IsPlayerAlive(g_iTarget[iClient]))
{
VIP_RemoveClientVIP(iClient, true, false);
PrintToChat(iClient, "Вы отдали свой вип статус %N", g_iTarget[iClient]);
VIP_LogMessage("%L | группа: %s | оставшиеся время(unix): %s | отдал свой вип статус игроку %L", iClient, sGroup, sTime, g_iTarget[iClient]);
VIP_SetClientVIP(g_iTarget[iClient], iTime, _, sGroup, true);
PrintToChat(g_iTarget[iClient], "Вы получили вип статус от %N", iClient);
}
else PrintToChat(iClient, "Данного игрока нет на сервере!");
}
}
}
else PrintToChat(iClient, "Вы ввели неправильное значение... Отказано!");
g_sCode[iClient][0] = 0;
return Plugin_Handled;
}
return Plugin_Continue;
}
public void OnClientDisconnect(int iClient)
{
g_sCode[iClient][0] = 0;
g_sData[iClient][0] = 0;
for(int i; i < 3; i++) g_bFeature[iClient][i] = false;
}
void UseCode(int iClient, char[] sMessage)
{
FormatEx(g_sCode[iClient], sizeof(g_sCode[]), "%i%i%i%i", GetRandomInt(0, 9), GetRandomInt(0, 9), GetRandomInt(0, 9), GetRandomInt(0, 9));
PrintToChat(iClient, sMessage);
PrintToChat(iClient, "Введи в чат \x04%s\x01, чтобы подтвердить свое действие!", g_sCode[iClient]);
}