Проверка наличия определённой вещи у игрока в Shop Core

Broudy Rose

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

Пример: Есть ли вещь && Включена ли она.
 

Deluks

Верховное DNO|
Сообщения
1,853
Реакции
812
Наличие проверяешь через админку магазина, а включено или нет уже глазами. =D
 

Broudy Rose

Участник
Сообщения
157
Реакции
22
Наличие проверяешь через админку магазина, а включено или нет уже глазами. =D
Есть плагины, которые следует выключать у клиента, если у него: Эта вещь есть $$ Она включена.
Использую [Shop] Core (Fork) 3.0E4.

Сообщения автоматически склеены:

На включённость тоже натив есть. Там же в файле скорее всего будет.
Спасибо за прямую ссылку, думаю разберусь
 

danil253467

💘Italo-Disco & Neon One Love💘
Сообщения
90
Реакции
52
Здравствуйте, подскажите, как проверить наличие у игрока определенной вещи в магазине, а также включена ли она.

Пример: Есть ли вещь && Включена ли она.
Думаю, что тебе нужно это
C++:
native bool Shop_IsClientHasItem(int client, ItemId item_id); // Есть ли у игрока предмет.
native bool Shop_IsClientItemToggled(int client, ItemId item_id); // Включен ли предмет
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
native bool Shop_IsClientItemToggled(int client, ItemId item_id); уже включает в себя проверку наличия у игрока предмета, так что нету смысла сначала проверять наявность и после включён ли он, если так сделать, то выйдет так что вы два раза проверяете одно и тоже. Обычного if(Shop_IsClientItemToggled(client, item_id)) хватит

 

Broudy Rose

Участник
Сообщения
157
Реакции
22
native bool Shop_IsClientItemToggled(int client, ItemId item_id); уже включает в себя проверку наличия у игрока предмета, так что нету смысла сначала проверять наявность и после включён ли он, если так сделать, то выйдет так что вы два раза проверяете одно и тоже. Обычного if(Shop_IsClientItemToggled(client, item_id)) хватит

Догадывался, спасибо вам за ответы!
Оффтоп
Сообщения автоматически склеены:

Обычного if(Shop_IsClientItemToggled(client, item_id)) хватит
Думаю, что тебе нужно это

Не совсем понимаю, как указать id вещи.
Есть, например, плагин: [Shop] Long Jump 1.5

Исходный код:
C-подобный:
#include <sourcemod>
#include <shop>

#pragma newdecls required

bool g_bHasLJ[MAXPLAYERS+1];
float g_fLastJump[MAXPLAYERS+1];

int g_iPrice,
    g_iSellPrice,
    g_iDuration;
ItemId id;
float g_fInterval,
      g_fDistance;

int VelocityOffset_0 = -1,
    VelocityOffset_1 = -1,
    BaseVelocityOffset = -1;

public Plugin myinfo =
{
    name = "[Shop] Long Jump",
    author = "R1KO",
    version = "1.5"
};

public void OnPluginStart()
{
    ConVar hCvar;

    HookConVarChange((hCvar = CreateConVar("sm_shop_longjump_price", "2000", "Стоимость покупки длинных прыжков.")), OnPriceChange);
    g_iPrice = hCvar.IntValue;
  
    HookConVarChange((hCvar = CreateConVar("sm_shop_longjump_sellprice", "0", "Стоимость продажи длинных прыжков.")), OnSellPriceChange);
    g_iSellPrice = hCvar.IntValue;
  
    HookConVarChange((hCvar = CreateConVar("sm_shop_longjump_duration", "259200", "Длительность длинных прыжков в секундах.")), OnDurationChange);
    g_iDuration = hCvar.IntValue;
  
    HookConVarChange((hCvar = CreateConVar("sm_shop_longjump_interval", "5.0", "Время между прыжками")), OnIntervalChange);
    g_fInterval = hCvar.FloatValue;
  
    HookConVarChange((hCvar = CreateConVar("sm_shop_longjump_distance", "1.05", "Усиление прыжка")), OnDistanceChange);
    g_fDistance = hCvar.FloatValue;
  
    AutoExecConfig(true, "shop_longjump", "shop");

    HookEvent("player_jump", Event_PlayerJump);

    if (Shop_IsStarted())
    {
        Shop_Started();
    }
}

public void OnMapStart()
{
    VelocityOffset_0 = GetSendPropOffset("CBasePlayer", "m_vecVelocity[0]");
    VelocityOffset_1 = GetSendPropOffset("CBasePlayer", "m_vecVelocity[1]");
    BaseVelocityOffset = GetSendPropOffset("CBasePlayer", "m_vecBaseVelocity");
}

