PHP Code:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#define PLUGIN_NAME "plugin name okay"
// Game vars
new g_arrays_created // to prevent stuff from being registered before initializing arrays
// Extra Items vars
new Array:ItemName
new Array:ItemCost
new g_extraitems_count // loaded extra items counter
// Some forward handlers
new g_extraItemSelected, g_result
public plugin_init() {
register_plugin(PLUGIN_NAME, "stolen from ZP by MeRcyLeZZ", "kww")
register_clcmd("menu", "menu_main", ADMIN_ALL, _)
register_clcmd("say /menu", "menu_main", ADMIN_ALL, _)
register_clcmd("say_team /menu", "menu_main", ADMIN_ALL, _)
g_extraItemSelected = CreateMultiForward("item_selected", ET_CONTINUE, FP_CELL, FP_CELL)
}
public plugin_precache() {
ItemName = ArrayCreate(32, 1)
ItemCost = ArrayCreate(1, 1)
// Allow registering stuff now
g_arrays_created = true
}
public plugin_end() {
//Destroy arrays to free up memory
ArrayDestroy(ItemName)
ArrayDestroy(ItemCost)
g_arrays_created = false
}
public plugin_natives()
register_native("register_item", "native_register_item", 1)
// Native: zp_register_extra_item
public native_register_item(const name[], cost) {
// Strings passed byref
param_convert(1)
// Arrays not yet initialized
if (!g_arrays_created) {
log_error(AMX_ERR_NATIVE, "[%s] Can't register extra item yet (%s)", PLUGIN_NAME, name)
return -1
}
// Item name is empty
if (strlen(name) < 1) {
log_error(AMX_ERR_NATIVE, "[%s] Can't register extra item with an empty name", PLUGIN_NAME)
return -1
}
// Already registered
new index, extraitem_name[32]
for (index = 0; index < g_extraitems_count; index++)
{
ArrayGetString(ItemName, index, extraitem_name, charsmax(extraitem_name))
if (equali(name, extraitem_name))
{
log_error(AMX_ERR_NATIVE, "[%s] Extra item already registered (%s)", PLUGIN_NAME, name)
return -1
}
}
// Add the item
ArrayPushString(ItemName, name)
ArrayPushCell(ItemCost, cost)
// Increase registered items counter
g_extraitems_count++
// Inform in server console that item is registered
log_amx("An item ^"%s^" successfully registered with ID: %i", name, g_extraitems_count-1)
// Return id under which we registered the item
return g_extraitems_count-1;
}
// Extra Items Menu
//show_menu_extras(id)
public menu_main(id) {
if(!is_user_connected(id))
return PLUGIN_HANDLED
static menu, szText[128], item_id, item_name[32], item_cost, szInfo[6]
// Title
formatex(szText, charsmax(szText), "Server menu")
menu = menu_create(szText, "menu_handler")
// Item List
for(item_id = 0; item_id < g_extraitems_count; item_id++)
{
ArrayGetString(ItemName, item_id, item_name, charsmax(item_name))
item_cost = ArrayGetCell(ItemCost, item_id)
// Add Item Name and Cost
if(item_cost == -1) {
formatex(szText, charsmax(szText), "%s", item_name)
}
else {
formatex(szText, charsmax(szText), "%s \r[\y$\w%i\r]", item_name, item_cost)
}
num_to_str(item_id, szInfo, charsmax(szInfo))
menu_additem(menu, szText, szInfo)
}
// No items to display?
if (menu_items(menu) <= 0) {
client_print(id, print_chat, "ERROR: There are no items in menu")
menu_destroy(menu)
return PLUGIN_HANDLED
}
menu_display(id, menu)
return PLUGIN_HANDLED
}
// Extra Items Menu
public menu_handler(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu)
return PLUGIN_HANDLED
}
// Retrieve extra item id
static szData[6], dummy, item_id
menu_item_getinfo(menu, item, dummy, szData, charsmax(szData), _, _, dummy)
item_id = str_to_num(szData)
// Attempt to choose the item
ExecuteForward(g_extraItemSelected, g_result, id, item_id)
menu_destroy(menu)
return PLUGIN_HANDLED;
}