Как сделать команду одноразовой

Ganter1234

Участник
Сообщения
1,149
Реакции
667
У меня есть плагин который выдает 5к кредов при прописывании команды !start

Код:
#include <sourcemod>
#include <shop>
#pragma semicolon 1

public Plugin myinfo = {
    name        = "Start promocode",
    version     = "1.0"
};

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", start);
}

public Action start(int client, int args)
{
    Shop_GiveClientCredits(client, 5000, CREDITS_BY_NATIVE);
    PrintToChat(client, "Вы успешно получили 5000 серебра, удачной игры!")
}
Как мне сделать чтобы команда была одноразовой?
 
Решение
Тогда так
C++:
#include <sourcemod>
#include <clientprefs>
#include <shop>

#pragma semicolon 1

Handle g_hCookie;
bool g_bStatus[MAXPLAYERS+1];
bool g_bLoad[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", StartCommand_Callback);

    g_hCookie = RegClientCookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);

    for(int i = MaxClients + 1; --i;)
    {
        if(IsClientInGame(i) && AreClientCookiesCached(i))
        {
            OnClientCookiesCached(i);
        }
    }
}

public void OnClientCookiesCached(int iClient)
{
    if(IsFakeClient(iClient) == false)
    {
        static char szValue[2];
        GetClientCookie(iClient, g_hCookie, szValue, sizeof(szValue))...

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
Даже если она не успеет прогрузиться, у игрока останется g_bStatus[iClient] = false с предыдущей.
Это нужно настолько ювелирно нажать «подключиться к серверу», учитывая время подключения на пк и время прогрузки баз на сервере до десятых долей секунды, чтоб заабузить так, что по сути кажется невозможным)
а флуд тебе на што?
Сообщения автоматически склеены:

предлагаю по умолчанию сделать true, раз на то пошло
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
ТС дали уйму вариантов, если кто-то хочет модифицировать и развить может прикрутить базу, сделать ядром и выложить в ресурсы)
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Тогда так
C++:
#include <sourcemod>
#include <clientprefs>
#include <shop>

#pragma semicolon 1

Handle g_hCookie;
bool g_bStatus[MAXPLAYERS+1];
bool g_bLoad[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", StartCommand_Callback);

    g_hCookie = RegClientCookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);

    for(int i = MaxClients + 1; --i;)
    {
        if(IsClientInGame(i) && AreClientCookiesCached(i))
        {
            OnClientCookiesCached(i);
        }
    }
}

public void OnClientCookiesCached(int iClient)
{
    if(IsFakeClient(iClient) == false)
    {
        static char szValue[2];
        GetClientCookie(iClient, g_hCookie, szValue, sizeof(szValue));

        g_bLoad[iClient] = true;
        g_bStatus[iClient] = szValue[0] ? view_as<bool>(StringToInt(szValue)) : false;
    }
}

public void OnClientDisconnect(int iClient)
{
    g_bLoad[iClient] = false;
    g_bStatus[iClient] = false;
}

Action StartCommand_Callback(int iClient, int iArgs)
{
    if(g_bLoad[iClient])
    {
        if(g_bStatus[iClient] == false)
        {
            g_bStatus[iClient] = true;
            SetClientCookie(iClient, g_hCookie, "1");

            Shop_GiveClientCredits(iClient, 5000, CREDITS_BY_NATIVE);

            PrintToChat(iClient, "Вы успешно получили 5000 серебра, удачной игры!");
        }
        else
        {
            PrintToChat(iClient, "Вы уже использовали эту команду ранее.");
        }
    }
    else
    {
        PrintToChat(iClient, "Данные загружаются, ожидайте.");
    }

    return Plugin_Handled;
}
 
Решение

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Короче кидаю свою вариацию кода, и пожалуй хватит)

bruh:
#include <sourcemod>
#include <clientprefs>
#include <shop>

#pragma semicolon 1

Cookie
    g_cCookie;
bool
    g_bStatus[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", StartCommand_Callback);

    g_cCookie = new Cookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);

    for(int i = 1; i < MaxClients; i++) {
        if(IsClientInGame(i) && AreClientCookiesCached(i)) {
            OnClientCookiesCached(i);
        }
    }
}

public void OnClientCookiesCached(int iClient)
{
    if(!IsFakeClient(iClient)) {
        static char szValue[2];
        g_cCookie.Get(iClient, szValue, sizeof(szValue));
        g_bStatus[iClient] = szValue[0] ? view_as<bool>(StringToInt(szValue)) : false;
    }
}

Action StartCommand_Callback(int iClient, int iArgs)
{
    if(!AreClientCookiesCached(iClient))
    {
        if(!g_bStatus[iClient])
        {
            g_bStatus[iClient] = true;
            g_cCookie.Set(iClient, "1");
            Shop_GiveClientCredits(iClient, 5000, IGNORE_FORWARD_HOOK);
            PrintToChat(iClient, "Вы успешно получили 5000 серебра, удачной игры!");
        }
        else PrintToChat(iClient, "Вы уже использовали эту команду ранее.");
    }
    else PrintToChat(iClient, "Данные еще загружаются, подождите :)");

    return Plugin_Handled;
}
 
Сверху Снизу