Проверка на наличие item у игрока

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Здравствуйте. Озадачился, как сделать проверку на наличие item у игрока (если это HE,FLASH,NVG...). Проблема в том, что при наличии вещи игрок через меню магазина может купить вещи. По итогу у него просто забирает указанную сумму за итем, но ничего не выдает... Как сделать саму проверку на наличие гранат я знаю, однако система магазина не совсем стандартная. Есть плагин магазина, который получает инофрмацию об айтемах, которые подгружаются плагинами отдельно (на каждый item свой плагин). Ниже код самого мазагина и итема "НЕ граната". Но по сути, мне нужно, что бы перед выдачей в через меню была проверка, есть ли у игрока НЕ граната (если это флешки, есть ли 2 флешки) и тд. Не пойму, позволяет ли данная архитектура реализовать подобное...
Плагин магазина:
Код:
#include <amxmodx>

#include <reapi>

#include <cstrike>

#include <biohazard>

#include <bioshop>

#include <engine>



#define BIOGG



#if defined BIOGG

#include <bioscheduler>

#endif



enum _:ItemData

{

    i_Name[32],

    i_Money,

    i_Team,

    i_Use,

    i_Mode,

    i_Command[16]

};



const MAXPLAYERS = 32;

const MAX_ITEMS = 100;



new g_fwSelectedItem;

new Array:g_aMenuItems, g_iMenuItemsNum;

new g_iItemUse[MAXPLAYERS + 1][MAX_ITEMS];



new g_eCurItemInfo[ItemData];

#if defined BIOGG

new g_iCurMod;

#endif



public plugin_init()

{

    register_plugin("BioShop", "1.1", "gyxoBka");

   

    RegisterHookChain(RG_RoundEnd, "RoundEnd", true);

   

    g_fwSelectedItem = CreateMultiForward("bio_selected_item", ET_STOP2, FP_CELL, FP_CELL);

   

    register_saycmd("shop", "cmdShop");



   

    register_impulse(100,     "FlashlightTurn")

}



register_saycmd(saycommand[], function[])

{

    new szTemp[64];



    formatex(szTemp, charsmax(szTemp), "say /%s", saycommand);

    register_clcmd(szTemp, function);

   

    formatex(szTemp, charsmax(szTemp), "say_team /%s", saycommand);

    register_clcmd(szTemp, function);

   

    formatex(szTemp, charsmax(szTemp), "%s", saycommand);

    register_clcmd(szTemp, function);

}



public plugin_cfg()

{

    register_dictionary("bio_items.txt");

    #if defined BIOGG

    g_iCurMod = get_cur_mod();

    #endif

}



public plugin_natives()

{

    g_aMenuItems = ArrayCreate(ItemData);

   

    register_library("bioshop");

    register_native("bio_register_item", "native_bio_register_item");

    register_native("bio_get_item", "native_bio_get_item");

}



get_item(player_id, item_index)

{

    new iMoney = cs_get_user_money(player_id);

    new iPlayerZombie = is_user_zombie(player_id);

   

    ArrayGetArray(g_aMenuItems, item_index, g_eCurItemInfo);

   

    if(g_eCurItemInfo[i_Team] ==  ZOMBIE_USE && !iPlayerZombie || iPlayerZombie && g_eCurItemInfo[i_Team] == HUMAN_USE)

        return 0;

   

    if(iMoney >= g_eCurItemInfo[i_Money])

    {

        new iRet;



        ExecuteForward(g_fwSelectedItem, iRet, player_id, item_index);



        if(iRet) return 0;



        cs_set_user_money(player_id, iMoney - g_eCurItemInfo[i_Money]);

        g_iItemUse[player_id][item_index]++;

    }

    else client_print(player_id,print_center,"Недостаточно денег!")





    return 1;

}



public native_bio_get_item (plugin, parans)

{



    enum

    {

        arg_player_id = 1,

        arg_item_index,

    };

   

    new player_id, item_index;

   

    player_id = get_param(arg_player_id);

    item_index = get_param(arg_item_index);

   

    get_item(player_id, item_index)

}



public native_bio_register_item(plugin, params)

{

    enum

    {

        arg_name = 1,

        arg_money,

        arg_team,

        arg_use,

        arg_mode,

        arg_command

    };

   

    new item_info[ItemData];

   

    get_string(arg_name, item_info[i_Name], charsmax(item_info[i_Name]));

    item_info[i_Money] = get_param(arg_money);

    item_info[i_Team] = get_param(arg_team);

    item_info[i_Use] = get_param(arg_use);

    item_info[i_Mode] = get_param(arg_mode);

    get_string(arg_command, item_info[i_Command], charsmax(item_info[i_Name]));

   

    ArrayPushArray(g_aMenuItems, item_info);

    g_iMenuItemsNum++;



    return g_iMenuItemsNum;

}



