package pixlepix.auracascade.block; import net.minecraft.block.Block; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentString; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.common.ModAPIManager; import net.minecraftforge.fml.common.network.NetworkRegistry; import pixlepix.auracascade.AuraCascade; import pixlepix.auracascade.block.tile.*; import pixlepix.auracascade.data.EnumRainbowColor; import pixlepix.auracascade.data.IToolTip; import pixlepix.auracascade.item.ItemAuraCrystal; import pixlepix.auracascade.item.ItemMaterial; import pixlepix.auracascade.main.AuraUtil; import pixlepix.auracascade.main.Config; import pixlepix.auracascade.main.EnumColor; import pixlepix.auracascade.network.PacketBurst; import pixlepix.auracascade.registry.BlockRegistry; import pixlepix.auracascade.registry.CraftingBenchRecipe; import pixlepix.auracascade.registry.ITTinkererBlock; import pixlepix.auracascade.registry.ThaumicTinkererRecipe; import java.util.ArrayList; import java.util.List; public class AuraBlock extends Block implements IToolTip, ITTinkererBlock, ITileEntityProvider { public static String name = "auraNode"; //"" is default //"pump" is AuraTilePump\ //"black" is AuraTileBlack etc private String type; private static AxisAlignedBB AABB = new AxisAlignedBB(.25F, .25F, .25F, .75F, .75F, .75F); public AuraBlock(String type) { super(Material.GLASS); this.type = type; setLightOpacity(0); setHardness(2F); } public AuraBlock() { this(""); setHardness(2F); } public static AuraBlock getBlockFromName(String name) { List<Block> blockList = BlockRegistry.getBlockFromClass(AuraBlock.class); if ("capacitor".equals(name)) { blockList = BlockRegistry.getBlockFromClass(AuraBlockCapacitor.class); } for (Block b : blockList) { if (((AuraBlock) b).type.equals(name)) { return (AuraBlock) b; } } return null; } public static ItemStack getAuraNodeItemstack() { List<Block> blockList = BlockRegistry.getBlockFromClass(AuraBlock.class); for (Block b : blockList) { if (((AuraBlock) b).type.equals("")) { return new ItemStack(b); } } AuraCascade.log.warn("Failed to find color node itemstack. Something has gone horribly wrong"); return null; } public static ItemStack getAuraNodePumpItemstack() { List<Block> blockList = BlockRegistry.getBlockFromClass(AuraBlock.class); for (Block b : blockList) { if (((AuraBlock) b).type.equals("pump")) { return new ItemStack(b); } } AuraCascade.log.warn("Failed to find color node pump itemstack. Something has gone horribly wrong"); return null; } //Prevents being moved by RIM @SuppressWarnings({}) public static boolean _Immovable() { return true; } @Override public String getHarvestTool(IBlockState state) { return "pickaxe"; } @Override public boolean isVisuallyOpaque() { return false; } @Override public boolean isBlockNormalCube(IBlockState state) { return false; } @Override public boolean isOpaqueCube(IBlockState state) { return false; } @Override public boolean isCollidable() { return true; } @Override public boolean hasComparatorInputOverride(IBlockState state) { return true; } @Override public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos) { TileEntity tileEntity = worldIn.getTileEntity(pos); if (tileEntity instanceof AuraTile) { int aura = ((AuraTile) tileEntity).storage; return (int) Math.floor(Math.log10(aura)); } else { return super.getComparatorInputOverride(blockState, worldIn, pos); } } @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote && world.getTileEntity(pos) instanceof AuraTile) { if (world.getTileEntity(pos) instanceof AuraTileCapacitor && player.isSneaking()) { AuraTileCapacitor capacitor = (AuraTileCapacitor) world.getTileEntity(pos); capacitor.storageValueIndex = (capacitor.storageValueIndex + 1) % capacitor.storageValues.length; player.addChatComponentMessage(new TextComponentString("Max Storage: " + capacitor.storageValues[capacitor.storageValueIndex])); world.markBlocksDirtyVertical(pos.getX(), pos.getZ(), pos.getX(), pos.getZ()); return true; } else if (world.getTileEntity(pos) instanceof AuraTilePedestal && !player.isSneaking()) { AuraTilePedestal pedestal = (AuraTilePedestal) world.getTileEntity(pos); //Remove current itemstack from pedestal if (pedestal.itemStack != null) { EntityItem item = new EntityItem(world, player.posX, player.posY, player.posZ, pedestal.itemStack); world.spawnEntityInWorld(item); } pedestal.itemStack = player.inventory.getCurrentItem() != null ? player.inventory.decrStackSize(player.inventory.currentItem, 1) : null; world.markBlocksDirtyVertical(pos.getX(), pos.getZ(), pos.getX(), pos.getZ()); world.notifyBlockOfStateChange(pos, this); return true; } else if (world.getTileEntity(pos) instanceof AuraTile && player.inventory.getCurrentItem() == null) { player.addChatComponentMessage(new TextComponentString("Aura:")); if (((AuraTile) world.getTileEntity(pos)).storage != 0) { player.addChatComponentMessage(new TextComponentString("Aura: " + ((AuraTile) world.getTileEntity(pos)).storage)); } if (world.getTileEntity(pos) instanceof AuraTilePumpBase) { player.addChatComponentMessage(new TextComponentString("Power: " + ((AuraTilePumpBase) world.getTileEntity(pos)).pumpPower)); } return true; } } else if (!world.isRemote && world.getTileEntity(pos) instanceof CraftingCenterTile && player.inventory.getCurrentItem() == null) { CraftingCenterTile tile = (CraftingCenterTile) world.getTileEntity(pos); if (tile.getRecipe() != null) { player.addChatComponentMessage(new TextComponentString(EnumColor.DARK_BLUE + "Making: " + tile.getRecipe().result.getDisplayName())); for (EnumFacing direction : CraftingCenterTile.pedestalRelativeLocations) { AuraTilePedestal pedestal = ((AuraTilePedestal) world.getTileEntity(pos.offset(direction))); if (tile.getRecipe() != null) { player.addChatComponentMessage(new TextComponentString("" + EnumColor.AQUA + pedestal.powerReceived + "/" + tile.getRecipe().getAuraFromItem(pedestal.itemStack))); } else { AuraCascade.log.warn("Invalid recipe when checking crafting center"); } } } else { player.addChatComponentMessage(new TextComponentString("No Recipe Selected")); } return true; } return true; } @Override public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState blockState, Entity entity) { super.onEntityCollidedWithBlock(world, pos, this.getDefaultState(), entity); TileEntity te = world.getTileEntity(pos); if (entity instanceof EntityItem && !world.isRemote) { ItemStack stack = ((EntityItem) entity).getEntityItem(); if (stack.getItem() instanceof ItemAuraCrystal) { if (te instanceof AuraTile) { ((AuraTile) te).storage += 1000 * stack.stackSize; world.markBlocksDirtyVertical(pos.getX(), pos.getZ(), pos.getX(), pos.getZ()); world.notifyNeighborsOfStateChange(pos, this); AuraCascade.proxy.networkWrapper.sendToAllAround(new PacketBurst(1, entity.posX, entity.posY, entity.posZ), new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 32)); entity.setDead(); } } } if (!world.isRemote && te instanceof AuraTilePumpProjectile) { ((AuraTilePumpProjectile) te).onEntityCollidedWithBlock(entity); } } @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) { super.onBlockPlacedBy(world, pos, state, placer, stack); AuraUtil.updateMonitor(world, pos); } @Override public void breakBlock(World world, BlockPos pos, IBlockState state) { TileEntity te = world.getTileEntity(pos); if (te instanceof IInventory) { IInventory inv = (IInventory) te; for (int i = 0; i < inv.getSizeInventory(); i++) { if (inv.getStackInSlot(i) != null) { double d0 = AuraUtil.getDropOffset(world); double d1 = AuraUtil.getDropOffset(world); double d2 = AuraUtil.getDropOffset(world); EntityItem entityitem = new EntityItem(world, (double) pos.getX() + d0, (double) pos.getY() + d1, (double) pos.getZ() + d2, inv.getStackInSlot(i)); AuraUtil.setItemDelay(entityitem, 10); world.spawnEntityInWorld(entityitem); } } } super.breakBlock(world, pos, state); AuraUtil.updateMonitor(world, pos); } @Override public ThaumicTinkererRecipe getRecipeItem() { if (type.equals("pump")) { return new CraftingBenchRecipe(new ItemStack(this), "ILI", "INI", "ILI", 'I', new ItemStack(Items.IRON_INGOT), 'L', new ItemStack(Items.DYE, 1, 4), 'N', getAuraNodeItemstack()); } if (type.equals("conserve")) { return new CraftingBenchRecipe(new ItemStack(this), "B", "N", "B", 'B', ItemMaterial.getIngot(EnumRainbowColor.BLUE), 'N', getAuraNodeItemstack()); } if (type.equals("capacitor")) { return new CraftingBenchRecipe(new ItemStack(this), "Y", "N", "G", 'Y', ItemMaterial.getIngot(EnumRainbowColor.YELLOW), 'G', ItemMaterial.getIngot(EnumRainbowColor.GREEN), 'N', getAuraNodeItemstack()); } if (type.equals("craftingPedestal")) { return new CraftingBenchRecipe(new ItemStack(this), "BBB", "BNB", "BBB", 'B', new ItemStack(Items.DYE, 1, 4), 'N', getAuraNodeItemstack()); } if (type.equals("craftingCenter")) { return new CraftingBenchRecipe(new ItemStack(this), "GGG", "RDR", "RRR", 'G', new ItemStack(Items.GOLD_INGOT), 'R', ItemMaterial.getIngot(EnumRainbowColor.RED), 'D', new ItemStack(Items.DIAMOND)); } if (type.equals("pumpProjectile")) { return new CraftingBenchRecipe(new ItemStack(this), "XXX", "GPG", 'X', new ItemStack(Items.ARROW), 'G', ItemMaterial.getIngot(EnumRainbowColor.VIOLET), 'P', getAuraNodePumpItemstack()); } if (type.equals("pumpFall")) { return new CraftingBenchRecipe(new ItemStack(this), "XXX", "GPG", 'X', new ItemStack(Items.WATER_BUCKET), 'G', ItemMaterial.getIngot(EnumRainbowColor.BLUE), 'P', getAuraNodePumpItemstack()); } if (type.equals("pumpLight")) { return new CraftingBenchRecipe(new ItemStack(this), "XXX", "GPG", "G G", 'X', new ItemStack(Blocks.GLOWSTONE), 'G', ItemMaterial.getIngot(EnumRainbowColor.YELLOW), 'P', getAuraNodePumpItemstack()); } if (type.equals("pumpRedstone")) { return new CraftingBenchRecipe(new ItemStack(this), "XXX", "GPG", "G G", 'X', new ItemStack(Blocks.REDSTONE_BLOCK), 'G', ItemMaterial.getIngot(EnumRainbowColor.RED), 'P', getAuraNodePumpItemstack()); } if (type.equals("pumpAlt")) { return new CraftingBenchRecipe(new ItemStack(this), " E ", "EPE", " E ", 'P', new ItemStack(getBlockFromName("pump")), 'E', Items.REDSTONE); } if (type.equals("pumpRedstoneAlt")) { return new CraftingBenchRecipe(new ItemStack(this), " E ", "EPE", " E ", 'P', new ItemStack(getBlockFromName("pumpRedstone")), 'E', Items.REDSTONE); } if (type.equals("pumpLightAlt")) { return new CraftingBenchRecipe(new ItemStack(this), " E ", "EPE", " E ", 'P', new ItemStack(getBlockFromName("pumpLight")), 'E', Items.REDSTONE); } if (type.equals("pumpFallAlt")) { return new CraftingBenchRecipe(new ItemStack(this), " E ", "EPE", " E ", 'P', new ItemStack(getBlockFromName("pumpFall")), 'E', Items.REDSTONE); } if (type.equals("pumpProjectileAlt")) { return new CraftingBenchRecipe(new ItemStack(this), " E ", "EPE", " E ", 'P', new ItemStack(getBlockFromName("pumpProjectile")), 'E', Items.REDSTONE); } if (type.equals("flux")) { return new CraftingBenchRecipe(new ItemStack(this), "RNR", 'R', ItemMaterial.getIngot(EnumRainbowColor.RED), 'N', getAuraNodeItemstack()); } if (type.equals("pumpCreative")) { return null; } return new CraftingBenchRecipe(new ItemStack(this, 4), "PPP", "PRP", "PPP", 'P', new ItemStack(Items.GOLD_NUGGET), 'R', new ItemStack(Items.REDSTONE)); } @Override public int getCreativeTabPriority() { if (type.equals("pump") || type.equals("") || type.equals("flux")) { return 100; } if (type.contains("Alt")) { return -25; } if (type.contains("pump")) { return 75; } return 50; } @Override public ArrayList<Object> getSpecialParameters() { //This was typed to Object from no-type. ArrayList<Object> result = new ArrayList<Object>(); result.add("pump"); result.add("conserve"); result.add("craftingCenter"); result.add("craftingPedestal"); result.add("pumpAlt"); result.add("pumpProjectile"); result.add("pumpFall"); result.add("pumpLight"); result.add("pumpRedstone"); result.add("pumpProjectileAlt"); result.add("pumpFallAlt"); result.add("pumpCreative"); result.add("pumpLightAlt"); result.add("pumpRedstoneAlt"); if (ModAPIManager.INSTANCE.hasAPI("CoFHAPI|energy")) { result.add("flux"); } return result; } @Override public String getBlockName() { return name + type; } @Override public boolean shouldRegister() { return true; } @Override public boolean shouldDisplayInTab() { return true; } @Override public Class<? extends ItemBlock> getItemBlock() { return null; } @Override public Class<? extends TileEntity> getTileEntity() { if (type.equals("pump")) { return AuraTilePump.class; } if (type.equals("conserve")) { return AuraTileConserve.class; } if (type.equals("capacitor")) { return AuraTileCapacitor.class; } if (type.equals("craftingPedestal")) { return AuraTilePedestal.class; } if (type.equals("craftingCenter")) { return CraftingCenterTile.class; } if (type.equals("flux")) { return AuraTileRF.class; } if (type.equals("pumpCreative")) { return AuraTilePumpCreative.class; } if (type.equals("pumpProjectile")) { return AuraTilePumpProjectile.class; } if (type.equals("pumpFall")) { return AuraTilePumpFall.class; } if (type.equals("pumpCreative")) { return AuraTilePumpFall.class; } if (type.equals("pumpLight")) { return AuraTilePumpLight.class; } if (type.equals("pumpRedstone")) { return AuraTilePumpRedstone.class; } if (type.equals("pumpAlt")) { return AuraTilePumpAlt.class; } if (type.equals("pumpProjectileAlt")) { return AuraTilePumpProjectileAlt.class; } if (type.equals("pumpFallAlt")) { return AuraTilePumpFallAlt.class; } if (type.equals("pumpLightAlt")) { return AuraTilePumpLightAlt.class; } if (type.equals("pumpRedstoneAlt")) { return AuraTilePumpRedstoneAlt.class; } return AuraTile.class; } @Override public TileEntity createNewTileEntity(World world, int meta) { try { return getTileEntity().newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } return null; } @Override public int damageDropped(IBlockState state) { return getMetaFromState(state); } @Override public List<String> getTooltipData(World world, EntityPlayer player, BlockPos pos) { List<String> result = new ArrayList<String>(); TileEntity tileEntity = world.getTileEntity(pos); if (tileEntity instanceof AuraTile) { if (tileEntity instanceof AuraTileCapacitor) { AuraTileCapacitor capacitor = (AuraTileCapacitor) tileEntity; result.add("Max Storage: " + capacitor.storageValues[capacitor.storageValueIndex]); } result.add("Aura Stored: "); result.add("Aura: " + ((AuraTile) tileEntity).storage); } else { result.add("No Aura"); } if (tileEntity instanceof AuraTileCapacitor) { if (((AuraTileCapacitor) tileEntity).ticksDisabled > 0) { result.add("Time until functional: " + ((AuraTileCapacitor) tileEntity).ticksDisabled / 20); } } if (tileEntity instanceof AuraTilePumpBase) { result.add("Time left: " + ((AuraTilePumpBase) tileEntity).pumpPower + " seconds"); result.add("Power: " + ((AuraTilePumpBase) tileEntity).pumpSpeed + " power per second"); if (((AuraTilePumpBase) tileEntity).isAlternator()) { AuraTilePumpBase altPump = (AuraTilePumpBase) tileEntity; int power = (int) (altPump.pumpSpeed * altPump.getAlternatingFactor()); result.add("Phase Power: " + power); } } if (ModAPIManager.INSTANCE.hasAPI("CoFHAPI|energy")) { if (tileEntity instanceof AuraTileRF) { AuraTileRF auraTileRF = (AuraTileRF) tileEntity; result.add("RF/t Output: " + auraTileRF.lastPower * Config.powerFactor); } } else if (tileEntity instanceof CraftingCenterTile) { CraftingCenterTile tile = (CraftingCenterTile) tileEntity; if (tile.getRecipe() != null) { result.add("Making: " + tile.getRecipe().result.getDisplayName()); for (EnumFacing direction : CraftingCenterTile.pedestalRelativeLocations) { AuraTilePedestal pedestal = (AuraTilePedestal) world.getTileEntity(pos.offset(direction)); if (tile.getRecipe() != null) { result.add(" Power received:" + pedestal.powerReceived + "/" + tile.getRecipe().getAuraFromItem(pedestal.itemStack)); } else { AuraCascade.log.warn("Invalid recipe when checking crafting center"); } } } else { result.add("No Valid Recipe Selected"); } } return result; } @Override public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) { return AABB; } }