package com.nisovin.magicspells.util;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.block.BlockPlaceEvent;
import com.nisovin.magicspells.MagicSpells;
import com.nisovin.magicspells.materials.MagicMaterial;
public class TemporaryBlockSet implements Runnable {
private Material original;
private MagicMaterial replaceWith;
private boolean callPlaceEvent;
private Player player;
private ArrayList<Block> blocks;
private BlockSetRemovalCallback callback;
public TemporaryBlockSet(Material original, MagicMaterial replaceWith, boolean callPlaceEvent, Player player) {
this.original = original;
this.replaceWith = replaceWith;
this.callPlaceEvent = callPlaceEvent;
this.player = player;
this.blocks = new ArrayList<Block>();
}
public void add(Block block) {
if (block.getType() == original) {
if (callPlaceEvent) {
BlockState state = block.getState();
replaceWith.setBlock(block, false);
BlockPlaceEvent event = new BlockPlaceEvent(block, state, block, player.getItemInHand(), player, true);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
BlockUtils.setTypeAndData(block, original, (byte)0, false);
} else {
blocks.add(block);
}
} else {
replaceWith.setBlock(block);
blocks.add(block);
}
}
}
public boolean contains(Block block) {
return blocks.contains(block);
}
public void removeAfter(int seconds) {
removeAfter(seconds, null);
}
public void removeAfter(int seconds, BlockSetRemovalCallback callback) {
if (blocks.size() > 0) {
this.callback = callback;
MagicSpells.scheduleDelayedTask(this, seconds*20);
}
}
public void run() {
if (callback != null) {
callback.run(this);
}
remove();
}
public void remove() {
for (Block block : blocks) {
if (replaceWith.equals(block)) {
block.setType(original);
}
}
player = null;
}
public interface BlockSetRemovalCallback {
public void run(TemporaryBlockSet set);
}
}