Механика инвентаря с динамический форвардом?

Сообщения
20
Реакции
2
Всем привет!
Возникла проблемка с таким вот кодом:
Код:
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
}
В чем суть. Сделал регистрацию предметов через hunt_register_extra_item (То есть при вызове функции меню hunt_buy_menu(id) будет выдан список зарегистрированных предметов (Механика extraitems)). Далее пытался сделать механику инвентаря. При открытии меню есть предметы, где в конце указывается кол-во:
1691675861062.png

Если кол-во больше 0, то пункт активный и игрок может взять предмет. После взятия, кол-во предметов в "инвентаре" должно уменьшится на 1 (по задумке) и уже при следующем вызове меню кол-во определенного предмета должно быть нач. знач - 1 (Например игрок взял хп --> 7-1 = 6 будет при обновлении меню).
И вот с какой проблемой столкнулся. Значение кол-во вызывается всегда фиксировано не зависимо будет ли взят предмет или добавлен. Можете подсказать каким образом можно сделать кол-во динамическим значением? И чтобы в основном плагине учитывалось изменение переменной. Например зарегистрировали плагин на хп, в нем я создал подключение к бд и оттуда беру значение о кол-ве предмета игрока. Далее в плагин хп регистрируется с тем кол-вом, которое выцепил из бд (В бд например было 7 шт, соответственно натив зарегает предмет с кол-вом 7). Далее игрок берет предмет и срабатывает событие взятие предмета hunt_extra_item_selected(player, itemid) в нем уже выдается сам предмет и уменьшается кол-во на 1. Далее когда игрок снова откроет меню кол-во должно быть 6...

Мб есть примеры реализации похожих плагинов?

Спасибо!
 
  • Нравится
Реакции: ssx
Сообщения
3,381
Реакции
1,480
Помог
124 раз(а)
Есть прекрасная система ShopAPI от Kaido Ren, там можно создавать предметы как просто, так и те, которые будут зачисляться в инвентарь игроку.
 
Сообщения
20
Реакции
11
Самое простое в лоб, нативом затолкать в регистратор количество предметов, форвардом сообщать что предмет куплен. Соответственно в обоих плагинах количество --.
Или при открытии меню регистратора нативами забирать количество предметов из главного плагина, форвардом также сообщать что куплено, количество в основном плагине будет лежать.
 
Сообщения
707
Реакции
476
Помог
10 раз(а)
Количество через hunt_item_textadd передавай в hunt_extra_item_selected_pre
 
Сообщения
526
Реакции
461
Предупреждения
16
Помог
9 раз(а)

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу