package com.nisovin.magicspells.materials; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.FallingBlock; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; public abstract class MagicMaterial { public abstract Material getMaterial(); public abstract MaterialData getMaterialData(); public final void setBlock(Block block) { setBlock(block, true); } public void setBlock(Block block, boolean applyPhysics) {} public FallingBlock spawnFallingBlock(Location location) { return null; } public final ItemStack toItemStack() { return toItemStack(1); } public abstract ItemStack toItemStack(int quantity); public final boolean equals(Block block) { return equals(block.getState().getData()); } public boolean equals(MaterialData matData) { MaterialData d = getMaterialData(); if (d != null) { return d.equals(matData); } else { return false; } } public boolean equals(ItemStack itemStack) { MaterialData d = getMaterialData(); if (d != null) { ItemStack i = d.toItemStack(); return i.getType() == itemStack.getType() && i.getDurability() == itemStack.getDurability(); } else { return false; } } @Override public boolean equals(Object o) { if (o instanceof MagicMaterial) { MagicMaterial m = (MagicMaterial)o; return m.getMaterial() == getMaterial() && m.getMaterialData().equals(getMaterialData()); } return false; } @Override public int hashCode() { return getMaterial().hashCode(); } public static MagicMaterial fromItemStack(ItemStack item) { if (item.getType().isBlock()) { return new MagicBlockMaterial(item.getData()); } return new MagicItemMaterial(item.getData()); } public static MagicMaterial fromBlock(Block block) { return new MagicBlockMaterial(block.getState().getData()); } }