Массив текста Extra Items [ZP 5.0]

Сообщения
418
Реакции
-7
Короче, пытался я увеличить массив менюхи самой (static menu[128] на static menu[512]) да не помогло, текст названий всё равно не влазит...

Вот скриншот:1680669425040.png
 
Сообщения
3,593
Реакции
1,577
Помог
141 раз(а)
Значит не то увеличиваешь
 
Сообщения
418
Реакции
-7
Nordic Warrior,

C++:
/*================================================================================
    
    --------------------------
    -*- [ZP] Items Manager -*-
    --------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <amx_settings_api>
#include <zp50_colorchat>
#include <zp50_core_const>
#include <zp50_items_const>

// Extra Items file
new const ZP_EXTRAITEMS_FILE[] = "zp_extraitems.ini"

// CS Player PData Offsets (win32)
const OFFSET_CSMENUCODE = 205

#define MAXPLAYERS 32

// For item list menu handlers
#define MENU_PAGE_ITEMS g_menu_data[id]
new g_menu_data[MAXPLAYERS+1]

enum _:TOTAL_FORWARDS
{
    FW_ITEM_SELECT_PRE = 0,
    FW_ITEM_SELECT_POST
}
new g_Forwards[TOTAL_FORWARDS]
new g_ForwardResult

// Items data
new Array:g_ItemRealName
new Array:g_ItemName
new Array:g_ItemCost
new g_ItemCount
new g_AdditionalMenuText[32]

public plugin_init()
{
    register_plugin("[ZP] Items Manager", ZP_VERSION_STRING, "ZP Dev Team")
    
    register_clcmd("say /items", "clcmd_items")
    register_clcmd("say items", "clcmd_items")
    
    g_Forwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("zp_fw_items_select_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
    g_Forwards[FW_ITEM_SELECT_POST] = CreateMultiForward("zp_fw_items_select_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
}

public plugin_natives()
{
    register_library("zp50_items")
    register_native("zp_items_register", "native_items_register")
    register_native("zp_items_get_id", "native_items_get_id")
    register_native("zp_items_get_name", "native_items_get_name")
    register_native("zp_items_get_real_name", "native_items_get_real_name")
    register_native("zp_items_get_cost", "native_items_get_cost")
    register_native("zp_items_show_menu", "native_items_show_menu")
    register_native("zp_items_force_buy", "native_items_force_buy")
    register_native("zp_items_menu_text_add", "native_items_menu_text_add")
    
    // Initialize dynamic arrays
    g_ItemRealName = ArrayCreate(32, 1)
    g_ItemName = ArrayCreate(32, 1)
    g_ItemCost = ArrayCreate(1, 1)
}

public native_items_register(plugin_id, num_params)
{
    new name[32], cost = get_param(2)
    get_string(1, name, charsmax(name))
    
    if (strlen(name) < 1)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Can't register item with an empty name")
        return ZP_INVALID_ITEM;
    }
    
    new index, item_name[32]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(name, item_name))
        {
            log_error(AMX_ERR_NATIVE, "[ZP] Item already registered (%s)", name)
            return ZP_INVALID_ITEM;
        }
    }
    
    // Load settings from extra items file
    new real_name[32]
    copy(real_name, charsmax(real_name), name)
    ArrayPushString(g_ItemRealName, real_name)
    
    // Name
    if (!amx_load_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name, charsmax(name)))
        amx_save_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name)
    ArrayPushString(g_ItemName, name)
    
    // Cost
    if (!amx_load_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost))
        amx_save_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost)
    ArrayPushCell(g_ItemCost, cost)
    
    g_ItemCount++
    return g_ItemCount - 1;
}

public native_items_get_id(plugin_id, num_params)
{
    new real_name[32]
    get_string(1, real_name, charsmax(real_name))
    
    // Loop through every item
    new index, item_name[32]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(real_name, item_name))
            return index;
    }
    
    return ZP_INVALID_ITEM;
}

public native_items_get_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new name[32]
    ArrayGetString(g_ItemName, item_id, name, charsmax(name))
    
    new len = get_param(3)
    set_string(2, name, len)
    return true;
}

public native_items_get_real_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new real_name[32]
    ArrayGetString(g_ItemRealName, item_id, real_name, charsmax(real_name))
    
    new len = get_param(3)
    set_string(2, real_name, len)
    return true;
}

public native_items_get_cost(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return -1;
    }
    
    return ArrayGetCell(g_ItemCost, item_id);
}

public native_items_show_menu(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    clcmd_items(id)
    return true;
}

public native_items_force_buy(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    new item_id = get_param(2)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new ignorecost = get_param(3)
    
    buy_item(id, item_id, ignorecost)
    return true;
}

public native_items_menu_text_add(plugin_id, num_params)
{
    static text[32]
    get_string(1, text, charsmax(text))
    format(g_AdditionalMenuText, charsmax(g_AdditionalMenuText), "%s%s", g_AdditionalMenuText, text)
}

public client_disconnect(id)
{
    // Reset remembered menu pages
    MENU_PAGE_ITEMS = 0
}

public clcmd_items(id)
{
    // Player dead
    if (!is_user_alive(id))
        return;
    
    show_items_menu(id)
}

// Items Menu
show_items_menu(id)
{
    static menu[128], name[32], cost, transkey[64]
    new menuid, index, itemdata[2]
    
    // Title
    formatex(menu, charsmax(menu), "%L:\r", id, "MENU_EXTRABUY")
    menuid = menu_create(menu, "menu_extraitems")
    
    // Item List
    for (index = 0; index < g_ItemCount; index++)
    {
        // Additional text to display
        g_AdditionalMenuText[0] = 0
        
        // Execute item select attempt forward
        ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, index, 0)
        
        // Show item to player?
        if (g_ForwardResult >= ZP_ITEM_DONT_SHOW)
            continue;
        
        // Add Item Name and Cost
        ArrayGetString(g_ItemName, index, name, charsmax(name))
        cost = ArrayGetCell(g_ItemCost, index)
        
        // ML support for item name
        formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
        if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
        
        // Item available to player?
        if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
            formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_AdditionalMenuText)
        else
            formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_AdditionalMenuText)
        
        itemdata[0] = index
        itemdata[1] = 0
        menu_additem(menuid, menu, itemdata)
    }
    
    // No items to display?
    if (menu_items(menuid) <= 0)
    {
        zp_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
        menu_destroy(menuid)
        return;
    }
    
    // Back - Next - Exit
    formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
    menu_setprop(menuid, MPROP_BACKNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
    menu_setprop(menuid, MPROP_NEXTNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
    menu_setprop(menuid, MPROP_EXITNAME, menu)
    
    // If remembered page is greater than number of pages, clamp down the value
    MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
    
    // Fix for AMXX custom menus
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    menu_display(id, menuid, MENU_PAGE_ITEMS)
}

// Items Menu
public menu_extraitems(id, menuid, item)
{
    // Menu was closed
    if (item == MENU_EXIT)
    {
        MENU_PAGE_ITEMS = 0
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Remember items menu page
    MENU_PAGE_ITEMS = item / 7
    
    // Dead players are not allowed to buy items
    if (!is_user_alive(id))
    {
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Retrieve item id
    new itemdata[2], dummy, itemid
    menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
    itemid = itemdata[0]
    
    // Attempt to buy the item
    buy_item(id, itemid)
    menu_destroy(menuid)
    return PLUGIN_HANDLED;
}

// Buy Item
buy_item(id, itemid, ignorecost = 0)
{
    // Execute item select attempt forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, itemid, ignorecost)
    
    // Item available to player?
    if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
        return;
    
    // Execute item selected forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_POST], g_ForwardResult, id, itemid, ignorecost)
}
5 Апр 2023
new name и new real_name пробовал, бестолку..
 
Сообщения
1,073
Реакции
227
Предупреждения
9
Помог
6 раз(а)
RedGamer,
C++:
show_items_menu(id)
{
    static menu[512], name[32], cost, transkey[64]
    new menuid, index, itemdata[2]
    
    // Title
    formatex(menu, charsmax(menu), "%L:\r", id, "MENU_EXTRABUY")
    menuid = menu_create(menu, "menu_extraitems")
    
    // Item List
    for (index = 0; index < g_ItemCount; index++)
    {
        // Additional text to display
        g_AdditionalMenuText[0] = 0
        
        // Execute item select attempt forward
        ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, index, 0)
        
        // Show item to player?
        if (g_ForwardResult >= ZP_ITEM_DONT_SHOW)
            continue;
        
        // Add Item Name and Cost
        ArrayGetString(g_ItemName, index, name, charsmax(name))
        cost = ArrayGetCell(g_ItemCost, index)
        
        // ML support for item name
        formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
        if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
        
        // Item available to player?
        if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
            formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_AdditionalMenuText)
        else
            formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_AdditionalMenuText)
        
        itemdata[0] = index
        itemdata[1] = 0
        menu_additem(menuid, menu, itemdata)
    }
    
    // No items to display?
    if (menu_items(menuid) <= 0)
    {
        zp_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
        menu_destroy(menuid)
        return;
    }
    
    // Back - Next - Exit
    formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
    menu_setprop(menuid, MPROP_BACKNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
    menu_setprop(menuid, MPROP_NEXTNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
    menu_setprop(menuid, MPROP_EXITNAME, menu)
    
    // If remembered page is greater than number of pages, clamp down the value
    MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
    
    // Fix for AMXX custom menus
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    menu_display(id, menuid, MENU_PAGE_ITEMS)
}
 
Сообщения
1,073
Реакции
227
Предупреждения
9
Помог
6 раз(а)
Сообщения
1,073
Реакции
227
Предупреждения
9
Помог
6 раз(а)
RedGamer, а зачем тебе такой объём на 1 предмет?
 
Сообщения
418
Реакции
-7
BiZaJe, тоже верно.. а если не меняется, то может в zp_extraitems.ini слететь пункт NAME ?
 
Сообщения
1,073
Реакции
227
Предупреждения
9
Помог
6 раз(а)
RedGamer, удали чтоб пересоздался ini
 
Сообщения
3,593
Реакции
1,577
Помог
141 раз(а)
С ZP не работал, но попробуй увеличить так:
Diff:
/*================================================================================
    
    --------------------------
    -*- [ZP] Items Manager -*-
    --------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <amx_settings_api>
#include <zp50_colorchat>
#include <zp50_core_const>
#include <zp50_items_const>

// Extra Items file
new const ZP_EXTRAITEMS_FILE[] = "zp_extraitems.ini"

// CS Player PData Offsets (win32)
const OFFSET_CSMENUCODE = 205

#define MAXPLAYERS 32

// For item list menu handlers
#define MENU_PAGE_ITEMS g_menu_data[id]
new g_menu_data[MAXPLAYERS+1]

enum _:TOTAL_FORWARDS
{
    FW_ITEM_SELECT_PRE = 0,
    FW_ITEM_SELECT_POST
}
new g_Forwards[TOTAL_FORWARDS]
new g_ForwardResult

// Items data
new Array:g_ItemRealName
new Array:g_ItemName
new Array:g_ItemCost
new g_ItemCount
new g_AdditionalMenuText[32]

public plugin_init()
{
    register_plugin("[ZP] Items Manager", ZP_VERSION_STRING, "ZP Dev Team")
    
    register_clcmd("say /items", "clcmd_items")
    register_clcmd("say items", "clcmd_items")
    
    g_Forwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("zp_fw_items_select_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
    g_Forwards[FW_ITEM_SELECT_POST] = CreateMultiForward("zp_fw_items_select_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
}

public plugin_natives()
{
    register_library("zp50_items")
    register_native("zp_items_register", "native_items_register")
    register_native("zp_items_get_id", "native_items_get_id")
    register_native("zp_items_get_name", "native_items_get_name")
    register_native("zp_items_get_real_name", "native_items_get_real_name")
    register_native("zp_items_get_cost", "native_items_get_cost")
    register_native("zp_items_show_menu", "native_items_show_menu")
    register_native("zp_items_force_buy", "native_items_force_buy")
    register_native("zp_items_menu_text_add", "native_items_menu_text_add")
    
    // Initialize dynamic arrays
-   g_ItemRealName = ArrayCreate(32, 1)
+   g_ItemRealName = ArrayCreate(64, 1)
-   g_ItemName = ArrayCreate(32, 1)
+   g_ItemName = ArrayCreate(64, 1)
    g_ItemCost = ArrayCreate(1, 1)
}

public native_items_register(plugin_id, num_params)
{
-   new name[32], cost = get_param(2)
+   new name[64], cost = get_param(2)
    get_string(1, name, charsmax(name))
    
    if (strlen(name) < 1)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Can't register item with an empty name")
        return ZP_INVALID_ITEM;
    }
    
-   new index, item_name[32]
+   new index, item_name[64]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(name, item_name))
        {
            log_error(AMX_ERR_NATIVE, "[ZP] Item already registered (%s)", name)
            return ZP_INVALID_ITEM;
        }
    }
    
    // Load settings from extra items file
-   new real_name[32]
+   new real_name[64]
    copy(real_name, charsmax(real_name), name)
    ArrayPushString(g_ItemRealName, real_name)
    
    // Name
    if (!amx_load_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name, charsmax(name)))
        amx_save_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name)
    ArrayPushString(g_ItemName, name)
    
    // Cost
    if (!amx_load_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost))
        amx_save_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost)
    ArrayPushCell(g_ItemCost, cost)
    
    g_ItemCount++
    return g_ItemCount - 1;
}

public native_items_get_id(plugin_id, num_params)
{
-   new real_name[32]
+   new real_name[64]
    get_string(1, real_name, charsmax(real_name))
    
    // Loop through every item
-   new index, item_name[32]
+   new index, item_name[64]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(real_name, item_name))
            return index;
    }
    
    return ZP_INVALID_ITEM;
}

public native_items_get_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
-   new name[32]
+   new name[64]
    ArrayGetString(g_ItemName, item_id, name, charsmax(name))
    
    new len = get_param(3)
    set_string(2, name, len)
    return true;
}

public native_items_get_real_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
-   new real_name[32]
+   new real_name[64]
    ArrayGetString(g_ItemRealName, item_id, real_name, charsmax(real_name))
    
    new len = get_param(3)
    set_string(2, real_name, len)
    return true;
}

public native_items_get_cost(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return -1;
    }
    
    return ArrayGetCell(g_ItemCost, item_id);
}

public native_items_show_menu(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    clcmd_items(id)
    return true;
}

public native_items_force_buy(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    new item_id = get_param(2)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new ignorecost = get_param(3)
    
    buy_item(id, item_id, ignorecost)
    return true;
}

public native_items_menu_text_add(plugin_id, num_params)
{
    static text[32]
    get_string(1, text, charsmax(text))
    format(g_AdditionalMenuText, charsmax(g_AdditionalMenuText), "%s%s", g_AdditionalMenuText, text)
}

public client_disconnect(id)
{
    // Reset remembered menu pages
    MENU_PAGE_ITEMS = 0
}

public clcmd_items(id)
{
    // Player dead
    if (!is_user_alive(id))
        return;
    
    show_items_menu(id)
}

// Items Menu
show_items_menu(id)
{
-   static menu[128], name[32], cost, transkey[64]
+   static menu[128], name[64], cost, transkey[64]
    new menuid, index, itemdata[2]
    
    // Title
    formatex(menu, charsmax(menu), "%L:\r", id, "MENU_EXTRABUY")
    menuid = menu_create(menu, "menu_extraitems")
    
    // Item List
    for (index = 0; index < g_ItemCount; index++)
    {
        // Additional text to display
        g_AdditionalMenuText[0] = 0
        
        // Execute item select attempt forward
        ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, index, 0)
        
        // Show item to player?
        if (g_ForwardResult >= ZP_ITEM_DONT_SHOW)
            continue;
        
        // Add Item Name and Cost
        ArrayGetString(g_ItemName, index, name, charsmax(name))
        cost = ArrayGetCell(g_ItemCost, index)
        
        // ML support for item name
        formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
        if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
        
        // Item available to player?
        if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
            formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_AdditionalMenuText)
        else
            formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_AdditionalMenuText)
        
        itemdata[0] = index
        itemdata[1] = 0
        menu_additem(menuid, menu, itemdata)
    }
    
    // No items to display?
    if (menu_items(menuid) <= 0)
    {
        zp_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
        menu_destroy(menuid)
        return;
    }
    
    // Back - Next - Exit
    formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
    menu_setprop(menuid, MPROP_BACKNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
    menu_setprop(menuid, MPROP_NEXTNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
    menu_setprop(menuid, MPROP_EXITNAME, menu)
    
    // If remembered page is greater than number of pages, clamp down the value
    MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
    
    // Fix for AMXX custom menus
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    menu_display(id, menuid, MENU_PAGE_ITEMS)
}

// Items Menu
public menu_extraitems(id, menuid, item)
{
    // Menu was closed
    if (item == MENU_EXIT)
    {
        MENU_PAGE_ITEMS = 0
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Remember items menu page
    MENU_PAGE_ITEMS = item / 7
    
    // Dead players are not allowed to buy items
    if (!is_user_alive(id))
    {
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Retrieve item id
    new itemdata[2], dummy, itemid
    menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
    itemid = itemdata[0]
    
    // Attempt to buy the item
    buy_item(id, itemid)
    menu_destroy(menuid)
    return PLUGIN_HANDLED;
}

// Buy Item
buy_item(id, itemid, ignorecost = 0)
{
    // Execute item select attempt forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, itemid, ignorecost)
    
    // Item available to player?
    if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
        return;
    
    // Execute item selected forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_POST], g_ForwardResult, id, itemid, ignorecost)
}
 
Сообщения
78
Реакции
83
Помог
7 раз(а)
Вы используете массивы длинной строки в 32 (это 32 символа)
Русские буквы занимают 2х размер, длинна 32 - это 16 символов

Код:
/*================================================================================
    
    --------------------------
    -*- [ZP] Items Manager -*-
    --------------------------
    
    This plugin is part of Zombie Plague Mod and is distributed under the
    terms of the GNU General Public License. Check ZP_ReadMe.txt for details.
    
================================================================================*/

