Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 12
    Гостей: 10
    Пользователи: byantopo6633
    Роботы: crawl Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Nesquik Дата: 20-10-2014, 20:28 Просмотров: 3776

    shop_api Магазин для твоего сервера

    Автор : Nesquik
    Версия : 1.0 специально для http://amxxmodx.ru/
    О плагине : Магазин имеющий свой внутренний API через который можно добавлять предметы

    shop_api Магазин для твоего сервера















    Требования :
    Модуль Amxx
    Модуль Cstrike

    Содержание shop_api.inc
    // Команда для которой будет предмет
    #define TEAM_ALL    0 // Для всех
    #define TEAM_T 1 // Только для Террористов
    #define TEAM_CT    2 // Только для ментов

    #define SHOP_ITEM_DISABLED 97 // Возвращаем в UserChooseItem что бы заблокировать выбор предмета

    // Вызывается когда игрок выбирает предмет
    // @param id     Индекс игрока
    // @param item Индекс предмета
    forward UserChooseItem(id, item)

    // Вызывается когда игрок открывает магазин
    forward UserOpenMenu(id)

    // Используется для того что бы игроку открыть меню на определенной странице
    // @param id   Индекс игрока
    // @param page    Страница
    native OpenShopMenu(const id, const page)

    // Регистрирует новый предмет для магазина
    // @param Name         Имя предмета
    // @param cost           Стоимость предмета
    // @param team          Для какой команды предмет
    // @return                  Возвращает ид данного предмета
    native RegisterItem(Name[], cost, team)


    Основные квары:
    amxx_cvar_enable_round_shop = 0
    Если квар равен нулю то в любом раунде можно открыть меню
    Если равен 3 то только после 3 раунда можно будет открывать меню

    amxx_cvar_buy_max_items = 10
    Сколько можно предметов купить за раунд

    Исходный код:
    #include <amxmodx>
    #include <cstrike>

    #define TEAM_ALL    0
    #define SHOP_ITEM_DISABLED    97

    enum _:EXEC_FORWARD
    {
        ForwardItemChoose=0,
        ForwardMenuOpen
    }

    new Array:ItemName, Array:ItemCost, Array:ItemTeam
    new pCvarRoundEnable, pCvarBuyMaxItems
    new RoundNumber, szResult
    new gForward[EXEC_FORWARD]
    new szBuyItems[33]

    new szButtonName[][] = {"MENU_EXIT", "MENU_NEXT", "MENU_BACK"}
    new szButtonIndex[] = {MPROP_EXITNAME, MPROP_NEXTNAME, MPROP_BACKNAME}

    public plugin_init()
    {
        register_plugin("Shop Api for amxxmodx.ru", "1.0", "Nesquik")
        
        register_clcmd("say /shop", "ShowShopMenu")
        register_clcmd("say_team /shop", "ShowShopMenu")

        pCvarRoundEnable = register_cvar("amxx_cvar_enable_round_shop", "0")
        pCvarBuyMaxItems = register_cvar("amxx_cvar_buy_max_items", "10")
        
        gForward[ForwardItemChoose] = CreateMultiForward("UserChooseItem", ET_CONTINUE, FP_CELL, FP_CELL)
        gForward[ForwardMenuOpen] = CreateMultiForward("UserOpenMenu", ET_CONTINUE, FP_CELL)
        
        register_event("HLTV", "EventHLTV", "a", "1=0", "2=0")
        register_event("TextMsg", "EventTextMsg", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
        
        register_dictionary("shop_api.txt")
    }

    public ShowShopMenu(id)
        return ShopMenuSub(id, 0)

    public ShopMenuSub(id, page)
    {
        new cvar[2]
        cvar[0] = get_pcvar_num(pCvarRoundEnable)
        cvar[1] = get_pcvar_num(pCvarBuyMaxItems)
        
        if(cvar[0] && (cvar[0] > RoundNumber))
        {
            client_print(id, print_chat, "%L", LANG_PLAYER, "CANT_BUY_IN_ROUND", cvar[0])
            return 0
        }
        
        if(cvar[1] && (szBuyItems[id] >= cvar[1]))
        {
            client_print(id, print_chat, "%L", LANG_PLAYER, "YOU_BUY_MAX_ITEMS_IN_ROUND", cvar[1])
            return 0
        }
            
        new szMenu[96], szName[64], szHostName[64], szKey[3]
        new szCreateMenuShop, szBackMenuShop, szCost, szTeam
        new szSize = ArraySize(ItemName), szUserTeam = get_user_team(id), szMoney = cs_get_user_money(id)
        
        get_cvar_string("hostname", szHostName, charsmax(szHostName))
        ExecuteForward(gForward[ForwardMenuOpen], szResult, id)
        
        format(szMenu, charsmax(szMenu), "%L", LANG_PLAYER, "SHOP_TITLE", szHostName)
        szCreateMenuShop = menu_create(szMenu, "MenuFuncShop")
        szBackMenuShop = menu_makecallback("MenuBackShop")
        
        for(new i = 0; i < szSize; i++)
        {
            num_to_str(i, szKey, charsmax(szKey))
        
            ArrayGetString(ItemName, i, szName, charsmax(szName))
            szCost = ArrayGetCell(ItemCost, i)
            szTeam = ArrayGetCell(ItemTeam, i)
            
            if(szTeam == szUserTeam || szTeam == TEAM_ALL)
            {
                if(szMoney >= szCost)
                    formatex(szMenu, charsmax(szMenu), "%L", LANG_PLAYER, "INFO_ITEM", szName, szCost)
                else
                    formatex(szMenu, charsmax(szMenu), "%L", LANG_PLAYER, "NO_MONEY", szName, szCost - szMoney)
            }
            
            menu_additem(szCreateMenuShop, szMenu, szKey, 0, szBackMenuShop)
        }
        
        for(new i = 0; i < sizeof szButtonName; i++)
        {
            formatex(szMenu, charsmax(szMenu), "%L", LANG_PLAYER, szButtonName[i])
            menu_setprop(szCreateMenuShop, szButtonIndex[i], szMenu)
        }
        
        if(szSize)
            return menu_display(id, szCreateMenuShop, page)
        else
            client_print(id, print_chat, "%L", LANG_PLAYER, "NO_ITEM_IN_MENU")
        
        return 0
    }

    public MenuFuncShop(id, szMenu, szItem)
    {
        if(szItem == MENU_EXIT)
            return menu_destroy(szMenu)
        
        new szData[3]
        new szDummy
        new szCost, szMoney = cs_get_user_money(id)
        
        menu_item_getinfo(szMenu, szItem, szDummy, szData, charsmax(szData), _, _, szDummy)
        szItem = str_to_num(szData)
        
        szCost = ArrayGetCell(ItemCost, szItem)
        cs_set_user_money(id, szMoney - szCost, 1)
        
        ExecuteForward(gForward[ForwardItemChoose], szResult, id, szItem)
        
        if(szResult == SHOP_ITEM_DISABLED)
            cs_set_user_money(id, szMoney, 1)
        
        return 1
    }

    public MenuBackShop(id, szMenu, szItem)
    {
        new szData[3]
        new szDummy
        new szMoney = cs_get_user_money(id)
        
        menu_item_getinfo(szMenu, szItem, szDummy, szData, charsmax(szData), _, _, szDummy)
        szItem = str_to_num(szData)
        
        if(szMoney < ArrayGetCell(ItemCost, szItem))
            return ITEM_DISABLED
        
        return ITEM_ENABLED
    }

    public EventHLTV()
    {
        arrayset(szBuyItems, 0, 33)
        RoundNumber++
    }

    public EventTextMsg()
    {
        arrayset(szBuyItems, 0, 33)
        RoundNumber=0
    }

    public plugin_precache()
    {
        ItemName = ArrayCreate(64, 1)
        ItemCost = ArrayCreate(1, 1)
        ItemTeam = ArrayCreate(1, 1)
    }

    public plugin_natives()
    {
        register_native("RegisterItem", "NativeRegisterItem", 1)
        register_native("OpenShopMenu", "NativeOpenShopMenu", 1)
    }

    public NativeRegisterItem(const Name[], const Cost, const Team)
    {
        param_convert(1)
        
        ArrayPushString(ItemName, Name)
        ArrayPushCell(ItemCost, Cost)
        ArrayPushCell(ItemTeam, Team)
        
        return (ArraySize(ItemName) - 1)
    }

    public NativeOpenShopMenu(id, page)
        return ShopMenuSub(id, page)


    Магазин вызывается командой say /shop

    Как добавить предмет:
    #include <amxmodx>
    #include <shop_api> // Инклюд магазина
    #include <fun>

    new ItemId // Будет хранить ид нашего предмета

    public plugin_precache()
    ItemId = RegisterItem("He граната", 500, TEAM_ALL) // Мы создаем предмет с именем He граната , стоимостью 500 $ , для всех команд

    public UserChooseItem(id, item)
    {
        if(item == ItemId) // Проверяем ид выбранного предмета и нами созданного
        {
            if(!user_has_weapon(id, CSW_HEGRENADE)) // Если у игрока нет He гранаты
                give_item(id, "weapon_hegrenade") // Выдаем He гранату
            else
                return SHOP_ITEM_DISABLED // Возвращаем деньги игроку если у него есть He граната
        }
        
        return 1
    }


    Так же плагин полностью мультиязычный
    Вы не можете скачивать файлы с нашего сервера

    Если есть какие либо пожелания / критика
    Выслушаю и приму к сведению
    Новость отредактировал Admin - 23-10-2014, 00:23
    Причина: Плагин администрацией не проверялся.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    shop_api Магазин для твоего сервера
    droads

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    ItemId = RegisterItem("He граната", 500, TEMA_ALL)
    TEAM_ALL
    Поправить
    А то мало ли..
    OtherWorld7

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Можно ли как-то под аммо паки запилить? И как))
    gavrilyuc

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    попробуй использовать enum.
    enum _:Item {
    Name[64],
    ItemTeam,
    ItemCost
    }


    OtherWorld7, можно, но тогда тебе нужно будет систему паков(или взять готовую)
    писать... и хотя-бы сделать 2 натива...
    -- get_ammo(id);
    -- set_ammo(id, num);

    Если у тебя уже есть готовая система, то можешь в глав. плагине найти все cstrike Money функции и заменить их на те нативы из той системы паков.


    // Вызывается когда игрок выбирает предмет
    // @param id     Индекс игрока
    // @param item Индекс предмета
    forward UserChooseItem(id, item)


    плохая затея, насчёт этого... когда у тебя будет хотя-бы 40 штук то это будет накладно...
    почему? потому что этот форвард вызовется у всех sub плагинах...
    и ещё и тебе приходится вешать условие на проверку...

    можно просто на "Item Menu" Callback вешать.

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама