Я пытаюсь реализовать с помощью 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 и т.д.). Ну, и упомяну, что алгоритм придумал только что, и соответственно, не проверял работоспособность.