#include <amxmodx>
#include <fakemeta>
#include <amx_settings_api>
#include <zp50_colorchat>
#include <zp50_core_const>
#include <zp50_items_const>

// Extra Items file
new const ZP_EXTRAITEMS_FILE[] = "zp_extraitems.ini"

// CS Player PData Offsets (win32)
const OFFSET_CSMENUCODE = 205

#define MAXPLAYERS 32
#define MAX_PATCH_LINE    64

// For item list menu handlers
#define MENU_PAGE_ITEMS g_menu_data[id]
new g_menu_data[MAXPLAYERS+1]

enum _:TOTAL_FORWARDS
{
    FW_ITEM_SELECT_PRE = 0,
    FW_ITEM_SELECT_POST
}
new g_Forwards[TOTAL_FORWARDS]
new g_ForwardResult

// Items data
new Array:g_ItemRealName
new Array:g_ItemName
new Array:g_ItemCost
new g_ItemCount
new g_AdditionalMenuText[32]

public plugin_init()
{
    register_plugin("[ZP] Items Manager", ZP_VERSION_STRING, "ZP Dev Team")
    
    register_clcmd("say /items", "clcmd_items")
    register_clcmd("say items", "clcmd_items")
    
    g_Forwards[FW_ITEM_SELECT_PRE] = CreateMultiForward("zp_fw_items_select_pre", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
    g_Forwards[FW_ITEM_SELECT_POST] = CreateMultiForward("zp_fw_items_select_post", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL)
}

public plugin_natives()
{
    register_library("zp50_items")
    register_native("zp_items_register", "native_items_register")
    register_native("zp_items_get_id", "native_items_get_id")
    register_native("zp_items_get_name", "native_items_get_name")
    register_native("zp_items_get_real_name", "native_items_get_real_name")
    register_native("zp_items_get_cost", "native_items_get_cost")
    register_native("zp_items_show_menu", "native_items_show_menu")
    register_native("zp_items_force_buy", "native_items_force_buy")
    register_native("zp_items_menu_text_add", "native_items_menu_text_add")
    
    // Initialize dynamic arrays
    g_ItemRealName = ArrayCreate(MAX_PATCH_LINE, 1)
    g_ItemName = ArrayCreate(MAX_PATCH_LINE, 1)
    g_ItemCost = ArrayCreate(1, 1)
}

public native_items_register(plugin_id, num_params)
{
    new name[MAX_PATCH_LINE], cost = get_param(2)
    get_string(1, name, charsmax(name))
    
    if (strlen(name) < 1)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Can't register item with an empty name")
        return ZP_INVALID_ITEM;
    }
    
    new index, item_name[MAX_PATCH_LINE]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(name, item_name))
        {
            log_error(AMX_ERR_NATIVE, "[ZP] Item already registered (%s)", name)
            return ZP_INVALID_ITEM;
        }
    }
    
    // Load settings from extra items file
    new real_name[MAX_PATCH_LINE]
    copy(real_name, charsmax(real_name), name)
    ArrayPushString(g_ItemRealName, real_name)
    
    // Name
    if (!amx_load_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name, charsmax(name)))
        amx_save_setting_string(ZP_EXTRAITEMS_FILE, real_name, "NAME", name)
    ArrayPushString(g_ItemName, name)
    
    // Cost
    if (!amx_load_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost))
        amx_save_setting_int(ZP_EXTRAITEMS_FILE, real_name, "COST", cost)
    ArrayPushCell(g_ItemCost, cost)
    
    g_ItemCount++
    return g_ItemCount - 1;
}

