Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [MECH/FUN] ReActions - Что? Тогда? Иначе! [BukkitDev]

И тут ещё пару вопросов накатилось:
Можно ли реаком отменить смерть?
И ещё интересен такой вопрос: У меня есть система авто-шахты, которая сама восстанавливается, однако для её работоспособности в регионе mine на спавне разрешено ломать блоки. Главная проблема состоит в том, что будучи в регионе спавна можно ломать те блоки, что находятся в регионе mine, а в самом mine нельзя, ибо стоит фикс реаковский. Как можно не создавая новые регионы исправить эту беду? Дело в том, что вайпы у нас происходят по строгой схеме, и вот любые изменения на спавне как не крути откатятся, а создавать доп. регионы при каждом вайпы у нас не вариант, по этому нужно думать.
 
@imDaniX если у тебя есть свой форк на реак, то может быть найдётся и на плейЭффект? Это новая жизнь была бы для моего режима, ядро которого 1.12.2, а вот плейЭффекта выше чем на 1.11 нигде не видел.
А ему нужно обновление? Команды вроде не работали, а вот в РеА он ещё действовал.
Можно ли реаком отменить смерть?
Отслеживай DAMAGE. Если урон выше здоровья - отменяй. Но есть проблема - там учитывается урон, который игнорирует броню, потому что в коде плагина не учтен finalDamage. Как обойти это, кроме как исправлением в коде плагина, не знаю.
И ещё интересен такой вопрос: У меня есть система авто-шахты, которая сама восстанавливается, однако для её работоспособности в регионе mine на спавне разрешено ломать блоки. Главная проблема состоит в том, что будучи в регионе спавна можно ломать те блоки, что находятся в регионе mine, а в самом mine нельзя, ибо стоит фикс реаковский. Как можно не создавая новые регионы исправить эту беду? Дело в том, что вайпы у нас происходят по строгой схеме, и вот любые изменения на спавне как не крути откатятся, а создавать доп. регионы при каждом вайпы у нас не вариант, по этому нужно думать.
Честно говоря, не понял вопроса. Сможешь перефразировать?
 
Задача по математике 8б класса :y
Есть на спавне 2 региона, сам спавн и шахта.
Шахта работает на основе реака, ей важно что бы ты сломал блок, и как раз в регионе шахты разрешено ломать блоки флагом block-break в WG.
Будучи в регионе шахты все твои сломанные блоки отменяются, то есть не ломаются, но там они дают монеты и временно всё же восстанавливаются сломанные руды.
Выйдя за приделы шахты и будучи на спавне шахту можно ломать и ничего не отменяется.
При вайпе слетают все изменения, по этому создавать новые регионы нельзя.
Поставить условием, что бы блоки отменялись при ломании и когда ты в регионе спавна - не вариант, потому что другие админы могут быть против.
 
Привет всем, как сделать выполнение команды с определенным шансом?

допустим есть команда /kick с шансом выполнения 90%, а есть команда /ban с шансом выполнения 10%
 
А ему нужно обновление? Команды вроде не работали, а вот в РеА он ещё действовал.
Ты оказался прав, команды пусть и не запускаются от самого плейЭффекта, но эффекты отображаются при запуске их реаком, что очень круто.
 
Прям повторить не получится, но можно что-то да сделать: например, использовать активатор DAMAGE с cause: FALL, проверить наличие ботинок; если есть - отменить событие, попробовать посчитать примерную высоту по полученному урону через плейсхолдер CALC, и наконец использовать действие VELOCITY. Опять же, есть два "но" - во-первых, не сохранится горизонтальный вектор игрока; во-вторых, просчет по урону может быть нестабильный из-за брони.
Не знаю почему, но при попытке вставить больше одного CALC VELOCITY по сути перестаёт действовать.
%CALC:0+1%,1,1 - даёт эффект.
%CALC:0+1%,%CALC:%0+1,%CALC:0+1% - ничего не делает.
 
