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

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

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

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

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 28-09-2011, 09:02 Просмотров: 8793

    Ограничение использования команды,функции в одном раунде

    Вопрос "Как ограничить использование команды в одном раунде?", вследствие появления кучи различных режимов для DeathRun мода, встает очень часто у многих новичков. Описание много раз давалось, переделывались многие плагины. но вопрос все по-прежнему остается актуальным.
    По этому я и решил показать универсальный метод ограничения использования команды или функции в одном раунде.

    Для реализации данного кода, вы должны уметь работать со следующими функциями:
    plugin_init
    register_event
    register_cvar
    get_cvar_num
    register_clcmd - Желательно.
    client_print - Желательно

    Ну что, освоили теорию по необходимым данным? Тогда идем дальше:

    Немного теории:
    С начала нам нужно немного подумать и прикинуть, как же должен работать плагин.
    Выбросите из головы функции и проговорите в слух, что должно происходить и в какой момент, и записывайте все по пункам.
    Вот что получилось у меня:
    1. Игрок первый раз использовал функцию в раунде
    2. Необходимо это дело запомнить куда то, записать
    3. Игрок использовал второй раз функцию в том же раунде
    4. Снова записываем
    5. Игрок вновь, в третий раз хочет использовать функцию, но мы хотим разрешить только 2 раза.
      Значит нужно перед каждым использованием проверять, сколь раз уж использовал игрок эту функцию.
    6. Если игрок уже не может использовать функцию, надо вывести какое то сообщение.
    7. Каждый раунд счетчик использования функции нужно обнулять

    А что вышло у вас? Пишите в комментариях, интересно же ) Не стесняйтесь, может что вместе придумаем

    Теперь нам нужно на эту грубую схему найти управу в виде функций, давайте прикинем:
    1. Нам нужна функция которую игрок использует, или создать свою ( у нас будет test_cmd)
    2. Нам нужна глобальная переменная для счетчика использования функции ( тоже легко new g_F_counter[33] = 0)
    3. Прибавлять к переменной по единице когда игрок использует функцию (g_F_counter[id]++)
    4. Необходимо создать условие ограничения if(g_F_counter[id] <= get_cvar_num("amx_use_fn_in_round")) тут у нас появляется еще и необходимость в кваре, что бы удобно было настраивать готовый плагин
    5. Вывод сообщения с помощью client_print
    6. Требуется событие начала раунда ( отловим с помощью register_event)


    На этом теория заканчивается, можно приступать к написанию плагина

    Написание плагина:
    Как мы выше расписали себе план плагина и его работу, приступим с отлова событий, регистрации квара и переменных, так как это следует делать в самом начале плагина, вот что получается:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    //название плагина, версия и автор
    #define PLUGIN "Restriction of usage of function in one round"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    //Глобальный счетчик для каждого игрока
    new g_F_counter[33] = 0

    public plugin_init() {
        //регистрируем плагин и его данные
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        //необходимые нам функции, о которых писалось выше
        register_event("ResetHUD","startround","be")
        register_cvar("amx_use_fn_in_round","3")
        register_clcmd("say /cmd","test_cmd")
    }


    И так,конфиг у нас готов, теперь сразу же сделаем обнуление счетчика, что бы потом не возвращаться к этому:
    public startround(id){
        g_F_counter[id] = 0
    }


    И наконец, наша функция ограничение и подсчета количества использования команды или функции.
    public test_cmd(id){
        
        if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
            //Выполняется нужная команда, функция и т.п.
            client_print(id,print_chat,"[Round counter] You command exec")
            g_F_counter[id]++
        }else{
            //ты исчерпал свои возможности в этом раунде
            client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
        }
    }

    Условие говорит нам следующее:
    Если ( количество раз использования данной функции меньше значению нашего квара) То выполняем следующий код, в котором прибавляем к счетчику единицу использования функции, если равенство не верно, то выполняем код следующий за конструкцией }else{.

    Весь плагин целиком:
    /* Plugin generated by AMXX-Studio */

    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "Restriction of usage of function in one round"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new g_F_counter[33] = 0

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        register_event("ResetHUD","startround","be")
        register_cvar("amx_use_fn_in_round","3")
        
        register_clcmd("say /cmd","test_cmd")
    }

    public startround(id){
        g_F_counter[id] = 0
        
    }


    public test_cmd(id){
        
        if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
            //add you code
            client_print(id,print_chat,"[Round counter] You command exec")
            g_F_counter[id]++
        }else{
            //ты исчерпал свои возможности в этом раунде
            client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
        }
    }


    Как добавить такое ограничение в существующий палигн:
    1. Необходимо добавить вначале плагина переменную
      new g_F_counter[33] = 0

    2. Внутри функции plugin_init добавить функции

          register_event("ResetHUD","startround","be")
          register_cvar("amx_use_fn_in_round","3")
          register_clcmd("say /cmd","test_cmd")

    3. После plugin_init добавить

      public startround(id){
          g_F_counter[id] = 0
          
      }

    4. И самое сложное:
      Найти в плагине то кусок кода, который вы хотите ограничить в использовании.
      Затем перед ним вставить код
          if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
              //add you code
              client_print(id,print_chat,"[Round counter] You command exec")
              g_F_counter[id]++
          }else{
              //ты исчерпал свои возможности в этом раунде
              client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
          }

      И в место кода:
              //add you code
              client_print(id,print_chat,"[Round counter] You command exec")

      Вставить всю функцию.

    5. Есть и другой вариант:
      Вставить весь этот код.
      public test_cmd(id){
          
          if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
              //add you code
              client_print(id,print_chat,"[Round counter] You command exec")
              g_F_counter[id]++
          }else{
              //ты исчерпал свои возможности в этом раунде
              client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
          }
      }

      Вместо client_print(id,print_chat,"[Round counter] You command exec") указать вашу функцию в плагине например: my_super_menu(id)

      Дальше найти в plugin_init строку, где регистрируется команда и переписать второй параметр - вызываемая функция, на test_cmd
      Но этот способ и не красивый и во многих случаях станет не возможным.
    Надеюсь вы поняли механизм и в дальнейшем у вас не будет вопросов, как ограничить тот или другой момент в плагине.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    l0pa

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

    Добавьте если будет время скрипт:
    Ограничение использования команды,функции в одном раунде по времени!
    Например, можно один раз в 5 минут использовать функцию
    Admin

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

    Как будет время, постараюсь написать.
    --------------------
    Randes

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

    Можна узнать как сделать счетчик в меню и чтобы в чат не писало ничего?
    DeMNiX

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

    Если ты имеешь ввиду ZP mode, то для этого нужно отредактировать главный мод, а затем итемы.
    blackfox

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

    Доброго времени суток всем!

    Короче тут одна проблема с плагином.
    Хотел сделать плагин для deathrun что б все игроки с  флагом а  могли возвродиться 1 раз за раунд.
    я совсем нуб в этом деле. Прошу помогите буду вам очень благодарен.

    #include <amxmodx>
    #include <amxmisc>
    #include <fun>

    #define PLUGIN "[fun.inc] spawn"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    new g_F_counter[33] = 0

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_event("ResetHUD","startround","be")
        register_cvar("amx_use_fn_in_round","1")
        register_clcmd("say /respawn","user_spawn")

    }
    public startround(id){
        g_F_counter[id] = 0
        
    }
    public user_spawn(id){
        spawn(id)
    }
        if(g_F_counter[id] < get_cvar_num("amx_use_fn_in_round")){
            //add you code
            client_print(id,print_chat,"[Round counter] You command exec")
            g_F_counter[id]++
        }else{
            //ты исчерпал свои возможности в этом раунде
            client_print(id,print_chat,"[Round counter] Only %d times in round to use this command",get_cvar_num("amx_use_fn_in_round"))
        }
    public user_spawn(id)
    {
            if ( !(get_user_flags(id) & ADMIN_RESERVATION) )
            {
            ColorChat(id, NORMAL, "^x4[Admin Life]^x1 You must buy vip on forum.")
            return HAM_IGNORED
            }
    Safety1st

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

    blackfox, c таким вопросом лучше обратиться на форум amx-x.ru.
    --------------------
    gavrilyuc

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

    для понимание, нормально... даже заставили вспомнить меня "паскалевые" схемы, которыми меня препод долбил...

    но вот, "ResedHud"... где-то есть на сайте что его можно вызвать.
    кому не лень, может изменить "ResedHud" на "Hltv round new".
    Safety1st

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

    gavrilyuc, ничего не понял wink

    Месседж ResetHUD - это устаревший способ отлова спавна, ему на смену давным-давно пришёл способ через Ham - форвард Ham_Spawn.
    --------------------
    gavrilyuc

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

    Safety1st,
    спаун, да. Согласен. Но может быть что человек может реснуться(например как death run постоянно суют возможность покупать воскрешение)... Я имел в виду что будет лучше если повесить на(это к примеру, возможно и есть другой вариант):
    register_event("HLTV", "startround", "a", "1=0", "2=0");

    тогда код будет реально "на один раунд".
    Safety1st

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

    Да, вы правильно мыслите, так и нужно: в новом раунде сбрасывать у всех число использований через arrayset(). Только функцию выше называйте лучше NewRound : раунд 'стартует' после окончания фризтайма, это позже.
    --------------------

    Информация

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

Реклама