1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Плагин [ADMN/DEV/FUN] VarScript 1.2 - Пишем скрипты на Groovy

Тема в разделе "Релизы плагинов", создана пользователем DPOH-VAR, 29 сен 2012.

  1. MYXOMOPX

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

    Баллы:
    78
    Skype:
    MYXOMOPX
    Имя в Minecraft:
    MYXOMOPX
    Пожалуйста. (код также лежит на pastebin)
    Код:
    import org.bukkit.Bukkit
    import org.bukkit.Location
    import org.bukkit.Material
    import org.bukkit.block.Block
    import org.bukkit.block.BlockFace
    import org.bukkit.command.Command
    import org.bukkit.command.CommandSender
    import org.bukkit.entity.Player
    import org.bukkit.event.player.PlayerMoveEvent
    import org.yaml.snakeyaml.DumperOptions
    import org.yaml.snakeyaml.Yaml
    
    import java.util.logging.Level
    
    List<Block> traps = []
    
    Yaml yaml = new Yaml(new DumperOptions(defaultFlowStyle: DumperOptions.FlowStyle.BLOCK))
    
    File playerStatsFile = new File(workspace.directory,"traps.yml")
    
    /** При старте загружаем все статы из файла **/
    playerStatsFile.createNewFile()
    playerStatsFile.withInputStream {
        try {
            List<HashMap<String,Object>> loadedList = yaml.load(it) as List<HashMap<String,Object>>;
            loadedList.each { HashMap<String,Object> el ->
                traps.add(new Location(Bukkit.getWorld(el.world as String),
                        el.x as double,
                        el.y as double,
                        el.z as double)
                        .block)   ;
            };
        }catch (ignored){
            Bukkit.getLogger().log(Level.WARNING,"[Traps] Can't load traps file!",ignored)
            workspace.stop()
        }
    }
    
    workspace.addFinisher({
        List<HashMap<String,Object>> listToSave = []
        traps.each {
            listToSave.add([x:it.location.x,y:it.location.y,z:it.location.z,world:it.location.world.name])
        }
        playerStatsFile.withOutputStream {
            String dump = yaml.dump(listToSave)
            try {
                it.write(dump.getBytes("UTF8"))
            } catch (ignored) {
                Bukkit.getLogger().log(Level.WARNING,"[Traps] Can't save traps to file!",ignored)
            }
        }
    })
    
    List<Player> damagedPalyers = [];
    
    workspace.addEvent({PlayerMoveEvent event ->
        if(damagedPalyers.contains(event.player) && !(traps.contains(event.to.block))){
            damagedPalyers.remove(event.player)
            return
        }
        if(traps.contains(event.to.block) && !(damagedPalyers.contains(event.player))){
            Player plr = event.player
            plr.setFireTicks(20*7)
            damagedPalyers.add(plr)
            plr.sendMessage("\u00A74You been trapped!")
        }
    },PlayerMoveEvent)
    
    workspace.addCommand("addtrap",{ CommandSender commandSender, Command command, String s, String[] strings ->
        if(!(commandSender instanceof Player)) return false;
        Player player = commandSender
        if(!player.hasPermission("trap.add")){
            player.sendMessage("\u00A74You have not permissions!")
            return true;
        }
        Block bl = player.getTargetBlock(null,10)
        if(bl == null){
            player.sendMessage("\u00A74Block not selected!")
            return true;
        }
        bl = bl.getRelative(BlockFace.UP)
        if(traps.contains(bl)){
            player.sendMessage("\u00A76This block already have trap!")
            return true;
        }
        traps.add(bl)
        player.sendMessage("\u00A7aTrap successful created!")
        return true;
    })
    
    workspace.addCommand("removetrap",{ CommandSender commandSender, Command command, String s, String[] strings ->
        if(!(commandSender instanceof Player)) return false;
        Player player = commandSender
        if(!player.hasPermission("trap.remove")){
            player.sendMessage("\u00A74You have not permissions!")
            return true;
        }
        Block bl = player.getTargetBlock(null,10)
        if(bl == null){
            player.sendMessage("\u00A74Block not selected!")
            return true;
        }
        bl = bl.getRelative(BlockFace.UP)
        if(traps.contains(bl)) {
            player.sendMessage("\u00A7aTrap successful removed!")
            traps.remove(bl);
        }else {
            player.sendMessage("\u00A76This block not trapped!")
        }
        return true
    })
    
    Сохранить в /plugins/VarScript/workspace/TrapBlock/Main.groovy
    (при отсутствии какой-либо директории - создать ее)

    Для добавления ловушки команда: /addtrap
    Для удаления - /removetrap
    В обоих случаях берется блок на 1 выше чем тот, на который смотрит игрок.
    Пермиты:
    trap.add - для добавления ловушки
    trap.remove - для удаление ловушки
    Все ловушки хранятся в traps.yml
    Если будет в консоль вываливаться "[Traps] Can't load traps file!" - думаю поможет удалить этот файл.
     
  2. StalkerStels

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

    Баллы:
    88
    Имя в Minecraft:
    STELS
    Благодарю
     
  3. Benseeley

    Benseeley Старожил Пользователь

    Баллы:
    123
    воу-воу-воу, круто.
    а можно метро, наподобие этого:
    https://forum.greencubes.org/viewtopic.php?f=195&t=20590
    https://wiki.greencubes.org/Блоки-контроллеры?
    это было б полезно очень, очень многим.
     
  4. EternalHuman

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

    Баллы:
    88
    Имя в Minecraft:
    Artarious
    Это из разряда: "Мы создали плагин, для написания плагинов, чтобы вам было удобнее их писать" А так плаг куул
     
  5. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    зато теперь можно будет говорить:
    "Мы прокачали твой плагин установив в него еще один плагин, чтобы когда работает твой плагин - работал и наш;)"
     
  6. Insafka16

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

    Баллы:
    76
    Skype:
    Evgeniy_Hilton
    Имя в Minecraft:
    Insafka16
    Хмм, нормально.
     
  7. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    Уважаемые форумчане,
    кто-то сталкивался с проблемой выполнения кода на питоне?
    простейший пример:
    [].
    Код:
    import time
    block = me.getTargetBlock(None,32)
    # for x in xrange(1, 10): пришлось убрать xrange, а то блок вообще не изменялся
    #time к слову тоже вызывает Exception, через время, конечно
    
    idList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    for x in idList:
         block.typeId = x
         time.sleep(1)

    зы: что случилось с редактором текста???
     
    Последнее редактирование: 23 июл 2014
  8. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Вместо time.sleep нужно использовать чедулер буккита.
    А для данного случая подойдет период:
    Код:
    periodId = workspace.addPeriod(лямбда,период,задержка)
    Способ остановить период:
    Код:
    workspace.stopPeriod(periodId)
    Питоном не пользуюсь, так что если напишу не так, сильно не пинайте:
    Код:
    block = me.getTargetBlock(None,32)
    
    idList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    periodId = workspace.addPeriod(lambda:
        block.typeId = idList.pop(0)
        if not idList:
            workspace.stopPeriod(periodId)
    ,20,0)
    или такой способ (создать заранее несколько таймеров, если массив небольшой)
    Код:
    block = me.getTargetBlock(None,32)
    
    idList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    interval = 20
    delay = interval
    for id in inList: 
        workspace.addDelay(lambda:
            block.typeId = id
        ,delay)
        delay = delay + interval
     
  9. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    Спасибо огромное, все оперативно, сейчас попробуем)
    Проверил второй способ.
    Задержка во втором случае не работает, итератор мгновенно проскакивает все значения, плагин и игра не могут обработать с такой скоростью события - и как результат на выходе последнее значение(последний элемент списка)

    В первом способе - я так понимаю ошибка.
    Дабы было читабельнее убрал лямбду.
    Получил вот эту прелесть
    Код:
    def animatioN():
       block = me.getTargetBlock(None,32)
       idList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
       def getBlockID(iList, Block):
         Block.typeId = iList.pop(0)
    
       periodId = workspace.addPeriod(getBlockID(idList, block),20,0)
       if not iList:
         workspace.stopPeriod(PeriodId)
    
    Да, именно она словила Exception :D
    Великолепный код, дабы повалить сервак!
    Пора спать!
     
    Последнее редактирование: 23 июл 2014
  10. Bonedon

    Bonedon Активный участник Пользователь Заблокирован

    Баллы:
    88
    Просто невозможно!
    Какая работа была проделана!
    Красава!
    Очень полезный плагин для мини игр!
     
  11. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Действительно, заметил.
    Да простят мне классический косяк функционального программирования :lol:
    Во втором случае нужно использовать замыкание вокруг переменной id:
    Код:
    block = me.getTargetBlock(None,32)
    idList = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    def changeBlockIdTask (id):
        def inner ():
            block.typeId = id
        return inner
    
    interval = 20
    delay = interval
    for id in idList:
        workspace.addDelay(changeBlockIdTask(id), delay)
        delay += interval
    if not iList: workspace.stopPeriod(PeriodId)
    Это нужно проверять при каждом проходе периода. Т.е. внутри него.
    periodId = workspace.addPeriod(getBlockID(idList, block),20,0)
    для функции addPeriod первым аргументом нужно передавать лямбду или ссылку на функцию. В таком виде это работать не будет.

    UPD:
    В груви, например, нет проблем с замыканием переменных по циклу.
    Если применять .each(Closure)
    Код:
    block = me.getTargetBlock(null,32)
    idList = 1..9
    
    def delay = 0
    idList.each { id ->
        workspace.addDelay({block.typeId = id},delay += 20)
    }
     
    Последнее редактирование: 23 июл 2014
  12. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    Я пытался добиться проверки внутри функции, но ловил ексепшн. Глаза слипались, но я уж очень хотел добить этот скриптик.
    Заработало!
    Надобно будет приглядеться поближе к груви:)
    А DarkRuna вы на новую версию переводите?
    Или забросили ее?
     
  13. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Ближайший на очереди стоит PowerTower, но на него слишком много планов, соответственно и много работы. В общем, медленно движется.
    DarkRuna в текущем виде не планируется. Был вариант - сделать альтернативную похожую мини-игру, сильно упростить ее до трех действий: собрал руну, шмальнул в противника, уклонился от его атаки.
    Всё в долгом ящике.
     
  14. Bonedon

    Bonedon Активный участник Пользователь Заблокирован

    Баллы:
    88
    Чел, почему тебя в девелоперы не перевели?
    За такую работу я думаю это стоит сделать.
     
  15. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    прекрасно понимаю:)
    Много идей, мало ресурсов(людей, времени)
    Насчет PowerTower читал, если копать в нужную сторону - это может выйти очень эффектная вещь!

    ты не первый, кто задался этим вопросом;)
     
    Последнее редактирование: 24 июл 2014
  16. cyber_lis

    cyber_lis Активный участник Девелопер Пользователь

    Баллы:
    68
    А можно пример скрипта на python. Человек заходит на сервер и ему пишут в чат: "Добропожаловать, %username%"
     
  17. Artem0001

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

    Баллы:
    78
    Имя в Minecraft:
    eWaster
    Python!!!!
     
    Последнее редактирование: 12 авг 2014
  18. EternalHuman

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

    Баллы:
    88
    Имя в Minecraft:
    Artarious
    Если говорить грамотным языком, то Python
     
  19. cyber_lis

    cyber_lis Активный участник Девелопер Пользователь

    Баллы:
    68
    :cry::cry::cry::cry::cry::cry::cry:
    Ахахаххахахха. Это кажется называется выпендрился
     
  20. Artem0001

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

    Баллы:
    78
    Имя в Minecraft:
    eWaster
    а так)))0
     

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