Отслеживай DAMAGE. Если урон выше здоровья - отменяй. Но есть проблема - там учитывается урон, который игнорирует броню, потому что в коде плагина не учтен finalDamage. Как обойти это, кроме как исправлением в коде плагина, не знаю.
Интересно, можно ли самолично как то это исправить в коде, звучит почти как копипаста обычного полученного урона на всегда только итоговый урон :y
 
Работать с предметами в РеА довольно больно. Можешь попробовать получать описание через плейсхолдер %player_item_hand% и обработать через REGEX в поисках lore:{Количество убийств (\d+)}, далее нужно удалить предмет и выдать такой же, но подставив уже своё описание... Работать это будет довольно криво.
Ещё эту систему сильно убивает то, что реак не видит НБТ теги, от чего появляются уже некоторые ограничения для моего рода деятельности.
 
Ещё эту систему сильно убивает то, что реак не видит НБТ теги, от чего появляются уже некоторые ограничения для моего рода деятельности.
Лучше порвать а*ус но перейти на Skript, поверь там есть всё. (Кроме манипуляции пакетами, но их можно туда всунуть правда это ближе к java)
 
Лучше порвать а*ус но перейти на Skript, поверь там есть всё. (Кроме манипуляции пакетами, но их можно туда всунуть правда это ближе к java)
Моя главная проблема заключается в том, что Я с самого начала играл подручным одной моей знакомой. У неё было всё, а у меня только команды в игре. Так и получилось, что чаще всего Я пытался всё делать через чат, даже сейчас Я бы с нуля не написал простейшие скрипты чисто в конфиге. Моей участи не позавидуешь.
 
Есть ли возможность задать Velocity какому-то иному энтити, помимо игрока?
 
Хочу сделать так, что бы игрок мог при нажатии на сундук, получить награду только один раз. Сейчас игрок получает награду столько, сколько тыкнет на сундук. В чём может быть ошибка?
Код:
  reward1:
    block-type: CHEST
    click-type: ANY
    location: world,-877.0,74.0,-376.0,0.0,0.0
    actions:
    - VAR_PLAYER_SET=id:1
    - CMD_OP=hero admin exp %player% warrior 10
    - MESSAGE=&eВам начислен опыт
    reactions:
    - if_else=if:{%VAR_EXIST%==1}
                then:run:actions:{
                    action1:{MESSAGE=Вы уже открывали данный сундук.}
                    action2:{CANCEL_EVENT=true}
                }
                else:{}
 
Хочу сделать так, что бы игрок мог при нажатии на сундук, получить награду только один раз. Сейчас игрок получает награду столько, сколько тыкнет на сундук. В чём может быть ошибка?
Код:
  reward1:
    block-type: CHEST
    click-type: ANY
    location: world,-877.0,74.0,-376.0,0.0,0.0
    actions:
    - VAR_PLAYER_SET=id:1
    - CMD_OP=hero admin exp %player% warrior 10
    - MESSAGE=&eВам начислен опыт
    reactions:
    - if_else=if:{%VAR_EXIST%==1}
                then:run:actions:{
                    action1:{MESSAGE=Вы уже открывали данный сундук.}
                    action2:{CANCEL_EVENT=true}
                }
                else:{}
Полагаю - в том, что плейсхолдера %VAR_EXIST% не существует, или вместо "==1" необходимо использовать "==true".
 
Код:
[18:58:41 ERROR]: Could not pass event ItemClickEvent to ReActions v0.11.1
java.lang.StringIndexOutOfBoundsException: begin 7, end 5, length 5
        at java.lang.String.checkBoundsBeginEnd(String.java:3751) ~[?:?]
        at java.lang.String.substring(String.java:1907) ~[?:?]
        at java.lang.String.substring(String.java:1880) ~[?:?]
        at org.bukkit.craftbukkit.v1_17_R1.legacy.CraftLegacy.name(CraftLegacy.java:246) ~[patched_1.17.1.jar:git-Paper-408]
        at me.fromgate.reactions.util.item.VirtualItem.compare(VirtualItem.java:1153) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.util.item.VirtualItem.compare(VirtualItem.java:1107) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.util.item.VirtualItem.compare(VirtualItem.java:1101) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.util.item.ItemUtil.compareItemStr(ItemUtil.java:175) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.activators.ItemClickActivator.activate(ItemClickActivator.java:58) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.activators.Activator.executeActivator(Activator.java:231) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.activators.Activators.activate(Activators.java:330) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.util.listeners.RaListener.onItemClickActivator(RaListener.java:600) ~[ReActions (1).jar:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor400.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.17.1.jar:git-Paper-408]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:628) ~[patched_1.17.1.jar:git-Paper-408]
        at me.fromgate.reactions.event.EventManager.raiseItemClickEvent(EventManager.java:173) ~[ReActions (1).jar:?]
        at me.fromgate.reactions.util.listeners.RaListener.onPlayerInteract(RaListener.java:430) ~[ReActions (1).jar:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor420.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.17.1.jar:git-Paper-408]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:628) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:543) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:506) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:501) ~[patched_1.17.1.jar:git-Paper-408]
        at org.bukkit.craftbukkit.v1_17_R1.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:497) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.handleUseItem(ServerGamePacketListenerImpl.java:1867) ~[app:?]
        at net.minecraft.network.protocol.game.ServerboundUseItemPacket.handle(ServerboundUseItemPacket.java:28) ~[app:?]
        at net.minecraft.network.protocol.game.ServerboundUseItemPacket.a(ServerboundUseItemPacket.java:8) ~[app:?]
        at net.minecraft.network.protocol.PacketUtils.lambda$ensureRunningOnSameThread$1(PacketUtils.java:56) ~[app:?]
        at net.minecraft.server.TickTask.run(TickTask.java:18) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:149) ~[app:?]
        at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:23) ~[app:?]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1426) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.server.MinecraftServer.executeTask(MinecraftServer.java:192) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:122) ~[app:?]
        at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1404) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1397) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.util.thread.BlockableEventLoop.runAllTasks(BlockableEventLoop.java:110) ~[app:?]
        at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1536) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1282) ~[patched_1.17.1.jar:git-Paper-408]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319) ~[patched_1.17.1.jar:git-Paper-408]
        at java.lang.Thread.run(Thread.java:831) ~[?:?]
 
Хочу сделать так, что бы игрок мог при нажатии на сундук, получить награду только один раз. Сейчас игрок получает награду столько, сколько тыкнет на сундук. В чём может быть ошибка?
Код:
  reward1:
    block-type: CHEST
    click-type: ANY
    location: world,-877.0,74.0,-376.0,0.0,0.0
    actions:
    - VAR_PLAYER_SET=id:1
    - CMD_OP=hero admin exp %player% warrior 10
    - MESSAGE=&eВам начислен опыт
    reactions:
    - if_else=if:{%VAR_EXIST%==1}
                then:run:actions:{
                    action1:{MESSAGE=Вы уже открывали данный сундук.}
                    action2:{CANCEL_EVENT=true}
                }
                else:{}
Не особо понятно, на что ты рассчитываешь, если у тебя не написан никакой флаг. Reactions выполняется, если флаг не выполнился. А у тебя он каждый раз втупую выполняет все твои действия в actions
 
Я пытаюсь реализовать с помощью ReActions регенератор руды для авто-шахты. Суть в том, что бы сломанная руда через определённый промежуток времени восстанавливалась на том же месте. При реализации столкнулся с такой проблемой, что после ломания нескольких руд одного типа, восстанавливается только последний сломанный блок. Для временного решения этой проблемы, сделал громоздкий костыль, где для каждого блока руды пришлось прописать отдельную переменную, которая хранит координаты c %blockbreak% этого блока и всё это засунул в очередь. Я думаю это можно сделать куда проще и лучше, но не знаю как. Может кто подскажет более практичное решение?
Код:
REGION_ENTER:
  varon:
    region: spawn
    actions:
    - var_player_set=id:queue value:0
