package co.d3s.ylt.chestplate.plate.object;
import java.util.HashMap;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Item;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.PressurePlate;
import org.bukkit.util.Vector;
import co.d3s.ylt.chestplate.ChestPlate;
import co.d3s.ylt.chestplate.plate.CP_Event;
import co.d3s.ylt.chestplate.plate.CP_Return;
public abstract class CP_Object {
public ChestPlate cp;
public CP_Object(ChestPlate cp) {
this.cp = cp;
}
public abstract Block find(Block block);
public abstract boolean check(Block block);
public abstract CP_Return interact(Block block, Entity item);
public void slidePickup(Entity item, double velocity) {
Vector a = item.getVelocity();
double angle = Math.atan2(a.getX(), a.getZ());
a.setX(Math.sin(angle)*velocity);
a.setZ(Math.cos(angle)*velocity);
a.setY(0.05);
item.setVelocity(a);
}
public void depressPlate(Block block) {
//*MAY* be inefficient, although unsure yet
cp.getServer().getScheduler().scheduleSyncDelayedTask(cp, new Plate_Depress(block.getLocation()), 5);
}
protected boolean isContainer(Block block) {
Material mat = block.getType();
switch (mat) {
case CHEST:
case DISPENSER:
case DROPPER:
case HOPPER:
return true;
}
return false;
}
protected CP_Return pickup(Block plate, Block container, Item item) {
BlockState blockstate = container.getState();
if (!(blockstate instanceof InventoryHolder))
return CP_Return.pass;
ItemStack stack = item.getItemStack();
Inventory inv = ((InventoryHolder)blockstate).getInventory();
HashMap<Integer, ItemStack> ret = inv.addItem(stack);
if (ret.size() == 0) {
stack.setAmount(0);
item.remove();
}
else {
int total = 0;
for (ItemStack s : ret.values()) {
total += s.getAmount();
}
stack.setAmount(total);
item.setItemStack(stack);
if (total == stack.getAmount()) {
slidePickup(item, 0.25);
return CP_Return.cancel;
}
}
depressPlate(plate);
slidePickup(item, 0.25);
return CP_Return.done;
}
}
class Plate_Depress implements Runnable {
Location loc;
public Plate_Depress(Location loc) {
this.loc = loc;
}
public void run() {
Block plate = loc.getBlock();
if (plate.getType() == Material.WOOD_PLATE) {
plate.setData((byte) 0);
}
}
}