public native_items_get_id(plugin_id, num_params)
{
    new real_name[MAX_PATCH_LINE]
    get_string(1, real_name, charsmax(real_name))
    
    // Loop through every item
    new index, item_name[MAX_PATCH_LINE]
    for (index = 0; index < g_ItemCount; index++)
    {
        ArrayGetString(g_ItemRealName, index, item_name, charsmax(item_name))
        if (equali(real_name, item_name))
            return index;
    }
    
    return ZP_INVALID_ITEM;
}

public native_items_get_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new name[MAX_PATCH_LINE]
    ArrayGetString(g_ItemName, item_id, name, charsmax(name))
    
    new len = get_param(3)
    set_string(2, name, len)
    return true;
}

public native_items_get_real_name(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new real_name[MAX_PATCH_LINE]
    ArrayGetString(g_ItemRealName, item_id, real_name, charsmax(real_name))
    
    new len = get_param(3)
    set_string(2, real_name, len)
    return true;
}

public native_items_get_cost(plugin_id, num_params)
{
    new item_id = get_param(1)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return -1;
    }
    
    return ArrayGetCell(g_ItemCost, item_id);
}

public native_items_show_menu(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    clcmd_items(id)
    return true;
}

public native_items_force_buy(plugin_id, num_params)
{
    new id = get_param(1)
    
    if (!is_user_connected(id))
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
        return false;
    }
    
    new item_id = get_param(2)
    
    if (item_id < 0 || item_id >= g_ItemCount)
    {
        log_error(AMX_ERR_NATIVE, "[ZP] Invalid item id (%d)", item_id)
        return false;
    }
    
    new ignorecost = get_param(3)
    
    buy_item(id, item_id, ignorecost)
    return true;
}

