[VIP] RemoveVip [Удалено]

Статус
В этой теме нельзя размещать новые ответы.

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Пользователь Drumanid разместил новый ресурс:

[VIP] RemoveVip - Позволяет снять вип статус без участия гл.администратора

Позволяет снять вип статус без участия гл.администратора
Лог сообщение игрока снявшего с себя статус выводится в logs/VIP_Logs.log

C-подобный:
Drumanid<12><STEAM_1:0:1825...><> | группа: VIP | оставшиеся время(unix): 2591988 | снял с себя вип статус

Узнать больше об этом ресурсе...
 

Felya

Array-based enum structs will be removed in 1.11
Сообщения
208
Реакции
83
Зачем он нужен?
 

kleuser

Участник
Сообщения
1,838
Реакции
732
Куда полезней было бы сделать заморозку вип статуса. Если к примеру человеку нужно уехать на долгое время, он просто замораживает на определенное время випку (в заморозке вип отключается), и по приезду разморозил. Вот это было бы годно.
 

wayLANder

Где AlmazON?
Сообщения
1,742
Реакции
577
Согласен. В шопе есть такая настройка, тут бы тоже пригодилось.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Если плагин вам не нужен, это не значит что другим он тоже не нужен.

Пояснение за чем он был сделан...
Если у игрока есть вип статус, активировать 'новый' он не сможет.
Например через ключ, надо снимать вип статус, а как его снять? Попросить того кто может это сделать.

Биспалезныйплагын! :biggrin:

Что касается фриза, можно сделать, почему бы и нет.. Мне это интересно.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #8
@Drumanid, активировать новый, может быть, и не сможет, а продлить старый сможет. Лично у меня, по крайней мере, это так и работает.
P.S. Но я не говорю, что он бесполезный. :D
 

MaZa

Участник
Сообщения
1,732
Реакции
980
Если плагин вам не нужен, это не значит что другим он тоже не нужен.

Пояснение за чем он был сделан...
Если у игрока есть вип статус, активировать 'новый' он не сможет.
Например через ключ, надо снимать вип статус, а как его снять? Попросить того кто может это сделать.

Биспалезныйплагын! :biggrin:

Что касается фриза, можно сделать, почему бы и нет.. Мне это интересно.
Го FreezeVIP плагин,годно.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Реализация конечно так себе... Костыли! (бета, возможно обновляться не будет)
@R1KO посмотри. Не публикую как ресурс.

Команда вызова меню: !avip

PHP:
#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]);
}

В groups.ini к определенной группе, разрешить:
C-подобный:
"remove_status" "1" // снять вип статус
"freeze_status" "1" // заморозить время
"give_status" "1" // отдать вип статус другому игроку

Возможность отдать вип статус другому игроку еще не до конца продумана, грубо говоря - без ограничений.
 

Вложения

  • VIP_Additional.smx
    10.3 КБ · Просмотры: 5
  • VIP_Additional.sp
    9.5 КБ · Просмотры: 12
Последнее редактирование:

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
может надо было сделать в меню?
Если попросят закинуть меню в меню, сделаю, не долго.
Меня интересует в целом подход к твоей системе, допускаемо? Или можно сделать лучше? Если да, то как.
 

kleuser

Участник
Сообщения
1,838
Реакции
732
Если попросят закинуть меню в меню, сделаю, не долго.
сделай пожалуйста в меню.

И если возможно, дабы не смешивать функционал, что бы как-то отделить пункты от основных модулей. К примеру что бы этот пункт был всегда на первом месте, после него пробел(пустой пунтк), и дальше уже идут остальные настройки вип.

Так же для заморозки неплохо было бы сделать время на которое человек мог заморозить например: 1 месяц, 2 месяца, 3, полгода, если человек не разморозит в этот промежуток, таймер вип снова бы возобновлялся. Это нужно для во избежания "засорения" базы, ну типо челик заморозил вип, и пропал с концами, акк потерял, vac получил или еще чего, а вип останется висеть.
 
Последнее редактирование:

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Спасибо за новый плагин.Кому-то он точно пригодится.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Так же для заморозки неплохо было бы сделать время на которое человек мог заморозить например: 1 месяц, 2 месяца, 3, полгода, если человек не разморозит в этот промежуток, таймер вип снова бы возобновлялся. Это нужно для во избежания "засорения" базы, ну типо челик заморозил вип, и пропал с концами, акк потерял, vac получил или еще чего, а вип останется висеть.
Это не ко мне, обращайся в dev-source.ru. Отдельную базу пилить под данный модуль не буду.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Этот ресурс был удалён и более недоступен для скачивания.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу