Русское сообщество по скриптингу

[wc3Shopmenu3] Несколько страниц

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по AMX Mod X и его плагинам.

[wc3Shopmenu3] Несколько страниц

Сообщение webarx » 21 сен 2016, 22:56

Как сделать несколько страниц в меню
а то если добавляешь предмет он идет не новую страницу а становиться 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", -);
    register_clcmd( "say /shopmenuwl","cssbCommandShopmenu3", -);
    register_clcmd( "shopmenuwl", "cssbCommandShopmenu3", -);    

    
//Словарик
    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, -);
}

// Меню с предметами
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 (= 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);
    }    
}


Заранее большое спасибо! :-)
Аватара пользователя
webarx
 
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:59
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: [wc3Shopmenu3] Несколько страниц

Сообщение артист666 » 21 сен 2016, 23:05

Меню у тебя в старой системе, переписывать или на новую, или(лучше) делать мультистраничным...
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: [wc3Shopmenu3] Несколько страниц

Сообщение webarx » 21 сен 2016, 23:12

Это сложно? Я искал в интернете новый плагин, но не смог найти :(
Аватара пользователя
webarx
 
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:59
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead

Re: [wc3Shopmenu3] Несколько страниц

Сообщение артист666 » 21 сен 2016, 23:55

webarx писал(а):Это сложно?

Это в западо :-D
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: [wc3Shopmenu3] Несколько страниц

Сообщение webarx » 22 сен 2016, 00:37

артист666 писал(а):Это в западо :-D

Понятно, а есть на подобие плагины с которых можно взять код и переместить(изменить) туда? :-)
Аватара пользователя
webarx
 
Сообщения: 48
Зарегистрирован: 21 ноя 2012, 14:59
Благодарил (а): 12 раз.
Поблагодарили: 2 раз.
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead


Вернуться в Вопросы по AMXX и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12