public native_items_menu_text_add(plugin_id, num_params)
{
    static text[32]
    get_string(1, text, charsmax(text))
    format(g_AdditionalMenuText, charsmax(g_AdditionalMenuText), "%s%s", g_AdditionalMenuText, text)
}

public client_disconnect(id)
{
    // Reset remembered menu pages
    MENU_PAGE_ITEMS = 0
}

public clcmd_items(id)
{
    // Player dead
    if (!is_user_alive(id))
        return;
    
    show_items_menu(id)
}

// Items Menu
show_items_menu(id)
{
    static menu[512], name[MAX_PATCH_LINE], cost, transkey[MAX_PATCH_LINE + MAX_PATCH_LINE]
    new menuid, index, itemdata[2]
    
    // Title
    formatex(menu, charsmax(menu), "%L:\r", id, "MENU_EXTRABUY")
    menuid = menu_create(menu, "menu_extraitems")
    
    // Item List
    for (index = 0; index < g_ItemCount; index++)
    {
        // Additional text to display
        g_AdditionalMenuText[0] = 0
        
        // Execute item select attempt forward
        ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, index, 0)
        
        // Show item to player?
        if (g_ForwardResult >= ZP_ITEM_DONT_SHOW)
            continue;
        
        // Add Item Name and Cost
        ArrayGetString(g_ItemName, index, name, charsmax(name))
        cost = ArrayGetCell(g_ItemCost, index)
        
        // ML support for item name
        formatex(transkey, charsmax(transkey), "ITEMNAME %s", name)
        if (GetLangTransKey(transkey) != TransKey_Bad) formatex(name, charsmax(name), "%L", id, transkey)
        
        // Item available to player?
        if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
            formatex(menu, charsmax(menu), "\d%s %d %s", name, cost, g_AdditionalMenuText)
        else
            formatex(menu, charsmax(menu), "%s \y%d \w%s", name, cost, g_AdditionalMenuText)
        
        itemdata[0] = index
        itemdata[1] = 0
        menu_additem(menuid, menu, itemdata)
    }
    
    // No items to display?
    if (menu_items(menuid) <= 0)
    {
        zp_colored_print(id, "%L", id, "NO_EXTRA_ITEMS")
        menu_destroy(menuid)
        return;
    }
    
    // Back - Next - Exit
    formatex(menu, charsmax(menu), "%L", id, "MENU_BACK")
    menu_setprop(menuid, MPROP_BACKNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_NEXT")
    menu_setprop(menuid, MPROP_NEXTNAME, menu)
    formatex(menu, charsmax(menu), "%L", id, "MENU_EXIT")
    menu_setprop(menuid, MPROP_EXITNAME, menu)
    
    // If remembered page is greater than number of pages, clamp down the value
    MENU_PAGE_ITEMS = min(MENU_PAGE_ITEMS, menu_pages(menuid)-1)
    
    // Fix for AMXX custom menus
    set_pdata_int(id, OFFSET_CSMENUCODE, 0)
    menu_display(id, menuid, MENU_PAGE_ITEMS)
}

