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