а то если добавляешь предмет он идет не новую страницу а становиться 10
Чтобы были 1-7 предметы 8 вперед 9 назад 0 выход
Плагин:
- Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <string>
#include <file>
#include <amxconst>
#include <float>
#include <cstrike>
#include <hamsandwich>
#include <fakemeta>
#include <cssb/messages.inc>
// #pragma semicolon 1
#define PLUGIN "CSSB [WC3] Shopmenu3"
#define VERSION "1.3"
#define AUTHOR "CSSB"
#define DISC_FLAG ADMIN_BAN
new Array:arrStringNamesItems; // Название предметов
new Array:arrIntItemCost; // Стоимость предмета
new Array:arrIntItemOnOff; // Включить/выключить предмет
new Array:arrIntItemOnOffCvars; // Включить/выключить предмет Cvars
new Array:arrIntItemMessageBuy; // Вывод сообщения о покупке предмета
new iExtraItemCounter; // Счетчик предметов
// Временные переменные для сопоставления с текущими
new Array:arrStringItemRealNameAux,
Array:arrStringItemNameAux,
Array:arrIntCostAux,
Array:arrIntItemNewFlagAux;
// Ключи меню
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0;
// Хендлы для форвародов
new hExtraItemSelected,hDummyResult;
new bool:bIsAlivePlayer[33]; // Когда игрок мертв
static iPosMenuBase = 0;
new szMenuData[512];
//=============================================================================
//=============================================================================
//=============================================================================
//--------------------Встроенные функции--------------------BEGIN
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
//Команды
register_clcmd( "say shopmenuwl","cssbCommandShopmenu3", -1 );
register_clcmd( "say /shopmenuwl","cssbCommandShopmenu3", -1 );
register_clcmd( "shopmenuwl", "cssbCommandShopmenu3", -1 );
//Словарик
register_dictionary( "wc3_shopmenu.txt");
//HAM Форварды
RegisterHam(Ham_Spawn, "player", "fwPlayerSpawnPost", 1);
RegisterHam(Ham_Killed, "player", "fwPlayerKilled");
//FM Форварды
register_forward(FM_ClientDisconnect, "fwClientDisconnect");
hExtraItemSelected = CreateMultiForward("wc3_extra_item_selected", ET_CONTINUE, FP_CELL, FP_CELL);
//Название главного меню
iPosMenuBase += formatex(szMenuData[iPosMenuBase], charsmax(szMenuData)-iPosMenuBase, "\y%L^n^n", LANG_PLAYER, "WC3_SHOPMENU3_NAME");
new idMenu = register_menuid(szMenuData);
register_menucmd(idMenu, KEYSMENU, "cssbMenuItems");
}
public plugin_cfg()
{
fLoadMapsCvars();
set_task(2.5, "fSetCvarsNew");
}
public plugin_precache()
{
//Создание массивов
arrStringNamesItems = ArrayCreate(64, 1);
arrIntItemCost = ArrayCreate(1, 1);
arrStringItemRealNameAux = ArrayCreate(32, 1);
arrStringItemNameAux= ArrayCreate(32, 1);
arrIntCostAux = ArrayCreate(1, 1);
arrIntItemNewFlagAux = ArrayCreate(1, 1);
arrIntItemOnOff = ArrayCreate(1, 1);
arrIntItemMessageBuy = ArrayCreate(1, 1);
arrIntItemOnOffCvars = ArrayCreate(1, 1);
}
public plugin_natives()
{
//Регистрация нового предмета
register_native("wc3_register_extra_item", "native_register_extra_item", 1);
register_native("wc3_buy_extra_item", "native_buy_extra_item", 1);
}
//--------------------Встроенные функции--------------------END
//=============================================================================
//=============================================================================
//=============================================================================
//--------------------Команды плагина--------------------BEGIN
//Команда открытия меню "say /shopmenu3"
public cssbCommandShopmenu3(idUser)
{
cssbShowMenuShopmenu3(idUser);
}
//--------------------Команды плагина--------------------END
//=============================================================================
//=============================================================================
//=============================================================================
//--------------------Функции для меню--------------------BEGIN
// Отображение меню с предметами
cssbShowMenuShopmenu3(idUser)
{
new szBuffer[64];
static pos;
pos = iPosMenuBase;
// Список предметов
for (new item = 0; item < iExtraItemCounter; item++)
{
ArrayGetString(arrStringNamesItems, item, szBuffer, charsmax(szBuffer));
new bal, iItemPrice = ArrayGetCell(arrIntItemCost, item)
if(get_user_flags(idUser) & DISC_FLAG)
{
iItemPrice = floatround(iItemPrice*0.8)
if(iItemPrice > 100)
bal = iItemPrice % 100
iItemPrice = iItemPrice - bal + 100
}
//Включен ли предмет
if(ArrayGetCell(arrIntItemOnOff, item) != 0)
{
pos += formatex(szMenuData[pos], charsmax(szMenuData)-pos, "\w%d. \r%s \y%d %L^n",item+1,szBuffer, iItemPrice, LANG_PLAYER, "WC3_SHOPMENU_DOLLAR");
}
else
{
pos += formatex(szMenuData[pos], charsmax(szMenuData)-pos, "\w%d. \r%s \y%d %L \w(\r*\w)^n",item+1,szBuffer, iItemPrice, LANG_PLAYER, "WC3_SHOPMENU_DOLLAR");
}
szBuffer[0] = item;
szBuffer[1] = 0;
}
// Мертвые и наблюдатели не могут открыть меню
if (!bIsAlivePlayer[idUser])
{
format(szMessage, charsmax(szMessage), "^x01%L^x03%L^x01%L ^x04%L",
LANG_PLAYER,"WC3SHM_BRACKET_LEFT",LANG_PLAYER,"WC3SHM_MODCLIENT",LANG_PLAYER,"WC3SHM_BRACKET_RIGHT",
LANG_PLAYER,"WC3SHM_ISALIVEPLAYER");
cssbColoredPrint(idUser, szMessage);
return;
}
//Пункты меню (назад - следующий - выход)
pos += formatex(szMenuData[pos], charsmax(szMenuData)-pos, "^n\d9. %L", LANG_PLAYER, "WC3_MENU_EXIT");
//Отображение меню
show_menu(idUser, KEYSMENU, szMenuData, -1 );
}
// Меню с предметами
public cssbMenuItems(idUser,idItemKey)
{
//client_print(idUser,print_chat,"idItemKey: %d | arr: %d",idItemKey,ArraySize(arrStringNamesItems));
// Меню будет закрыто
if (idItemKey == 9 || idItemKey >= ArraySize(arrStringNamesItems))
return PLUGIN_HANDLED;
// Мертвые не могут закупаться
if (!bIsAlivePlayer[idUser])
{
format(szMessage, charsmax(szMessage), "^x01%L^x03%L^x01%L ^x04%L",
LANG_PLAYER,"WC3SHM_BRACKET_LEFT",LANG_PLAYER,"WC3SHM_MODCLIENT",LANG_PLAYER,"WC3SHM_BRACKET_RIGHT",
LANG_PLAYER,"WC3SHM_ISALIVEPLAYER");
cssbColoredPrint(idUser, szMessage);
return PLUGIN_HANDLED;
}
if (idItemKey == iExtraItemCounter)
return PLUGIN_HANDLED;
native_buy_extra_item(idUser, idItemKey);
return PLUGIN_HANDLED;
}
//--------------------Функции для меню--------------------END
//=============================================================================
//=============================================================================
//=============================================================================
//--------------------Forwards--------------------BEGIN
// Игрок снова появляется в игре (респаунится)
public fwPlayerSpawnPost(idUser)
{
// Игрок ожил
bIsAlivePlayer[idUser] = true;
}
// Игрок был убит
public fwPlayerKilled(idVictim, idAttacker, shouldgib)
{
// Игрока убили
bIsAlivePlayer[idVictim] = false;
}
// Игрок выходит из игры
public fwClientDisconnect(idUser)
{
bIsAlivePlayer[idUser] = false;
}
//--------------------Forwards--------------------END
//=============================================================================
//=============================================================================
//=============================================================================
//--------------------Natives--------------------BEGIN
// Native: wc3_buy_extra_item
// Покупка предмета
public native_buy_extra_item(idUser, idItem)
{
//Включен ли предмет
if(ArrayGetCell(arrIntItemOnOff, idItem) == 0)
{
format(szMessage, charsmax(szMessage), "^x01%L^x03%L^x01%L ^x04%L",
LANG_PLAYER,"WC3SHM_BRACKET_LEFT",LANG_PLAYER,"WC3SHM_MODCLIENT",LANG_PLAYER,"WC3SHM_BRACKET_RIGHT",
LANG_PLAYER,"WC3SHM_BLOCK_ITEM_MAP");
cssbColoredPrint(idUser, szMessage);
cssbShowMenuShopmenu3(idUser);
return;
}
new iUserMoney;
iUserMoney = cs_get_user_money(idUser);
new bal, iItemPrice = ArrayGetCell(arrIntItemCost, idItem)
if(get_user_flags(idUser) & DISC_FLAG)
{
iItemPrice = floatround(iItemPrice*0.8)
if(iItemPrice > 100)
bal = iItemPrice % 100
iItemPrice = iItemPrice - bal + 100
}
//Хватает ли денег на покупку предмета
if (iUserMoney < iItemPrice)
{
format(szMessage, charsmax(szMessage), "^x01%L^x03%L^x01%L ^x04%L",
LANG_PLAYER,"WC3SHM_BRACKET_LEFT",LANG_PLAYER,"WC3SHM_MODCLIENT",LANG_PLAYER,"WC3SHM_BRACKET_RIGHT",
LANG_PLAYER,"WC3SHM_NOT_ENOUGH_MONEY");
cssbColoredPrint(idUser, szMessage);
return;
}
//Вывод сообщения о покупке
new iItemMessageBuyAux;
iItemMessageBuyAux = ArrayGetCell(arrIntItemMessageBuy, idItem);
if(iItemMessageBuyAux != 0)
{
new szNameItemAux[64];
ArrayGetString(arrStringNamesItems, idItem, szNameItemAux, charsmax(szNameItemAux));
format(szMessage, charsmax(szMessage), "^x01%L^x03%L^x01%L ^x04%L ^x03^"%s^" ^x04%L ^x03%d%L ^x04!",
LANG_PLAYER,"WC3SHM_BRACKET_LEFT",LANG_PLAYER,"WC3SHM_MODCLIENT",LANG_PLAYER,"WC3SHM_BRACKET_RIGHT",
LANG_PLAYER,"WC3SHM_HAS_BOUGHT_ITEM",
szNameItemAux,
LANG_PLAYER,"WC3SHM_FOR",
iItemPrice,
LANG_PLAYER,"WC3SHM_DOLLAR");
cssbColoredPrint(idUser, szMessage);
}
cs_set_user_money(idUser,iUserMoney - iItemPrice);
// Форвард для выбора предмета
ExecuteForward(hExtraItemSelected, hDummyResult, idUser, idItem);
}
// Native: wc3_register_extra_item
public native_register_extra_item(const szItemName[], iItemCost,iItemOnOff,iItemMessageBuy)
{
// Перевод строки в нужный формат передачи
param_convert(1);
// Добавление в массив предмета
ArrayPushString(arrStringNamesItems, szItemName);
ArrayPushCell(arrIntItemCost, iItemCost);
ArrayPushCell(arrIntItemOnOff, get_pcvar_num(iItemOnOff));//Значения
ArrayPushCell(arrIntItemOnOffCvars, iItemOnOff);//Сама переменная
ArrayPushCell(arrIntItemMessageBuy, iItemMessageBuy);
// Установка временного ключа для предмете
ArrayPushCell(arrIntItemNewFlagAux, 1);
new i, buffer[64], size = ArraySize(arrStringItemRealNameAux);
for (i = 0; i < size; i++)
{
ArrayGetString(arrStringItemRealNameAux, i, buffer, charsmax(buffer));
if (!equal(szItemName, buffer))
continue;
// Удаление временного ключа для предмете
ArraySetCell(arrIntItemNewFlagAux, iExtraItemCounter, 0);
// Замена названий
ArrayGetString(arrStringItemNameAux, i, buffer, charsmax(buffer));
ArraySetString(arrStringNamesItems, iExtraItemCounter, buffer);
// Замена цен
buffer[0] = ArrayGetCell(arrIntCostAux, i);
ArraySetCell(arrIntItemCost, iExtraItemCounter, buffer[0]);
}
// Прибавление нового предмета
iExtraItemCounter++;
// Возврат если предмет не зарегистрирован
return iExtraItemCounter-1;
}
//--------------------Natives--------------------END
//=============================================================================
//=============================================================================
//=============================================================================
public fLoadMapsCvars()
{
new szCurrentNameMap[33];
get_mapname(szCurrentNameMap, 33);
new szCfgDir[128];
get_configsdir(szCfgDir,127);
new szCfgNamePathDefault[128];
format(szCfgNamePathDefault,charsmax(szCfgNamePathDefault),"%s/CSSBConfigs/cssbSetMapsCvars/__AllMaps__.cfg",szCfgDir);
if(file_exists(szCfgNamePathDefault) == 1)
{
server_cmd("exec %s",szCfgNamePathDefault);
}
else
{
write_file(szCfgNamePathDefault,"echo ---[CSSB] AllMaps Settings Loaded!---",-1);
}
new szCfgNamePath[128];
format(szCfgNamePath,charsmax(szCfgNamePath),"%s/CSSBConfigs/cssbSetMapsCvars/%s.cfg",szCfgDir,szCurrentNameMap);
if(file_exists(szCfgNamePath) == 1)
{
server_cmd("exec %s",szCfgNamePath);
}
else
{
new szSettigLoaded[128];
format(szSettigLoaded,charsmax(szSettigLoaded),"echo ---[CSSB] %s Settings Loaded!---",szCurrentNameMap);
write_file(szCfgNamePath,szSettigLoaded,-1);
}
}
public fSetCvarsNew()
{
new iLengthStringNameItem = ArraySize(arrIntItemCost);
new iItemOnOffValueAux;
for (new i = 0; i < iLengthStringNameItem; i++)
{
iItemOnOffValueAux = get_pcvar_num(ArrayGetCell(arrIntItemOnOffCvars, i));
ArraySetCell(arrIntItemOnOff,i,iItemOnOffValueAux);
}
}
Заранее большое спасибо!