BLOCK_BREAK:
  diamond:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:0
    actions:
    - VAR_PLAYER_SET=id:cord value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:1
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord
  diamond1:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:1
    actions:
    - VAR_PLAYER_SET=id:cord1 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:2
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord1%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord1% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord1
  diamond2:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:2
    actions:
    - VAR_PLAYER_SET=id:cord2 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:3
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord2%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord2% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord2
  diamond3:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:3
    actions:
    - VAR_PLAYER_SET=id:cord3 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:4
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord3%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord3% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord3
  diamond4:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:4
    actions:
    - VAR_PLAYER_SET=id:cord4 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:0
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord4%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord4% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord4
 
Последнее редактирование:
Я пытаюсь реализовать с помощью ReActions регенератор руды для авто-шахты. Суть в том, что бы сломанная руда через определённый промежуток времени восстанавливалась на том же месте. При реализации столкнулся с такой проблемой, что после ломания нескольких руд одного типа, восстанавливается только последний сломанный блок. Для временного решения этой проблемы, сделал громоздкий костыль, где для каждого блока руды пришлось прописать отдельную переменную, которая хранит координаты c %blockbreak% этого блока и всё это засунул в очередь. Я думаю это можно сделать куда проще и лучше, но не знаю как. Может кто подскажет более практичное решение?
Код:
REGION_ENTER:
  varon:
    region: spawn
    actions:
    - var_player_set=id:queue value:0
BLOCK_BREAK:
  diamond:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:0
    actions:
    - VAR_PLAYER_SET=id:cord value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:1
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord
  diamond1:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:1
    actions:
    - VAR_PLAYER_SET=id:cord1 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:2
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord1%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord1% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord1
  diamond2:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:2
    actions:
    - VAR_PLAYER_SET=id:cord2 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:3
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord2%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord2% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord2
  diamond3:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:3
    actions:
    - VAR_PLAYER_SET=id:cord3 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:4
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord3%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord3% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord3
  diamond4:
    block: type:diamond_ore
    flags:
    - VAR_PLAYER_COMPARE=id:queue value:4
    actions:
    - VAR_PLAYER_SET=id:cord4 value:%blocklocation%
    - WAIT=time:1ms
    - var_player_set=id:queue value:0
    - WAIT=time:1ms
    - block_set=block:type:STONE loc:%varp:cord4%
    - MESSAGE=&2+1$
    - WAIT=time:60s
    - block_set=loc:%varp:cord4% block:diamond_ore
    - VAR_PLAYER_CLEAR=id:cord4
Ну, для начала, я бы все же предложил взять полноценный плагин для этого, а не пытаться реализовать на РеА. Так будет и быстрее, и эффективнее, и просто надежнее.

Если же все же браться... Для начала, создать две переменные, например mined-next-id - она будет отвечать за установку id для каждого сломанного блока, и mined-pointer - будет указывать, какой id должен быть регенерирован позже. Обе переменные стоит заранее установить на 0. Также будет динамично генерировать переменные mined-<id>. Далее добавляем таймер на каждую секунду, который и будет заниматься регенерированием блоков.

При разрушении нужного блока:
- записываем %blocklocation% в переменную mined-%var:mined-next-id%;
- делаем DELAY (действие) на необходимое время для mined-delay-%var:mined-next-id%;
- увеличиваем mined-next-id на 1.

Для таймера:
- проверяем, истек ли DELAY (флаг) у mined-delay-%var:mined-pointer% (если нет, то ничего не делаем);
- проверяем через VAR_GREATER, является ли переменная mined-pointer больше значения %var:mined-next-id% (если да, то ничего не делаем);
- устанавливаем нужный блок на %var:mined-%var:mined-pointer%%;
- очищаем переменную mined-%var:mined-pointer%, чтобы место не занимало;
- увеличиваем mined-pointer на 1.

Подмечу, что все должно делаться не в переменных игрока, а в обычных (VAR_CLEAR, VAR_SET и т.д.). Ну, и упомяну, что алгоритм придумал только что, и соответственно, не проверял работоспособность.
 
Обновил плагин, перестали работать задержки в активаторе.

EXEC:
block_remove_parkur:
actions:
- execute=activator:block_remove delay:5s

Активатор обрабатывает моментально. Раньше этот же код работал.
 

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

Назад
Верх