public RoundEnd(WinStatus:iStatus, ScenarioEventEndRound:iEvent, Float:tmDelay)

{

    for(new id = 1; id <= MAXPLAYERS; id++)

        arrayset(g_iItemUse[id], 0, MAX_ITEMS);

}



public FlashlightTurn(id)

{

    cmdShop(id)

    return PLUGIN_HANDLED_MAIN

}





public cmdShop(id)

{

    if(!is_user_connected(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR) return PLUGIN_CONTINUE;

   

    new szMenuName[128];

    new szTemp[80], szInfo[10];

   

    new iMoney = cs_get_user_money(id);

    formatex(szMenuName, charsmax(szMenuName), "%L", LANG_SERVER, "ITEM_MENU_HEADER");

   

    new iMenu = menu_create(szMenuName, "BioShopMenuHandler");

    new iCallBack = menu_makecallback("BioShopCallBackMenu");

    new iPlayerZombie = is_user_zombie(id);

   

    for(new iMenuitem; iMenuitem < g_iMenuItemsNum; iMenuitem++)

    {

        ArrayGetArray(g_aMenuItems, iMenuitem, g_eCurItemInfo);

       

        if(g_eCurItemInfo[i_Team] ==  ZOMBIE_USE && !iPlayerZombie || iPlayerZombie && g_eCurItemInfo[i_Team] == HUMAN_USE)

            continue;

#if defined BIOGG          

        if(g_eCurItemInfo[i_Mode] != ALL_USE)

        {

            if(g_eCurItemInfo[i_Mode] != g_iCurMod)

                continue;

        }

#endif  

        if(g_eCurItemInfo[i_Money] > 0)

            formatex(szTemp, charsmax(szTemp), "%L \w[%s%d $\w]", LANG_SERVER, g_eCurItemInfo[i_Name], iMoney >= g_eCurItemInfo[i_Money] ? "\y" : "\r", g_eCurItemInfo[i_Money]);

        else

            formatex(szTemp, charsmax(szTemp), "%L", LANG_SERVER, g_eCurItemInfo[i_Name]);

           

        formatex(szInfo, charsmax(szInfo), "%d", iMenuitem);

        menu_additem(iMenu, szTemp, szInfo, .callback = iCallBack);

    }



    menu_setprop(iMenu, MPROP_NUMBER_COLOR, "\y");

    menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL);

    formatex(szTemp, charsmax(szTemp), "%L", LANG_SERVER, "MENU_BACK");

    menu_setprop(iMenu, MPROP_BACKNAME, szTemp);

    formatex(szTemp, charsmax(szTemp), "%L", LANG_SERVER, "MENU_NEXT");

    menu_setprop(iMenu, MPROP_NEXTNAME, szTemp);

    formatex(szTemp, charsmax(szTemp), "%L", LANG_SERVER, "MENU_EXIT");

    menu_setprop(iMenu, MPROP_EXITNAME, szTemp);



    menu_display(id, iMenu);

   

    return PLUGIN_HANDLED;

}



public BioShopCallBackMenu(id, iMenu, iItem)

{

    new szInfo[10], szName[64], iAccess, iCallback;

    menu_item_getinfo(iMenu, iItem, iAccess, szInfo, charsmax(szInfo), szName, charsmax(szName), iCallback);

   

    new iMenuItem = str_to_num(szInfo);

    ArrayGetArray(g_aMenuItems, iMenuItem, g_eCurItemInfo);



    if(g_eCurItemInfo[i_Use] && g_iItemUse[id][iMenuItem] >= g_eCurItemInfo[i_Use]) return ITEM_DISABLED;



    return ITEM_IGNORE;

}



public BioShopMenuHandler(id, iMenu, iItem)

{

    if(iItem == MENU_EXIT)

    {

        menu_destroy(iMenu)

        return PLUGIN_HANDLED;

    }



    new szInfo[10], szName[64], iAccess, iCallback;

    menu_item_getinfo(iMenu, iItem, iAccess, szInfo, charsmax(szInfo), szName, charsmax(szName), iCallback);

    new iMenuItem = str_to_num(szInfo) +1;

    if(!get_item(id, iMenuItem)) cmdShop(id)

    return PLUGIN_HANDLED;
}
Плагин гранаты:
Код:
#include <amxmodx>
#include <reapi>
#include <bioshop>

new const PLUGIN[] = "BioShop HE";
new const VERSION[] = "1.0";
new const AUTHOR[] = "gyxoBka";

new const g_szCfgSection[] = "HEGRENADE";
new const g_szMainDir[] = "ReBioHazard";
new const g_szCfgFile[] = "bio_shop.ini";

