Восстановление блоков

Статус
Закрыто для дальнейших ответов.

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Есть задача
BlockBreakEvent -> event#getBlock() -> block.setType(Material.BEDROCK) -> after N seconds block.setType(material)

Если сломался условный блок, то превратить его в бедрок и после N секунд восстановить в первоначальный тип.


Handler: https://pastebin.com/hPLtXMhb
RestoreManager -> https://pastebin.com/hefH8qWF

RestoreManager тикает каждые 20 тиков.

Проблема в том, что если я добавляю задачу на возобновление блока в методе, куда пришёл эвент, то блок никогда не превратится в бедрок.
Ибо сразу после эвента он становится воздухом. Понятное дело, что нужно выполнить setType(bedrock) спустя тик(после эвента).

Смысл RestoreManager в том, что восстанавливать все блоки в одном потоке,а не делать для каждого runTaskLater.
Но если решать проблему с бедроком, то получается половина задачи всё равно будет решаться runTask, что как по мне не очень.

Может подскажите решение получше ?
 
Map<Material, Long> materialDelays при каждом тике
materialDelay = ...getOrDefault{Material.BEDROCK, 0};
...put{Material.BEDROCK, materialDelay++};
 
Код:
package Example.task;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;

public class Data {
    private BlockData data;
    private Location loc;
    private boolean place;
    private long time;

    public Data(Block block, long time) {
        this.data = block.getBlockData();
        this.loc = block.getLocation();
        this.time = time;
    }

    public boolean tick() {
        if (!this.place) {
            this.loc.getWorld().getBlockAt(this.loc).setType(Material.BEDROCK);
            this.place = true;
        }
        if (this.time == 0) {
            this.loc.getWorld().getBlockAt(this.loc).setBlockData(this.data);
            return true;
        }
        this.time--;
        return false;
    }

    public boolean stop() {
        this.loc.getWorld().getBlockAt(this.loc).setBlockData(this.data);
        return true;
    }
}

Код:
package Example.task;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.block.Block;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;

public class SchedulerBlock extends BukkitRunnable {
    private List<Data> blocks = new ArrayList<Data>();

    public SchedulerBlock(Plugin plugin) {
        this.runTaskTimer(plugin, 1, 1);
    }

    @Override
    public void run() {
        this.blocks.removeIf(data -> data.tick());
    }

    public void put(Block block, long time) {
        this.blocks.add(new Data(block, time));
    }

    @Override
    public void cancel() {
        this.cancel();
        this.blocks.removeIf(data -> data.stop());
    }
}
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх