Всем привет!
Возникла проблемка с таким вот кодом:
Пример предмета:
В чем суть. Сделал регистрацию предметов через hunt_register_extra_item (То есть при вызове функции меню hunt_buy_menu(id) будет выдан список зарегистрированных предметов (Механика extraitems)). Далее пытался сделать механику инвентаря. При открытии меню есть предметы, где в конце указывается кол-во:
![1691675861062.png 1691675861062.png](https://dev-cs.ru/data/attachments/38/38788-472079c5416dd5797610d86d8ae834d1.jpg)
Если кол-во больше 0, то пункт активный и игрок может взять предмет. После взятия, кол-во предметов в "инвентаре" должно уменьшится на 1 (по задумке) и уже при следующем вызове меню кол-во определенного предмета должно быть нач. знач - 1 (Например игрок взял хп --> 7-1 = 6 будет при обновлении меню).
И вот с какой проблемой столкнулся. Значение кол-во вызывается всегда фиксировано не зависимо будет ли взят предмет или добавлен. Можете подсказать каким образом можно сделать кол-во динамическим значением? И чтобы в основном плагине учитывалось изменение переменной. Например зарегистрировали плагин на хп, в нем я создал подключение к бд и оттуда беру значение о кол-ве предмета игрока. Далее в плагин хп регистрируется с тем кол-вом, которое выцепил из бд (В бд например было 7 шт, соответственно натив зарегает предмет с кол-вом 7). Далее игрок берет предмет и срабатывает событие взятие предмета hunt_extra_item_selected(player, itemid) в нем уже выдается сам предмет и уменьшается кол-во на 1. Далее когда игрок снова откроет меню кол-во должно быть 6...
Мб есть примеры реализации похожих плагинов?
Спасибо!
Возникла проблемка с таким вот кодом:
Код:
enum {
HUNT_ITEMS_SELECTED_PRE,
HUNT_ITEMS_SELECTED_POST,
HUNT_MAX_FORWARDS_NUM
}
enum _:items {
i_name[MAX_TEXT_BUFFER_SIZE],
i_description[MAX_TEXT_BUFFER_SIZE],
i_count
}
new g_hunt_forwards[HUNT_MAX_FORWARDS_NUM], g_hunt_forward_return, Array:hunt_items_database, hunt_extra_items[items], g_registered_items_count, g_itemid, g_AdditionalMenuText[32]
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_dictionary("zp_addon_vip_hunt.txt")
register_dictionary("zpsp_vip.txt")
register_clcmd("menu_vip_hunt", "premenu_hunt", ADMIN_LEVEL_B)
register_clcmd("menu_vip_hunt_test", "hunt_buy_menu", ADMIN_LEVEL_B)
g_hunt_forwards[HUNT_ITEMS_SELECTED_PRE] = CreateMultiForward("hunt_extra_item_selected_pre", ET_CONTINUE, FP_CELL, FP_CELL)
g_hunt_forwards[HUNT_ITEMS_SELECTED_POST] = CreateMultiForward("hunt_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
}
public plugin_natives() {
register_native("hunt_register_extra_item", "native_hunt_register_extra_item")
register_native("hunt_item_textadd", "native_hunt_extra_item_textadd")
register_native("hunt_get_extra_item_name", "native_hunt_get_item_name")
register_native("hunt_get_extra_item_count", "native_hunt_get_extra_item_count")
}
public native_hunt_register_extra_item(plugin_id, param_nums) {
if(!hunt_items_database)
hunt_items_database = ArrayCreate(items);
get_string(1, hunt_extra_items[i_name], MAX_TEXT_BUFFER_SIZE-1);
get_string(2, hunt_extra_items[i_description], MAX_TEXT_BUFFER_SIZE-1);
hunt_extra_items[i_count] = get_param(3);
ArrayPushArray(hunt_items_database, hunt_extra_items)
g_registered_items_count++
return (g_registered_items_count-1)
}
public native_hunt_get_item_name(plugin_id, param_nums) {
if (param_nums != 3)
return -1;
static itemid; itemid = get_param(1)
ArrayGetArray(hunt_items_database, itemid-1, hunt_extra_items)
set_string(2, hunt_extra_items[i_name], get_param(3))
return 1;
}
public native_hunt_get_extra_item_count(plugin_id, num_params) {
return hunt_extra_items[i_count]
}
public native_hunt_extra_item_textadd(plugin_id, num_params) {
static text[32]; get_string(1, text, charsmax(text))
strcat(g_AdditionalMenuText, text, charsmax(g_AdditionalMenuText))
}
//public zp_extra_item_selected(id, itemid) if(itemid == g_itemid) vip_menu(id);
public plugin_end() if(hunt_items_database) ArrayDestroy(hunt_items_database);
/*===============================================================================
---> Hunt Buy Menu items
=================================================================================*/
public hunt_buy_menu(id) {
if(!is_user_alive(id))
return
if(!g_registered_items_count || zp_get_human_special_class(id) || zp_get_zombie_special_class(id)) {
client_print_color(id, print_team_default, "%s %L", CHAT_PREFIX, id, "EXTRAOFF")
return;
}
new holder[150], menu, i, check
formatex(holder, charsmax(holder), "%s Hunt Buy Menu", MENU_TAG)
menu = menu_create(holder, "hunt_buy_menu_handler")
for(i=0; i < g_registered_items_count; i++) {
g_AdditionalMenuText[0] = 0
ArrayGetArray(hunt_items_database, i, hunt_extra_items)
ExecuteForward(g_hunt_forwards[HUNT_ITEMS_SELECTED_PRE], g_hunt_forward_return, id, i)
if (g_hunt_forward_return >= ZP_PLUGIN_SUPERCEDE)
continue;
if(g_hunt_forward_return >= ZP_PLUGIN_HANDLED || hunt_extra_items[i_count] < 1) {
formatex(holder, charsmax(holder), "\d%s [%s] [%d] %s", hunt_extra_items[i_name], hunt_extra_items[i_description], hunt_extra_items[i_count], g_AdditionalMenuText)
menu_additem(menu, holder, fmt("%d", i), (1<<30))
}
else {
formatex(holder, charsmax(holder), "\w%s \r[%s] \y[%d] %s", hunt_extra_items[i_name], hunt_extra_items[i_description], hunt_extra_items[i_count], g_AdditionalMenuText)
menu_additem(menu, holder, fmt("%d", i), 0)
}
check++
}
if(check == 0) {
client_print_color(id, print_team_default, "%s %L", CHAT_PREFIX, id, "EXTRAOFF")
return;
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL)
menu_setprop(menu, MPROP_NEXTNAME, "Дальше")
menu_setprop(menu, MPROP_BACKNAME, "Назад")
menu_setprop(menu, MPROP_EXITNAME, "Выход")
menu_display(id, menu, 0)
}
public hunt_buy_menu_handler(id, menu, item) {
if(item == MENU_EXIT || zp_get_human_special_class(id) || zp_get_zombie_special_class(id)) {
menu_destroy(menu)
return PLUGIN_HANDLED;
}
new data[6], iName[64], item_id, aaccess, callback
menu_item_getinfo(menu, item, aaccess, data, charsmax(data), iName, charsmax(iName), callback)
item_id = str_to_num(data)
ExecuteForward(g_hunt_forwards[HUNT_ITEMS_SELECTED_PRE], g_hunt_forward_return, id, item_id)
if (g_hunt_forward_return >= ZP_PLUGIN_HANDLED)
return PLUGIN_HANDLED;
ArrayGetArray(hunt_items_database, item_id, hunt_extra_items)
if(hunt_extra_items[i_count] > 0) {
ExecuteForward(g_hunt_forwards[HUNT_ITEMS_SELECTED_POST], g_hunt_forward_return, id, item_id)
}
else client_print_color(id, print_team_default, "%s %L", CHAT_PREFIX, id, "PLAYER_NOTENOUGH_COUNT")
menu_destroy(menu)
return PLUGIN_HANDLED
}
Пример предмета:
Код:
#include <amxmodx>
#include <fakemeta>
#include <authorization_system>
#include <zpsp_hunt>
/*================================================================================
[Plugin Customization]
=================================================================================*/
new const g_item_name[] = { "\r[\yБроня \r+100]" }
new const g_item_description[] = { "До 1000 брони" }
new g_item_count[64]
new const g_sound_buyarmor[] = { "items/tr_kevlar.wav" }
const g_armor_amount = 100
/*============================================================================*/
// Item IDs
new g_itemid_humanarmor
public plugin_precache()
{
precache_sound(g_sound_buyarmor)
}
public plugin_init()
{
register_plugin("[ZP] Armor", "1.0", "Robert7791")
register_clcmd("testik", "testik", ADMIN_LEVEL_B)
g_itemid_humanarmor = hunt_register_extra_item(g_item_name, g_item_description, 0)
}
// Human buys item
public hunt_extra_item_selected(player, itemid)
{
if (itemid == g_itemid_humanarmor)
{
g_item_count[player]--
client_print_color(player, print_team_default, "^4[Hunt] ^1Купил предмет)")
}
}
public hunt_extra_item_selected_pre(player, itemid)
{
g_item_count[player]--
}
public testik(id)
{
g_item_count[id] = 4
}
![1691675861062.png 1691675861062.png](https://dev-cs.ru/data/attachments/38/38788-472079c5416dd5797610d86d8ae834d1.jpg)
Если кол-во больше 0, то пункт активный и игрок может взять предмет. После взятия, кол-во предметов в "инвентаре" должно уменьшится на 1 (по задумке) и уже при следующем вызове меню кол-во определенного предмета должно быть нач. знач - 1 (Например игрок взял хп --> 7-1 = 6 будет при обновлении меню).
И вот с какой проблемой столкнулся. Значение кол-во вызывается всегда фиксировано не зависимо будет ли взят предмет или добавлен. Можете подсказать каким образом можно сделать кол-во динамическим значением? И чтобы в основном плагине учитывалось изменение переменной. Например зарегистрировали плагин на хп, в нем я создал подключение к бд и оттуда беру значение о кол-ве предмета игрока. Далее в плагин хп регистрируется с тем кол-вом, которое выцепил из бд (В бд например было 7 шт, соответственно натив зарегает предмет с кол-вом 7). Далее игрок берет предмет и срабатывает событие взятие предмета hunt_extra_item_selected(player, itemid) в нем уже выдается сам предмет и уменьшается кол-во на 1. Далее когда игрок снова откроет меню кол-во должно быть 6...
Мб есть примеры реализации похожих плагинов?
Спасибо!