new g_iMoney, g_iClassUse, g_iUse, g_iModeUse;

new g_iHeItem;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
   
    g_iHeItem = bio_register_item("BIO_HE", g_iMoney, g_iClassUse, g_iUse, g_iModeUse);
   
    register_clcmd("say /he", "cmdBuy");
    register_clcmd("say_team /he", "cmdBuy");
}

public cmdBuy(id)
{
//    if(!user_has_weapon(id, CSW_HEGRENADE))
    bio_get_item(id, g_iHeItem);
   
    return PLUGIN_HANDLED;
}

public plugin_precache()
{
    ReadCfg();
}

public bio_selected_item(id, iItem)
{
    if(iItem != g_iHeItem) return BIO_IGNORED;
   
    if(!is_user_alive(id))
    {
        return BIO_SUPERCEDE;
    }
   
    rg_give_item(id, "weapon_hegrenade");
   
    return BIO_IGNORED;
}

ReadCfg()
{
    new szKey[128], szValue[512];
    new szFile[250], szConfigDir[64], szTemp[512];
   
    get_localinfo("amxx_configsdir", szConfigDir, charsmax(szConfigDir));
    formatex(szFile, charsmax(szFile), "%s/%s", szConfigDir, g_szMainDir);
   
    MakeDir(szFile);
   
    formatex(szTemp, charsmax(szTemp), "/%s", g_szCfgFile);
    add(szFile, charsmax(szFile), szTemp);
   
    new fHandle = fopen(szFile, "rt");
   
    new bool:bValidSection;
   
    if(fHandle)
    {
        while(!feof(fHandle))
        {
            fgets(fHandle, szTemp, charsmax(szTemp));
            trim(szTemp);
           
            if(szTemp[0] == '[')
            {
                if(contain(szTemp, g_szCfgSection) != -1)
                    bValidSection = true
                else
                    bValidSection = false;
            }
           
            if(!bValidSection || !szTemp[0] || szTemp[0] == ';' || szTemp[0] == '/') continue;
           
            strtok(szTemp, szKey, charsmax(szKey), szValue, charsmax(szValue), '=');
            trim(szKey); trim(szValue);
           
            if(equal(szKey, "cost"))
            {
                g_iMoney = str_to_num(szValue);
            }
            else if(equal(szKey, "class_use"))
            {
                g_iClassUse = str_to_num(szValue);
            }
            else if(equal(szKey, "round_use"))
            {
                g_iUse = str_to_num(szValue);
            }
            else if(equal(szKey, "mode_use"))
            {
                g_iModeUse = str_to_num(szValue);
            }
        }
        fclose(fHandle);
    }
}

stock MakeDir(const szDirName[], bool:bPrint = true)
{
    if(dir_exists(szDirName))
        return

    if(bPrint) server_print("[BioShop] Directory ^"%s^" not exist, will be created automatically.", szDirName)
   
    if(mkdir(szDirName))
        server_print("[BioShop] Failed to create directory ^"%s^"", szDirName)
}
 

Vaqtincha

aggressive
Разработчик
Скриптер
Регистрация
28 Янв 2018
Сообщения
960
Симпатии
682
Пол
Мужской
Надо бросать на мусор этот гоуноплагин
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Vaqtincha, не первый раз слышу это :D но в нем есть весь необходимый мне функционал... он регулирует активность итемов в зависимости от режима игры + имеет нужные мне настройки...
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Я так понимаю, что нормального решения этого вопроса нет и впихонуть все проверки все в одно условие перед выдачей не получиться
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
, ты имеешь ввиду, прописать проверку в функциях bio_selected_item всех итемов?[DOUBLEPOST=1579034278][/DOUBLEPOST]
вроде помогло, спасибо огромное.

Просьба не закрывать пока тему, потестирую и отпишу
 

rxki

Пользователь
Регистрация
5 Янв 2019
Сообщения
208
Симпатии
5
Пол
Мужской
Вроде все работает, благодарю душевно, Карандашик!
Единственное, не знаю, как сделать проверку на наличие двух флеш гранат... user_has_weapon(id, CSW_FLASHBANG) не дает дает купить гранату, если есть хотя бы одна.[DOUBLEPOST=1579040886][/DOUBLEPOST], а что на скрине обведено не так?) указал провекру следующим образом и покупка при наличии стала невозможной:

Код:
public bio_selected_item(id, iItem)
{
    if(iItem != g_iFlashItem) return BIO_IGNORED;
    
    if(!is_user_alive(id) || user_has_weapon(id, CSW_HEGRANADE))
    {
        return BIO_SUPERCEDE;
    }
    
    give_item(id, "weapon_flashbang");
    
    return BIO_IGNORED;
}
 
Сверху Снизу