Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Туториал Denizen

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем snr93, 23 дек 2015.

?

Продолжать?

  1. Да

    100,0%
  2. Нет

    0 голосов
    0,0%
  1. Автор темы
    snr93

    snr93 Активный участник Пользователь

    Баллы:
    88
    Данный пост будет посвящен плагину Denizen.
    Я создаю RPG сервер, и, среди кучи плагинов мне все же приглянулся Denizen своей гибкостью, так же он поддерживает формулы!
    Итак, сервер у меня 1.8.8., поэтому и данный материал будет для 1.8.
    Так же надеюсь, что информация, которую я тут буду писать, поможет другим людям делать более качественные и интересные сервера.
    P.S. на момент написания версия Denizen for 1.8.1Jul 18, 2015
    http://dev.bukkit.org/bukkit-plugins/citizens/ - это основа, без него denizen не будет работать
    http://dev.bukkit.org/bukkit-plugins/denizen/ - сам плагин, по которому будет информация
    Citizens + Denizen это весьма мощная связка для того, чтобы делать задачи, квесты и многое другое! Я думаю, если ты это читаешь, то что такое citizens рассказывать не нужно, а Denizen, это дополнение возможностей к NPC! Все буду стараться рассматривать с примерами.
    P.S. я сам только учусь. Буду рад дополнениями подсказкам!

    Итак, все скрипты пишутся руками в текстовых файлах с расширением yml. Этот файл нужно открывать любым текстовым редактором. Советую Notepad++, т.к. там есть подсветка кода. Так же все конфиги должны быть в UTF-8 без BOM! Иначе весь русский текст у вас кракозябрами. Чтобы это сделать в notepad++, выбираем кодировки -> преобразовать в utf-8 без bom

    npc assignment --set <имя скрипта> - задать скрипт выбранному npc
    denizen reload config - перезагрузить конфиг
    denizen reload scripts - перезагрузить только ваши скрипты
    denizen reload -a - перезагрузить весь плагин

    zap 'имя шага'- прыгнуть на какой-либо шаг
    disengage - завершает скрипт
    execute as_server 'команда' - выполнить от имени консоли
    determine cancelled - отменяет последнее действие
    determine <переменная или название предмета> - заменяет что-либо на указанную переменную или предмет
    <параметры> to_console - вывести итог в консоль
    random <число> - выполнить рандомное действие из списка
    look <куда> - npc смотрит куда ему указано
    chat 'текст' - выводит текст в чат
    narrate 'текст' - выводит неоформленный текст в чат
    playeffect <имя эффекта> <где> qty:количество - выводит эффект в нужном месте с определенным количеством
    debug: false | true - выводить ли в консоль все исполнение скрипта. Указывается после type

    <npc.name> - выводит название npc
    <npc.location> - считывает координаты npc
    <player> - вернет ваш UUID номер
    <player.name> - вернет ваш ник
    <player.location> - считывает координаты игрока, который обращается к скрипту\npc
    <player.health> - считывает кол-во здоровья у игрока
    <player.health.max> - считывает максимальное кол-во здоровья у игрока
    <context.material> - показывает блок, с которым произошло взаимодействие

    && - означает и
    || - означает или

    <&co> - заменяет знак :

    Все цвета указываются в скобках <>
    <green> - зеленый
    <red> - красный

    on player breaks <имя блока> - если игрок разрушил этот блок, то что-то делаем
    on player breaks block - если игрок разрушил любой блок, то что-то делаем

    click trigger - срабатывает, когда на NPC щелкают правой кнопкой мыши(ПКМ)
    chat trigger - срабатывает, когда в чате появляется определенная фраза или слово

    Этого нам хватит, чтобы написать первый скрипт. Давайте напишем телепортиста.
    Итак, создаем файл, я его назову teleport.yml, вы можете по другому
    И начинаем писать
    Код:
    Teleport: #имя скрипта
      type: assignment #говорим что это задание
      debug: false #выключаем вывод в консоль
      interact scripts: #скрипт, с которого начинаем
      - 100 telep #указываем перезагрузку 100 секунд и название, с которого начинаем
    
    telep: #название
      type: interact #говорим что это задание
      steps: #начинаем создавать шаги
        "question*": #первый шаг, * на конце нужна, если в скрипте есть несколько вариантов
          click trigger: #срабатываем только когда кликнули по NPC
            script: #пишем тело скрипта
            - random 2 #говорим, что будем использовать любой из 2 вариантов сообщений чата ниже
            - chat 'Ты хочешь чтобы я тебя перенес со спавна?' #первый вариант
            - chat 'Хочешь телепортироваться со спавна?' #второй вариант
          chat trigger: #назначаем триггер чата, он отслеживает сообщения или слова
            'Yes': #Имя триггера
              trigger: '/Да/!' #Если в чат написали да(без разницы как: да, Да, дА, ДА)
              script: #что делаем, если увидели да
              - chat 'Хорошо! Сейчас только прочитаю заклинание.' #выводим сообщение  от nps в чат
              - narrate '<npc.name> что-то бормочет себе под нос...' #выводим простое сообщение в чат с именем npc
              - playeffect cloud <player.location> qty:20 #задаем эффект на месте игрока с кол-вом 20
              - playeffect cloud <player.location> qty:30 #задаем эффект на месте игрока с кол-вом 30
              - playeffect cloud <player.location> qty:40 #задаем эффект на месте игрока с кол-вом 40
              - playeffect flame <player.location> qty:50 #задаем эффект на месте игрока с кол-вом 50
              - execute as_server 'tp @p 155 80 -87' #выполняем от имени консоль команду
              - playeffect flame <player.location> qty:50 #задаем эффект на месте игрока с кол-вом 50
              - chat 'Вы были телепортированы.' #выводим сообщение в чат от имени npc
              - zap 'step:succes' #переходим на шаг с именем succes
        'succes': #шаг с именем succes
            click trigger: #ждем щелчка по npc
                script: #начинаем скрипт
                - zap 'step:question' #переходим на шаг question, то есть в начало. Это будет цикл, чтобы телепортом можно было пользоваться всегда.
    
    Так же denizen позволяет создавать свои предметы для крафта!
    Давайте рассмотрим пример:

    Код:
    sharp_arrow: #название. т.к. это не задание, можно начинать сразу так
        type: item #тип : предмет
        debug: false #выключили режим отладки
        material: arrow #материал : стрела
        display name: Шрапнель #отображаемое имя
        lore: #текст у предмета
        - <&c>Шрапнель #1-я  строка
        - <&c>страшная вещь! #2-я  строка
        recipe: #крафт в верстаке
        - i@arrow|i@arrow|i@arrow #верх: стрела \ стрела \ стрела
        - i@air|i@air|i@air #середина пусто \ пусто  \ пусто
        - i@air|i@air|i@air #низ пусто \ пусто  \ пусто
    
    Все! Теперь при укладывании 3 стрел вверх мы получаем шрапнель.
     
    Последнее редактирование: 26 дек 2015
  2. Хостинг MineCraft
    <
  3. Автор темы
    snr93

    snr93 Активный участник Пользователь

    Баллы:
    88
    Дополнил данные, и теперь, с помощью них мы можем написать скрипт, запрещающий ломать нужный нам блок и заменять его на другой
    Код:
    #имя скрипта
    nocrashblock:
    #тип: если происходит в мире
        type: world
    #событие
        events:
    #если игрок разрушил песок то
            on player breaks sand:
    #выводим в чат что это делать нельзя
            - narrate Запрещено рушить <context.material>'
    #заменяем этот блок на блок земли
            - determine grass
     
    Последнее редактирование: 25 дек 2015
  4. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    http://rubukkit.org/threads/kak-naznachit-komandu-na-npc.114776/#post-1289584
    Забавно... Я тоже хотел туториал по Denizen'у написать)
    Да, кстати, быть может вы не знаете, с помощью скриптов Denizen можно создавать не только взаимодействия с НПС.
    Вот небольшой пример простого скрипта (скрипт не мой).
    Когда у игрока в руках факел - появляется свет. Если двигатся вместе с факелом то и свет будет двигатся за вами.
    Код:
    # @автор - mcmonkey
    
    torch_light_world:
        type: world
        debug: false
        events:
            on player steps on block:
            - if <player.has_flag[torch_light_prev]> {
              - light <context.previous_location> reset
              - flag player torch_light_prev:!
              }
            - if <player.item_in_hand.material.name> == torch {
              - light <context.location.add[0,1,0]> 14
              - flag player torch_light_prev
              }
            on player quits:
            - if <player.has_flag[torch_light_prev]> {
              - light <context.previous_location> reset
              - flag player torch_light_prev:!
              }
    
     
  5. Автор темы
    snr93

    snr93 Активный участник Пользователь

    Баллы:
    88
    [QUOTE="CoolBoy, Я тоже хотел туториал по Denizen'у написать)
    Да, кстати, быть может вы не знаете, с помощью скриптов Denizen можно создавать не только взаимодействия с НПС.
    Вот небольшой пример простого скрипта (скрипт не мой).
    Когда у игрока в руках факел - появляется свет. Если двигатся вместе с факелом то и свет будет двигатся за вами.
    Код:
    # @автор - mcmonkey
    
    torch_light_world:
        type: world
        debug: false
        events:
            on player steps on block:
            - if <player.has_flag[torch_light_prev]> {
              - light <context.previous_location> reset
              - flag player torch_light_prev:!
              }
            - if <player.item_in_hand.material.name> == torch {
              - light <context.location.add[0,1,0]> 14
              - flag player torch_light_prev
              }
            on player quits:
            - if <player.has_flag[torch_light_prev]> {
              - light <context.previous_location> reset
              - flag player torch_light_prev:!
              }
    
    [/QUOTE]
    Вообще о возможностях знаю, но реализация хромает т.к. Только учусь. Буду рад увидеть ваши знания)
     
  6. BroKUKA

    BroKUKA Активный участник Пользователь

    Баллы:
    76
    Молодец, полезная тема.[DOUBLEPOST=1451020697,1451020540][/DOUBLEPOST]Прикрепи ид предметов и добавь в тутор(или сделай новый)добавление эффектов к предмету(ид ихние тоже добавь)
     
  7. Lomu

    Lomu Активный участник

    Баллы:
    61
    Все! Теперь при укладывании 3 стрел вверх мы получаем шрапнель.
    Возник вопрос по поводу обращения к игроку. Скопировал скрипт, подкорректировал тексты. Но команда не исполняется, игрок не телепортируется. Ввел вместо @p свой ник, получилось. Что делать?
     
  8. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    - execute as_npc "tp <player.name> Х Y Z (координаты телепортации) указывай сам."
     
  9. Lomu

    Lomu Активный участник

    Баллы:
    61
    Только что решил эту проблему, пришел писать, и тут ты. Спасибо :)
     
  10. Никотин

    Никотин Активный участник Пользователь

    Баллы:
    76
    тема хорошая. Если нужно - могу помочь в создании скриптов/туториала
    P.S.: скорее всего после этого консоль будет невозможно читать
     
  11. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Скорее всего кто-то не умеет отключать логирование в консоль)
     
  12. Никотин

    Никотин Активный участник Пользователь

    Баллы:
    76
    не обращал на эту функцию никогда внимания)[DOUBLEPOST=1453235585,1453235359][/DOUBLEPOST]ну помимо этого...
    только этот скрипт будет чекать каждого игрока при перемещении из одного блока в другой.
    Даже если и отключить логирование. Нагрузку это не уменьшит.
    Как возможность плагина - действительно занятная. Но ведь если не ошибаюсь, там игрока проверяет при перемещении в каждый новый блок? А если он быстро будет перемещаться? А если их много?
    P.S.: в IRC плагина пытался задать вопрос одному из команды разработчиков, как сделать автоматические выплаты каждые 10-15 минут игрокам n-ную сумму денег (это как мне казалось должно быть ближе к реалиям повседневной жизни (к привычным зарплатам обычных людей). Так у него волосы на голове встали, когда я ему показал, как я при входе игрока на сервер запускаю в цикле
    - выдать денег
    - подождать некоторое время
    он меня пытался отговорить так делать из-за того, что это создает нагрузку.
    А тут вообще страшно представить, что будет происходить в игре, если сервер вообще не крашнется.
     
    Последнее редактирование: 19 янв 2016
  13. CoolBoy

    CoolBoy Активный участник Пользователь

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Хм, я лишь показал возможности плагина, а не саму функцию.
    Я включал её у себя как-то, при онлайне в 2 человека и 2 гб оперативы с набором из 30 плагинов тпс падал до 10. Да и играть становилось невозможно.
    Тем неменее, с помощью плагина можно делать "практически" всё.
    У меня например топ PvP'шеров одним скриптом выводится на таблички, так плюс еще и записывает топ в отдельный файлик. Да и сам топ можно командой проверить. И нагрузки от скрипта я пока не чувствую)
     
  14. Никотин

    Никотин Активный участник Пользователь

    Баллы:
    76
    тут согласен. Функциональность практически только фантазией ограничивается.[DOUBLEPOST=1453238316,1453238253][/DOUBLEPOST]ничего не имею против скрипта на топ, если только проверка не будет проходить чаще чем раз в несколько секунд:good:[DOUBLEPOST=1460954491][/DOUBLEPOST]Перекапывал туториалы плагина. В "Замену символов" можно добавить
    | = <&pipe>
    < = <&lt>
    > = <&gt>
    newline = <&nl>
    & = <&amp>
    ; = <&sc>
    [ = <&lb>
    ] = <&rb>
    @ = <&at>
    . = <&dot>
    \ = <&bs>
    ' = <&sq>
    " = <&quo>
    ! = <&exc>
    / = <&fs>
    § = <&ss>
     

Поделиться этой страницей