int GetSendPropOffset(char[] sNetClass, char[] sPropertyName)
{
    int iOffset = FindSendPropInfo(sNetClass, sPropertyName);
    if (iOffset == -1) SetFailState("Fatal Error: Unable to find offset: \"%s::%s\"", sNetClass, sPropertyName);

    return iOffset;
}

public void OnPriceChange(ConVar hCvar, char[] oldValue, char[] newValue)
{
    g_iPrice = hCvar.IntValue;
    if(id != INVALID_ITEM)
    {
        Shop_SetItemPrice(id, g_iPrice);
    }
}

public void OnSellPriceChange(ConVar hCvar, char[] oldValue, char[] newValue)
{
    g_iSellPrice = hCvar.IntValue;
    if(id != INVALID_ITEM)
    {
        Shop_SetItemSellPrice(id, g_iSellPrice);
    }
}

public void OnDurationChange(ConVar hCvar, char[] oldValue, char[] newValue)
{
    g_iDuration = hCvar.IntValue;
    if(id != INVALID_ITEM)
    {
        Shop_SetItemValue(id, g_iDuration);
    }
}

public void OnIntervalChange(ConVar hCvar, char[] oldValue, char[] newValue)
{
    g_fInterval = hCvar.FloatValue;
}

public void OnDistanceChange(ConVar hCvar, char[] oldValue, char[] newValue)
{
    g_fDistance = hCvar.FloatValue;
}

public void OnPluginEnd()
{
    Shop_UnregisterMe();
}

public void Shop_Started()
{
    CategoryId category_id = Shop_RegisterCategory("ability", "Способности", "");
    if(category_id == INVALID_CATEGORY) SetFailState("Failed to register category");

    if (Shop_StartItem(category_id, "longjump"))
    {
        Shop_SetInfo("Длинные прыжки", "", g_iPrice, g_iSellPrice, Item_Togglable, g_iDuration);
        Shop_SetCallbacks(OnItemRegistered, OnLJUsed);
        Shop_EndItem();
    }
}

void OnItemRegistered(CategoryId category_id, char[] category, char[] item, ItemId item_id)
{
    id = item_id;
}

public void Shop_OnAuthorized(int iClient)
{
    g_bHasLJ[iClient] = Shop_IsClientItemToggled(iClient, id);
    g_fLastJump[iClient] = 0.0;
}

public ShopAction OnLJUsed(int iClient, CategoryId category_id, char[] category, ItemId item_id, char[] item, bool isOn, bool elapsed)
{
    if (isOn || elapsed)
    {
        g_bHasLJ[iClient] = false;
        return Shop_UseOff;
    }

    g_bHasLJ[iClient] = true;

    return Shop_UseOn;
}

public Action Event_PlayerJump(Handle hEvent, char[] name, bool dontBroadcast)
{
    int iClient = GetClientOfUserId(GetEventInt(hEvent, "userid"));
    if(g_bHasLJ[iClient])
    {
        float fGameTime;
        fGameTime = GetGameTime();
        if ((fGameTime - g_fLastJump[iClient]) > g_fInterval)
        {
            g_fLastJump[iClient] = fGameTime;
            float finalvec[3];
            finalvec[0] = GetEntDataFloat(iClient, VelocityOffset_0)*g_fDistance/2.0;
            finalvec[1] = GetEntDataFloat(iClient, VelocityOffset_1)*g_fDistance/2.0;
            finalvec[2] = 0.0;
            SetEntDataVector(iClient, BaseVelocityOffset, finalvec, true);
        }
    }
}

В нём ItemId указан как id (12 строка)
Также, не получается передать любое другое значение, кроме цифр. Передаю в таком виде:
C-подобный:
    if(Shop_IsClientItemToggled(index, ItemId:1))
        return;
(Если у человека включён item - дальнейший код не выполнять)

Как передать/узнать id вещи?
 
Последнее редактирование:

Broudy Rose

Участник
Сообщения
157
Реакции
22
Чёрт возьми, мне казалось, что узнать id предмета проще, чем есть на самом деле.
Имея 1 предмет в магазине не срабатывает ни с 0, ни с 1.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Чёрт возьми, мне казалось, что узнать id предмета проще, чем есть на самом деле.
Имея 1 предмет в магазине не срабатывает ни с 0, ни с 1.
Есть несколько способов получить ItemId:
1) Если у нас есть CategoryId и unique name предмета, то Shop-Core/items.inc at c4fad6b48d3e8801ef6864074de34bf1c77d0710 · hlmod/Shop-Core
2) Получить массив валидных ItemId и после уже найти нужный нам Shop-Core/items.inc at c4fad6b48d3e8801ef6864074de34bf1c77d0710 · hlmod/Shop-Core
 

