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

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))...

Young <

Now, finally free
Сообщения
1,263
Реакции
505
@Ganter1234, вечно одноразовой? (тут понятия расходятся, может быть на одноразовой на карту, на день и тд)
 

Young <

Now, finally free
Сообщения
1,263
Реакции
505
Как вариант, ввести базу использований.

Также отмечу, что у шопа есть квар - стартовое кол-во кредитов, т.е. при первом подключении выдает заданное кол-во кредитов.
 

Ganter1234

Участник
Сообщения
1,149
Реакции
667
Как вариант, ввести базу использований.

Также отмечу, что у шопа есть квар - стартовое кол-во кредитов, т.е. при первом подключении выдает заданное кол-во кредитов.
Я знаю, это типо промокода, если зайдет игрокам думал делать еще такие штуки (в базах вообще не шарю поэтому я врядли это напишу)
 

pur4s

Участник
Сообщения
367
Реакции
92
У меня есть плагин который выдает 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 серебра, удачной игры!")
}
Как мне сделать чтобы команда была одноразовой?
Получилось сделать одноразовый промокод?
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@pur4s,
C-подобный:
#include <sourcemod>
#include <shop>
#pragma semicolon 1

Handle g_hCookie;

bool g_bStatus[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", start);
    g_hCookie = RegClientCookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);
}

public Action start(int client, int args)
{
    if(!g_bStatus[client]) {
        Shop_GiveClientCredits(client, 5000, CREDITS_BY_NATIVE);
        PrintToChat(client, "Вы успешно получили 5000 серебра, удачной игры!")
        SetClientCookie(client, g_hCookie, "1")
        //        g_bStatus[client] = false; optional
    }
    else {
        PrintToChat(client, "Вы уже использовали эту команду ранее.")
    }
}

public void OnClientCookiesCached(int client)
{
    char szValue[4];
    GetClientCookie(client, g_hCookie, szValue, sizeof(szValue));
    if(szValue[0]) {
        g_bStatus[client] = view_as<bool>(StringToInt(szValue));
    }
    else {
        g_bStatus[client] = false;
    }
}

наверно так? не тестил
 
Последнее редактирование:

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
@pur4s,
C-подобный:
#include <sourcemod>
#include <shop>
#pragma semicolon 1

Handle g_hCookie;

bool g_bStatus[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", start);
    g_hCookie = RegClientCookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);
}

public Action start(int client, int args)
{
    if(!g_bStatus[client]) {
        Shop_GiveClientCredits(client, 5000, CREDITS_BY_NATIVE);
        PrintToChat(client, "Вы успешно получили 5000 серебра, удачной игры!")
        SetClientCookie(client, g_hCookie, "true")
        //        g_bStatus[client] = false; optional
    }
    else {
        PrintToChat(client, "Вы уже использовали эту команду ранее.")
    }
}

public void OnClientCookiesCached(int client)
{
    char szValue[4];
    GetClientCookie(client, g_hCookie, szValue, sizeof(szValue));
    if(szValue[0]) {
        g_bStatus[client] = view_as<bool>(StringToInt(szValue));
    }
    else {
        g_bStatus[client] = false;
    }
}

наверно так? не тестил
1 вместо true
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
@pur4s,
C-подобный:
#include <sourcemod>
#include <shop>
#pragma semicolon 1

Handle g_hCookie;

bool g_bStatus[MAXPLAYERS+1];

public void OnPluginStart()
{
    RegConsoleCmd("sm_start", start);
    g_hCookie = RegClientCookie("bonus_code_cookie", "bonus_code_cookie_description", CookieAccess_Private);
}

public Action start(int client, int args)
{
    if(!g_bStatus[client]) {
        Shop_GiveClientCredits(client, 5000, CREDITS_BY_NATIVE);
        PrintToChat(client, "Вы успешно получили 5000 серебра, удачной игры!")
        SetClientCookie(client, g_hCookie, "1")
        //        g_bStatus[client] = false; optional
    }
    else {
        PrintToChat(client, "Вы уже использовали эту команду ранее.")
    }
}

public void OnClientCookiesCached(int client)
{
    char szValue[4];
    GetClientCookie(client, g_hCookie, szValue, sizeof(szValue));
    if(szValue[0]) {
        g_bStatus[client] = view_as<bool>(StringToInt(szValue));
    }
    else {
        g_bStatus[client] = false;
    }
}

