Войти или зарегистрироваться

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

Можно ли на этом плагин сделать аномалии как в сталкере? А именно: игрок наступает на какой-нибудь блок, сверху блока появляется огонь, как от зажигалки, или же простой урон.
Пожалуйста. (код также лежит на 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!" - думаю поможет удалить этот файл.
 
Пожалуйста. (код также лежит на 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!" - думаю поможет удалить этот файл.
Благодарю
 
Пожалуйста. (код также лежит на 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!" - думаю поможет удалить этот файл.
воу-воу-воу, круто.
а можно метро, наподобие этого:
https://forum.greencubes.org/viewtopic.php?f=195&t=20590
https://wiki.greencubes.org/Блоки-контроллеры?
это было б полезно очень, очень многим.
 
Это из разряда: "Мы создали плагин, для написания плагинов, чтобы вам было удобнее их писать" А так плаг куул
 
Это из разряда: "Мы создали плагин, для написания плагинов, чтобы вам было удобнее их писать" А так плаг куул
зато теперь можно будет говорить:
"Мы прокачали твой плагин установив в него еще один плагин, чтобы когда работает твой плагин - работал и наш;)"
 
Хмм, нормально.
 
Уважаемые форумчане,
кто-то сталкивался с проблемой выполнения кода на питоне?
простейший пример:
[].
Python:
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)

зы: что случилось с редактором текста???
 
Последнее редактирование:
Уважаемые форумчане,
кто-то сталкивался с проблемой выполнения кода на питоне?
простейший пример:
[].
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)

зы: что случилось с редактором текста???
Вместо time.sleep нужно использовать чедулер буккита.
А для данного случая подойдет период:
Python:
periodId = workspace.addPeriod(лямбда,период,задержка)
Способ остановить период:
Python:
workspace.stopPeriod(periodId)
Питоном не пользуюсь, так что если напишу не так, сильно не пинайте:
Python:
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)
или такой способ (создать заранее несколько таймеров, если массив небольшой)
Python:
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
 
Вместо time.sleep нужно использовать чедулер буккита.
А для данного случая подойдет период:
Python:
periodId = workspace.addPeriod(лямбда,период,задержка)
Способ остановить период:
Python:
workspace.stopPeriod(periodId)
Питоном не пользуюсь, так что если напишу не так, сильно не пинайте:
Python:
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)
или такой способ (создать заранее несколько таймеров, если массив небольшой)
Python:
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
Спасибо огромное, все оперативно, сейчас попробуем)
Проверил второй способ.
Задержка во втором случае не работает, итератор мгновенно проскакивает все значения, плагин и игра не могут обработать с такой скоростью события - и как результат на выходе последнее значение(последний элемент списка)

В первом способе - я так понимаю ошибка.
Дабы было читабельнее убрал лямбду.
Получил вот эту прелесть
Python:
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
Великолепный код, дабы повалить сервак!
Пора спать!
 
Последнее редактирование:
Просто невозможно!
Какая работа была проделана!
Красава!
Очень полезный плагин для мини игр!
 
Спасибо огромное, все оперативно, сейчас попробуем)
Проверил второй способ.
Задержка во втором случае не работает, итератор мгновенно проскакивает все значения, плагин и игра не могут обработать с такой скоростью события - и как результат на выходе последнее значение(последний элемент списка)
Действительно, заметил.
Да простят мне классический косяк функционального программирования :lol:
Во втором случае нужно использовать замыкание вокруг переменной id:
Python:
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)
}
 
Последнее редактирование:
Действительно, заметил.
Да простят мне классический косяк функционального программирования :lol:
Во втором случае нужно использовать замыкание вокруг переменной id:
Python:
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)
}
Надобно будет приглядеться поближе к груви:)
А DarkRuna вы на новую версию переводите?
Или забросили ее?
 
А DarkRuna вы на новую версию переводите?
Или забросили ее?
Ближайший на очереди стоит PowerTower, но на него слишком много планов, соответственно и много работы. В общем, медленно движется.
DarkRuna в текущем виде не планируется. Был вариант - сделать альтернативную похожую мини-игру, сильно упростить ее до трех действий: собрал руну, шмальнул в противника, уклонился от его атаки.
Всё в долгом ящике.
 
Чел, почему тебя в девелоперы не перевели?
За такую работу я думаю это стоит сделать.
 
Ближайший на очереди стоит PowerTower, но на него слишком много планов, соответственно и много работы. В общем, медленно движется.
DarkRuna в текущем виде не планируется. Был вариант - сделать альтернативную похожую мини-игру, сильно упростить ее до трех действий: собрал руну, шмальнул в противника, уклонился от его атаки.
Всё в долгом ящике.
прекрасно понимаю:)
Много идей, мало ресурсов(людей, времени)
Насчет PowerTower читал, если копать в нужную сторону - это может выйти очень эффектная вещь!

Чел, почему тебя в девелоперы не перевели?
За такую работу я думаю это стоит сделать.
ты не первый, кто задался этим вопросом;)
 
Последнее редактирование:
А можно пример скрипта на python. Человек заходит на сервер и ему пишут в чат: "Добропожаловать, %username%"
 
Python!!!!
 
Последнее редактирование:
Назад
Верх