Broudy Rose

Участник
Сообщения
157
Реакции
22
Есть несколько способов получить ItemId:
1) Если у нас есть CategoryId и unique name предмета, то Shop-Core/items.inc at c4fad6b48d3e8801ef6864074de34bf1c77d0710 · hlmod/Shop-Core
2) Получить массив валидных ItemId и после уже найти нужный нам Shop-Core/items.inc at c4fad6b48d3e8801ef6864074de34bf1c77d0710 · hlmod/Shop-Core
Почему пишет о неверном аргументе? (Вторая строка, кажется, жалуется на index, однако не вижу ошибок)
1653944977116.png

C++:
new index=GetClientOfUserId(GetEventInt(event,"userid"));
if(Shop_IsClientItemToggled(index, Shop_GetItemId("test_category", "test_item")))
    return;
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Почему пишет о неверном аргументе? (Вторая строка, кажется, жалуется на index, однако не вижу ошибок)
Посмотреть вложение 97103
C++:
new index=GetClientOfUserId(GetEventInt(event,"userid"));
if(Shop_IsClientItemToggled(index, Shop_GetItemId("test_category", "test_item")))
    return;
Первый аргумент в Shop_GetItemId смотрите, это индекс категории, а не её unique name. Вы заранее должны где-то сохранить его, что бы потом подставлять, а лучше сразу ItemId используйте заместо Shop_GetItemId (его тоже сохранить нужно будет)
 

Broudy Rose

Участник
Сообщения
157
Реакции
22
Первый аргумент в Shop_GetItemId смотрите, это индекс категории, а не её unique name. Вы заранее должны где-то сохранить его, что бы потом подставлять, а лучше сразу ItemId используйте заместо Shop_GetItemId (его тоже сохранить нужно будет)
Совсем перестал понимать, я же ведь регистрирую категорию:
C-подобный:
CategoryId category_id = Shop_RegisterCategory("test_category", "category_name", "");


    if (Shop_StartItem(category_id, "test_item_name"))
    {
        Shop_SetInfo("test_item_name", "", g_iPrice, g_iSellPrice, Item_Togglable, g_iDuration);
        Shop_SetCallbacks(OnItemRegistered, OnLJUsed);
        Shop_EndItem();
    }
А после её и указываю:
C-подобный:
new index=GetClientOfUserId(GetEventInt(event,"userid"));
if(Shop_IsClientItemToggled(index, Shop_GetItemId("test_category", "test_item")))
    return;

В противном случае получается довольно странно: нужно узнать предмет, поэтому нужен его id, который можно узнать лишь получив id категории. Как же узнать id категории?
Спасибо за помощь

upd
Открыл БД и узнал ID категории напрямую.
Беру цифру из колонки id (1) и название предмета из колонки 4 (test_item)
1653950754893.png


Ошибок нет, но и не работает
C-подобный:
    if(Shop_IsClientItemToggled(index, Shop_GetItemId(CategoryId:1, "test_item")))
        return;
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Как же узнать id категории?
При регистрации вы же получаете id (category_id), его и нужно подставлять а не строку, Shop_GetItemId(category_id, "test_item")
C-подобный:
CategoryId category_id = Shop_RegisterCategory("test_category", "category_name", "");

Индекс предмета (ItemId) можно получить в обратном вызове OnItemRegistered

В БД пишет внутренный индекс категории, он относится только к БД, в шопе CategoryId - это индекс в ArrayList, позиция, номер, при каждой загрузке шопа он может быть другим.
 
Последнее редактирование:

Broudy Rose

Участник
Сообщения
157
Реакции
22
При регистрации вы же получаете id (category_id), его и нужно подставлять а не строку, Shop_GetItemId(category_id, "test_item")
C-подобный:
CategoryId category_id = Shop_RegisterCategory("test_category", "category_name", "");

Индекс предмета (ItemId) можно получить в обратном вызове OnItemRegistered

В БД пишет внутренный индекс категории, он относится только к БД, в шопе CategoryId - это индекс в ArrayList, позиция, номер, при каждой загрузке шопа он может быть другим.
Бинго, благодарю!
Никогда так глубоко в редактирование плагинов не углублялся. Надеюсь, эта тема поможет ещё ни одному человеку.
Спасибо за уделённое время
 
Сверху Снизу