наверно так? не тестил
При компиляции выдает ошибку.
shop_5000.sp
C:\Users\ROOT\Desktop\shop_5000.sp(12) : error 017: undefined symbol "RegClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(20) : error 001: expected token: ";", but found "-identifier-"
C:\Users\ROOT\Desktop\shop_5000.sp(20) : error 017: undefined symbol "SetClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(25) : error 001: expected token: ";", but found "}"
C:\Users\ROOT\Desktop\shop_5000.sp(31) : error 017: undefined symbol "GetClientCookie"
 

Nekro

Терра инкогнита
Сообщения
4,023
Реакции
2,260
При компиляции выдает ошибку.
shop_5000.sp
C:\Users\ROOT\Desktop\shop_5000.sp(12) : error 017: undefined symbol "RegClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(20) : error 001: expected token: ";", but found "-identifier-"
C:\Users\ROOT\Desktop\shop_5000.sp(20) : error 017: undefined symbol "SetClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(25) : error 001: expected token: ";", but found "}"
C:\Users\ROOT\Desktop\shop_5000.sp(31) : error 017: undefined symbol "GetClientCookie"
 

Вложения

  • Screenshot_2022-12-09-09-56-09-066-edit_com.android.chrome.jpg
    Screenshot_2022-12-09-09-56-09-066-edit_com.android.chrome.jpg
    145 КБ · Просмотры: 29

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Это я делал конечно.
Ну ошибка осталось такая.

shop_5000.sp
C:\Users\ROOT\Desktop\shop_5000.sp(12) : error 017: undefined symbol "RegClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(20) : error 017: undefined symbol "SetClientCookie"
C:\Users\ROOT\Desktop\shop_5000.sp(31) : error 017: undefined symbol "GetClientCookie"
Сообщения автоматически склеены:

А если добавить
#include <clientprefs>

То все нормально,ну опять же команду можно вводить хоть сколько раз
 

Faya™

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

#pragma semicolon 1

Handle g_hCookie;
bool g_bStatus[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_bStatus[iClient] = szValue[0] ? view_as<bool>(StringToInt(szValue)) : false;
    }
}

Action StartCommand_Callback(int iClient, int iArgs)
{
    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, "Вы уже использовали эту команду ранее.");
    }

    return Plugin_Handled;
}
 

DarkerZ

Участник
Сообщения
394
Реакции
175
Всë бы хорошо, да вот только иногда бывает такое что куки долго подгружаются и клиент успевает набрать команду и тут результат неизвестен...
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@DarkerZ, Нус можно сделать проверку до загрузки кук, объявить false до загрузки кук, только зачем?
Куки грузятся когда игрок еще не подключен к серверу вроде как на каком точно этапе не помню уже.
 

Nekro

Терра инкогнита
Сообщения
4,023
Реакции
2,260
@DarkerZ, Нус можно сделать проверку до загрузки кук, объявить false до загрузки кук, только зачем?
Куки грузятся когда игрок еще не подключен к серверу вроде как на каком точно этапе не помню уже.
Возможно имелось ввиду с новой картой не успеет прогрузиться база куков и игрок успеет понажимать заветную кнопку
 

Сергей68

Неуместный юмор
Сообщения
420
Реакции
377
@DarkerZ,
C-подобный:
#include <sourcemod>
#include <clientprefs>
#include <shop>

#pragma semicolon 1

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

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)) {
        static char szValue[2];
        GetClientCookie(iClient, g_hCookie, szValue, sizeof(szValue));

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

Action StartCommand_Callback(int iClient, int iArgs)
{
    if(!g_bStatus[iClient][0] && g_bStatus[iClient][1]) {
        g_bStatus[iClient][0] = true;
        SetClientCookie(iClient, g_hCookie, "1");
        Shop_GiveClientCredits(iClient, 5000, CREDITS_BY_NATIVE);
        PrintToChat(iClient, "Вы успешно получили 5000 серебра, удачной игры!");
    } else {
        PrintToChat(iClient, "Вы уже использовали эту команду ранее.");
    }

    return Plugin_Handled;
}
 

Ice_Sochi

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