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

    Всего на сайте: 6
    Гостей: 3
    Пользователи: - отсутствуют
    Роботы: Google Bot, Google Bot, crawl Bot

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

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

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Nesquik Дата: 24-08-2013, 19:04 Просмотров: 4816

    Создаем магазин при помощи Array

    Для начала нам нужно внимательно прочитать этот урок про Array
    Знать как использовать ExecuteForward и CreateMultiForward



    #include <amxmodx>
    #include <cstrike> // будем использовать валюту КС

    new Array:ItemName // Будет хранить наши названия предметов
    new Array:ItemCost // Будет хранить нашу стоимость предметов

    new result, g_item_selected // сокращенное имя нашего CreateMultiForward

    public plugin_init()
    {
        register_plugin("Shop Array", "1.0", "Nesquik for http://amxxmodx.ru")
        register_clcmd("say /shop", "open_shop") // Вызов нашего меню при помощи команды в чате /shop
        g_item_selected = CreateMultiForward("ItemSelected", ET_CONTINUE, FP_CELL, FP_CELL) // наш форвард который вызывается когда выбирается предмет
    }

    public plugin_precache()
    {
        ItemName = ArrayCreate(32, 1) // Наше имя предмета
        ItemCost = ArrayCreate(1, 1) // Наша стоимость предмета
    }

    public open_shop(id)
    {
        new name[32] // массив для записи имени нашего предмета
        new size = ArraySize(ItemName) // Получаем сколько всего зарегистрировано предметов
        if(!size) // нужно проверить есть ли предметы в меню , если нет выводим следующее
        {
            client_print(id, print_chat, "В магазине нет предметов")
            return PLUGIN_HANDLED
        }
        new menu = menu_create("Магазин сервера", "menu_func")
        new cost // наша стоимость предмета
        new FormatItem[64] // будет использовано для записи информации о предмете
        for(new i = 0; i < size; i++) // Получаем все предметы которые зарегистрированы через RegisterItem
        {
            ArrayGetString(ItemName, i, name, 31)
            cost = ArrayGetCell(ItemCost, i)
            if(cs_get_user_money(id) >= cost) // Создаем условие если деньги игрока больше либо равны стоимости наших предметов то выводим их в меню
            {
                formatex(FormatItem, 63, "%s \y%d", name, cost)
                menu_additem(menu, FormatItem)
            }
        }
        menu_display(id, menu, 0) // Выводим созданное меню игроку
        return PLUGIN_HANDLED
    }

    public menu_func(id, menu, item)
    {
        ExecuteForward(g_item_selected, result, id, item) // Сообщаем другому плагину что игрок id выбрал предмет item
        return PLUGIN_HANDLED
    }

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

    public NativeRegisterItem(const Name[], cost) // Name[] = имя предмета , cost = стоимость предмета
    {
        param_convert(1) // Конвертируем наше название предмета

        ArrayPushString(ItemName, Name) // Устанавливаем наше имя созданному нами выше Array'ю
        ArrayPushCell(ItemCost, cost) // Устанавливаем стоимость для нашего предмета

        return ArraySize(ItemName) - 1 // Возвращаем последний зарегистрированный предмет
    }


    Ну какой же магазин без предметов , Создадим их
    Но как это сделать :?
    Нам сначала нужно создать файл с расширение .inc (к примеру shop.inc)
    Записать туда нам нужно всего две строки
    Это наш RegisterItem
    native RegisterItem(const Name[], cost)
    и наш форвард ItemSelected
    forward ItemSelected(id, item) // Ид игрока который выбрал предмет , item предмет который выбрал игрок

    В конечном итоге нам инклюд shop.inc должен выглядеть так
    native RegisterItem(const Name[], cost)
    forward ItemSelected(id, item)


    Создание предметов для нашего магазина
    пример :
    #include <amxmodx>
    #include <shop> // Созданный нами инклюд
    #include <fun>

    new health // Сокращенное имя нашего предмета

    public plugin_init()
    {
    health = RegisterItem("Здоровье", 5000) // Название нашего предмета Здоровье , его стоимость 5000 , Внимание предмет будет показываться в том случае если у вас (игрока) денег больше чем 5000 ну или равно :)
    }

    public ItemSelected(id, item)
    {
    if(item == health) // Проверяем выбранный игроком предмет , Если это наш созданный предмет то выполняем следующее
    {
      set_user_health(id, 150) // Устанавливаем игроку 150 здоровья
    }
    }


    Ну вот и все компилируем наш плагин устанавливаем на сервер
    Перезагружаем сервер и вызываем наш магазин командой say /shop
    Все магазин готов
    Примечание :
    Если хотите чтобы один плагин создавал несколько предметов нужно создать его через armor = RegisterItem("Броня", 1500) и создать условие в ItemSelected следующее
    Вместо
     if(item == health)
    {
      set_user_health(id, 150)
    }
    Сделать так :

    if(item == health)
    {
      set_user_health(id, 150)
    }else if(item == armor)
    {
      set_user_armor(id, 150)
    }
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Создаем магазин при помощи Array
    Opo4uMapy

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

    Спасибо.
    Несквик, если можешь сделай статью как создавать пункты в меню из файла
    Admin

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

    Opo4uMapy,
    1) найди функции работы с файлами
    2) найди функции работы с меню
    3) соедини их вместе.

    А если все будут делать за тебя - нафига тебе скриптинг..
    Такие просты вещи необходимо изучать самому!
    --------------------
    Nesquik

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

    Admin,
    Полностью согласен

    Opo4uMapy

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

    Admin,
    Все, понял.
    Admin

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

    Надеюсь это не просто слова :)
    --------------------
    Opo4uMapy

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

    Я знаю как с файлами работать и как с меню просто лень было пытатся сделать .Но все таки попробывал и получилось
    Admin

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

    Если тебе лень - то скорее всего это не просто лень. а отсутствие интереса.
    А отсутствие интереса это самое страшное что может быть в скриптинге.
    --------------------
    Mapaky9

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

    Тестанул и заметил что не отнимается денег за покупку айтемов) Фиксани несквик статью))
    Nesquik

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

    Mapaky9,
    Ах да забыл
    Замени
    public menu_func(id, menu, item)
    {
        ExecuteForward(g_item_selected, result, id, item) // Сообщаем другому плагину что игрок id выбрал предмет item
        return PLUGIN_HANDLED
    }


    Следующим
    public menu_func(id, menu, item)
    {
        new Cost = ArrayGetCell(ItemCost, item)
        new money = cs_get_user_money(id)
       if(money >= Cost)
       {
         ExecuteForward(g_item_selected, result, id, item) // Сообщаем другому плагину что игрок id выбрал предмет item
       cs_set_user_money(id, money - Cost, 1)
    }else{
      reutrn PLUGIN_HANDLED
    }
        return PLUGIN_HANDLED
    }
    Admin

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

    else{
            reutrn PLUGIN_HANDLED
        }

    ЗАЧЕМ?
    Вот как по русски это выглядит:
    Если ( что то){
    код
    }если условие не сработало{
    Плагин останавливает операцию и плагины следующих ниже в plugins.ini не будут вызваны.
    }
    Плагин останавливает операцию и плагины следующих ниже в plugins.ini не будут вызваны.


    То есть масло масленое.

    А вообще, перед тем как выкладывать код, его надо тестировать, что бы не вводить в заблуждение читающих!
    --------------------

    Информация

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

Реклама