// Items Menu
public menu_extraitems(id, menuid, item)
{
    // Menu was closed
    if (item == MENU_EXIT)
    {
        MENU_PAGE_ITEMS = 0
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Remember items menu page
    MENU_PAGE_ITEMS = item / 7
    
    // Dead players are not allowed to buy items
    if (!is_user_alive(id))
    {
        menu_destroy(menuid)
        return PLUGIN_HANDLED;
    }
    
    // Retrieve item id
    new itemdata[2], dummy, itemid
    menu_item_getinfo(menuid, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
    itemid = itemdata[0]
    
    // Attempt to buy the item
    buy_item(id, itemid)
    menu_destroy(menuid)
    return PLUGIN_HANDLED;
}

// Buy Item
buy_item(id, itemid, ignorecost = 0)
{
    // Execute item select attempt forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_PRE], g_ForwardResult, id, itemid, ignorecost)
    
    // Item available to player?
    if (g_ForwardResult >= ZP_ITEM_NOT_AVAILABLE)
        return;
    
    // Execute item selected forward
    ExecuteForward(g_Forwards[FW_ITEM_SELECT_POST], g_ForwardResult, id, itemid, ignorecost)
}
 
Сообщения
418
Реакции
-7
Я вам больше скажу, заменял все [32] на [128] и нихрена
5 Апр 2023
@RedGamer,но не пробовал удалять файл zp_extraitems.ini
 
Сообщения
1,073
Реакции
227
Предупреждения
9
Помог
6 раз(а)
RedGamer, ещё ini надо удалять с предметами
 
Сообщения
418
Реакции
-7
Flymic24, я не знаю, почему [64] [128] не работают, а MAX_PATCH_LINE сработал... объясни, если не трудно) И спасибище)
5 Апр 2023
Nordic Warrior,Мне этот вариант по душе)

Благодарность: Flymic24, Nordic Warrior
 

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

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