package openblocks.common;
import cpw.mods.fml.common.eventhandler.Event;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.BlockFence;
import net.minecraft.block.BlockFenceGate;
import net.minecraft.block.BlockJukebox.TileEntityJukebox;
import net.minecraft.block.BlockSand;
import net.minecraft.block.BlockStairs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityBoat;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityBeacon;
import net.minecraft.tileentity.TileEntityBrewingStand;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.tileentity.TileEntityCommandBlock;
import net.minecraft.tileentity.TileEntityDispenser;
import net.minecraft.tileentity.TileEntityEnchantmentTable;
import net.minecraft.tileentity.TileEntityEnderChest;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.tileentity.TileEntityHopper;
import net.minecraft.tileentity.TileEntityNote;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import openmods.utils.ITester;
import openmods.utils.ObjectTester;
import openmods.utils.ObjectTester.ClassNameTester;
import openmods.utils.ObjectTester.ClassTester;
public class MagnetWhitelists {
public final static MagnetWhitelists instance = new MagnetWhitelists();
public static class BlockCoords {
public final Block block;
public final World world;
public final int x;
public final int y;
public final int z;
public BlockCoords(Block block, World world, int x, int y, int z) {
this.block = block;
this.world = world;
this.x = x;
this.y = y;
this.z = z;
}
}
private MagnetWhitelists() {}
public final ObjectTester<Entity> entityWhitelist = ObjectTester.create();
public final ObjectTester<BlockCoords> blockWhitelist = ObjectTester.create();
public final ObjectTester<TileEntity> tileEntityWhitelist = ObjectTester.create();
public static class WhitelistRegisterEvent<T> extends Event {
protected final ObjectTester<T> tester;
protected WhitelistRegisterEvent(ObjectTester<T> tester) {
this.tester = tester;
}
public void addClass(Class<? extends T> cls) {
tester.addTester(new ClassTester<T>(cls));
}
public void addClassNames(Class<? extends T>... cls) {
tester.addTester(new ClassNameTester<T>().addClasses(cls));
}
public void addClassNames(String... names) {
tester.addTester(new ClassNameTester<T>().addClasses(names));
}
}
public static class EntityRegisterEvent extends
WhitelistRegisterEvent<Entity> {
protected EntityRegisterEvent(ObjectTester<Entity> tester) {
super(tester);
}
}
public static class BlockRegisterEvent extends WhitelistRegisterEvent<BlockCoords> {
protected BlockRegisterEvent(ObjectTester<BlockCoords> tester) {
super(tester);
}
}
public static class TileEntityRegisterEvent extends
WhitelistRegisterEvent<TileEntity> {
protected TileEntityRegisterEvent(ObjectTester<TileEntity> tester) {
super(tester);
}
}
public static ITester<BlockCoords> createBlockIdentityTester(final Block template) {
return new ITester<BlockCoords>() {
@Override
public ITester.Result test(BlockCoords o) {
return (o.block == template)? Result.ACCEPT : Result.CONTINUE;
}
};
}
public static ITester<BlockCoords> createBlockClassTester(final Class<? extends Block> cls) {
return new ITester<BlockCoords>() {
@Override
public ITester.Result test(BlockCoords o) {
return (cls.isInstance(o.block))? Result.ACCEPT : Result.CONTINUE;
}
};
}
public void initTesters() {
entityWhitelist.addTester(new ClassTester<Entity>(EntityItem.class));
entityWhitelist.addTester(new ClassTester<Entity>(EntityBoat.class));
entityWhitelist.addTester(new ClassTester<Entity>(EntityMinecart.class));
MinecraftForge.EVENT_BUS.post(new EntityRegisterEvent(entityWhitelist));
blockWhitelist.addTester(new ITester<BlockCoords>() {
@Override
public Result test(BlockCoords o) {
float hardness = o.block.getBlockHardness(o.world, o.x, o.y, o.z);
return (hardness < 0)? Result.REJECT : Result.CONTINUE;
}
});
blockWhitelist.addTester(new ITester<BlockCoords>() {
@Override
public openmods.utils.ITester.Result test(BlockCoords o) {
return o.block.getRenderType() == 0? Result.ACCEPT : Result.CONTINUE;
}
});
blockWhitelist.addTester(createBlockClassTester(BlockSand.class));
blockWhitelist.addTester(createBlockClassTester(BlockStairs.class));
blockWhitelist.addTester(createBlockClassTester(BlockFence.class));
blockWhitelist.addTester(createBlockClassTester(BlockFenceGate.class));
blockWhitelist.addTester(createBlockIdentityTester(Blocks.cactus));
MinecraftForge.EVENT_BUS.post(new BlockRegisterEvent(blockWhitelist));
tileEntityWhitelist
.addTester(new ClassTester<TileEntity>(TileEntityBeacon.class))
.addTester(new ClassTester<TileEntity>(TileEntityBrewingStand.class))
.addTester(new ClassTester<TileEntity>(TileEntityChest.class))
.addTester(new ClassTester<TileEntity>(TileEntityCommandBlock.class))
.addTester(new ClassTester<TileEntity>(TileEntityDispenser.class))
.addTester(new ClassTester<TileEntity>(TileEntityEnchantmentTable.class))
.addTester(new ClassTester<TileEntity>(TileEntityEnderChest.class))
.addTester(new ClassTester<TileEntity>(TileEntityFurnace.class))
.addTester(new ClassTester<TileEntity>(TileEntityHopper.class))
.addTester(new ClassTester<TileEntity>(TileEntityNote.class))
.addTester(new ClassTester<TileEntity>(TileEntityJukebox.class));
}
public boolean testBlock(World world, int x, int y, int z) {
Block block = world.getBlock(x, y, z);
if (block.isAir(world, x, y, z)) return false;
if (block instanceof BlockContainer) {
TileEntity te = world.getTileEntity(x, y, z);
return (te != null)? tileEntityWhitelist.check(te) : false;
}
return blockWhitelist.check(new BlockCoords(block, world, x, y, z));
}
}