diff --git a/src/main/java/techreborn/api/recipe/machines/IndustrialSawmillRecipe.java b/src/main/java/techreborn/api/recipe/machines/IndustrialSawmillRecipe.java index 76d9b9cd3..d41f37a75 100644 --- a/src/main/java/techreborn/api/recipe/machines/IndustrialSawmillRecipe.java +++ b/src/main/java/techreborn/api/recipe/machines/IndustrialSawmillRecipe.java @@ -32,16 +32,13 @@ import techreborn.api.recipe.BaseRecipe; public class IndustrialSawmillRecipe extends BaseRecipe { public FluidStack fluidStack; - public boolean canUseOreDict = false; - public IndustrialSawmillRecipe(ItemStack input1, ItemStack input2, FluidStack fluidStack, ItemStack output1, + public IndustrialSawmillRecipe(ItemStack input1, FluidStack fluidStack, ItemStack output1, ItemStack output2, ItemStack output3, int tickTime, int euPerTick) { super(Reference.industrialSawmillRecipe, tickTime, euPerTick); if (input1 != null) addInput(input1); - if (input2 != null) - addInput(input2); if (output1 != null) addOutput(output1); if (output2 != null) @@ -51,13 +48,11 @@ public class IndustrialSawmillRecipe extends BaseRecipe { this.fluidStack = fluidStack; } - public IndustrialSawmillRecipe(ItemStack input1, ItemStack input2, FluidStack fluidStack, ItemStack output1, + public IndustrialSawmillRecipe(ItemStack input1, FluidStack fluidStack, ItemStack output1, ItemStack output2, ItemStack output3, int tickTime, int euPerTick, boolean canUseOreDict) { super(Reference.industrialSawmillRecipe, tickTime, euPerTick); if (input1 != null) addInput(input1); - if (input2 != null) - addInput(input2); if (output1 != null) addOutput(output1); if (output2 != null) diff --git a/src/main/java/techreborn/client/gui/GuiIndustrialSawmill.java b/src/main/java/techreborn/client/gui/GuiIndustrialSawmill.java index b9d29b4b4..04c4665cb 100644 --- a/src/main/java/techreborn/client/gui/GuiIndustrialSawmill.java +++ b/src/main/java/techreborn/client/gui/GuiIndustrialSawmill.java @@ -24,98 +24,147 @@ package techreborn.client.gui; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; +import java.io.IOException; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.ResourceLocation; -import net.minecraft.client.resources.I18n; -import net.minecraftforge.fluids.FluidStack; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import reborncore.client.multiblock.Multiblock; +import reborncore.client.multiblock.MultiblockRenderEvent; +import reborncore.client.multiblock.MultiblockSet; +import techreborn.blocks.BlockMachineCasing; +import techreborn.client.gui.widget.GuiButtonHologram; +import techreborn.init.ModBlocks; +import techreborn.proxies.ClientProxy; import techreborn.tiles.multiblock.TileIndustrialSawmill; -public class GuiIndustrialSawmill extends GuiContainer { +public class GuiIndustrialSawmill extends GuiBase { - public static final ResourceLocation texture = new ResourceLocation("techreborn", - "textures/gui/industrial_sawmill.png"); + TileIndustrialSawmill tile; - TileIndustrialSawmill sawmill; - - public GuiIndustrialSawmill(final EntityPlayer player, final TileIndustrialSawmill sawmill) { - super(sawmill.createContainer(player)); - this.xSize = 176; - this.ySize = 167; - this.sawmill = sawmill; + public GuiIndustrialSawmill(final EntityPlayer player, final TileIndustrialSawmill tile) { + super(player, tile, tile.createContainer(player)); + this.tile = tile; } @Override public void initGui() { super.initGui(); + ClientProxy.multiblockRenderEvent.setMultiblock(null); } @Override - protected void drawGuiContainerBackgroundLayer(final float p_146976_1_, final int p_146976_2_, final int p_146976_3_) { - this.drawDefaultBackground(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(GuiIndustrialSawmill.texture); - final int k = (this.width - this.xSize) / 2; - final int l = (this.height - this.ySize) / 2; + protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { + super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY); + final Layer layer = Layer.BACKGROUND; + + // Battery slot + this.drawSlot(8, 72, layer); + // Liquid input slot + this.drawSlot(34, 35, layer); + // Liquid output slot + this.drawSlot(34, 55, layer); + // Solid material input slot + this.drawSlot(84, 43, layer); + // Output slots + this.drawSlot(126, 25, layer); + this.drawSlot(126, 43, layer); + this.drawSlot(126, 61, layer); + + this.builder.drawJEIButton(this, 150, 4, layer); + } - this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); + @Override + protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) { + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + final Layer layer = Layer.FOREGROUND; + + this.builder.drawProgressBar(this, this.tile.getProgressScaled(100), 100, 105, 47, mouseX, mouseY, TRBuilder.ProgressDirection.RIGHT, layer); + this.builder.drawTank(this, 53, 25, mouseX, mouseY, this.tile.tank.getFluid(), this.tile.tank.getCapacity(), this.tile.tank.isEmpty(), layer); + this.builder.drawMultiEnergyBar(this, 9, 19, (int) this.tile.getEnergy(), (int) this.tile.getMaxPower(), mouseX, mouseY, 0, layer); + if (tile.getMutliBlock()) { + addHologramButton(6, 4, 212, layer); + builder.drawHologramButton(this, 6, 4, mouseX, mouseY, layer); + } else { + builder.drawMultiblockMissingBar(this, layer); + addHologramButton(76, 56, 212, layer); + builder.drawHologramButton(this, 76, 56, mouseX, mouseY, layer); + } + } + + public void addHologramButton(int x, int y, int id, Layer layer) { + if (id == 0) + buttonList.clear(); + int factorX = 0; + int factorY = 0; + if (layer == Layer.BACKGROUND) { + factorX = guiLeft; + factorY = guiTop; + } + buttonList.add(new GuiButtonHologram(id, x + factorX, y + factorY, this, layer)); + } + + @Override + public void actionPerformed(final GuiButton button) throws IOException { + super.actionPerformed(button); + if (button.id == 212) { + if (ClientProxy.multiblockRenderEvent.currentMultiblock == null) { + { + // This code here makes a basic multiblock and then sets to the selected one. + final Multiblock multiblock = new Multiblock(); + IBlockState standardCasing = ModBlocks.MACHINE_CASINGS.getDefaultState().withProperty(BlockMachineCasing.TYPE, "standard"); + IBlockState reinforcedCasing = ModBlocks.MACHINE_CASINGS.getDefaultState().withProperty(BlockMachineCasing.TYPE, "reinforced"); + + this.addComponent(0, -1, 0, standardCasing, multiblock); + this.addComponent(1, -1, 0, standardCasing, multiblock); + this.addComponent(0, -1, 1, standardCasing, multiblock); + this.addComponent(-1, -1, 0, standardCasing, multiblock); + this.addComponent(0, -1, -1, standardCasing, multiblock); + this.addComponent(-1, -1, -1, standardCasing, multiblock); + this.addComponent(-1, -1, 1, standardCasing, multiblock); + this.addComponent(1, -1, -1, standardCasing, multiblock); + this.addComponent(1, -1, 1, standardCasing, multiblock); - final int progress = this.sawmill.getProgressScaled(24); - this.drawTexturedModalRect(k + 56, l + 38, 176, 14, progress - 1, 11); + this.addComponent(0, 0, 0, Blocks.WATER.getDefaultState(), multiblock); + this.addComponent(1, 0, 0, reinforcedCasing, multiblock); + this.addComponent(0, 0, 1, reinforcedCasing, multiblock); + this.addComponent(-1, 0, 0, reinforcedCasing, multiblock); + this.addComponent(0, 0, -1, reinforcedCasing, multiblock); + this.addComponent(-1, 0, -1, reinforcedCasing, multiblock); + this.addComponent(-1, 0, 1, reinforcedCasing, multiblock); + this.addComponent(1, 0, -1, reinforcedCasing, multiblock); + this.addComponent(1, 0, 1, reinforcedCasing, multiblock); - final int energy = 13 - (int) (this.sawmill.getEnergy() / this.sawmill.getMaxPower() * 13F); - this.drawTexturedModalRect(k + 36, l + 66 + energy, 179, 1 + energy, 7, 13 - energy); + this.addComponent(0, 1, 0, standardCasing, multiblock); + this.addComponent(0, 1, 0, standardCasing, multiblock); + this.addComponent(1, 1, 0, standardCasing, multiblock); + this.addComponent(0, 1, 1, standardCasing, multiblock); + this.addComponent(-1, 1, 0, standardCasing, multiblock); + this.addComponent(0, 1, -1, standardCasing, multiblock); + this.addComponent(-1, 1, -1, standardCasing, multiblock); + this.addComponent(-1, 1, 1, standardCasing, multiblock); + this.addComponent(1, 1, -1, standardCasing, multiblock); + this.addComponent(1, 1, 1, standardCasing, multiblock); - if (!this.sawmill.tank.isEmpty()) { - this.drawFluid(this.sawmill.tank.getFluid(), k + 11, l + 66, 12, 47, this.sawmill.tank.getCapacity()); - - final int j = this.sawmill.getEnergyScaled(12); - if (j > 0) { - this.drawTexturedModalRect(k + 33, l + 65 + 12 - j, 176, 12 - j, 14, j + 2); - } - - if (!this.sawmill.getMutliBlock()) { - //GuiUtil.drawTooltipBox(k + 30, l + 50 + 12, 114, 10); - this.fontRenderer.drawString(I18n.format("techreborn.message.missingmultiblock"), k + 38, - l + 52 + 12, -1); + final MultiblockSet set = new MultiblockSet(multiblock); + ClientProxy.multiblockRenderEvent.setMultiblock(set); + ClientProxy.multiblockRenderEvent.parent = this.tile.getPos(); + MultiblockRenderEvent.anchor = new BlockPos( + this.tile.getPos().getX() + - EnumFacing.getFront(this.tile.getFacingInt()).getFrontOffsetX() * 2, + this.tile.getPos().getY() - 1, this.tile.getPos().getZ() + - EnumFacing.getFront(this.tile.getFacingInt()).getFrontOffsetZ() * 2); + } + } else { + ClientProxy.multiblockRenderEvent.setMultiblock(null); } } } - public void drawFluid(final FluidStack fluid, final int x, final int y, final int width, final int height, final int maxCapacity) { - this.mc.renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); - final ResourceLocation still = fluid.getFluid().getStill(fluid); - final TextureAtlasSprite sprite = this.mc.getTextureMapBlocks().getAtlasSprite(still.toString()); - - final int drawHeight = (int) (fluid.amount / (maxCapacity * 1F) * height); - final int iconHeight = sprite.getIconHeight(); - int offsetHeight = drawHeight; - - int iteration = 0; - while (offsetHeight != 0) { - final int curHeight = offsetHeight < iconHeight ? offsetHeight : iconHeight; - this.drawTexturedModalRect(x, y - offsetHeight, sprite, width, curHeight); - offsetHeight -= curHeight; - iteration++; - if (iteration > 50) - break; - } - - } - - @Override - protected void drawGuiContainerForegroundLayer(final int p_146979_1_, final int p_146979_2_) { - final String name = I18n.format("tile.techreborn:industrial_sawmill.name"); - this.fontRenderer.drawString(name, this.xSize / 2 - this.fontRenderer.getStringWidth(name) / 2, 6, 4210752); - this.fontRenderer.drawString(I18n.format("container.inventory"), 58, this.ySize - 96 + 2, 4210752); - } - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - super.drawScreen(mouseX, mouseY, partialTicks); - this.renderHoveredToolTip(mouseX, mouseY); + public void addComponent(final int x, final int y, final int z, final IBlockState blockState, final Multiblock multiblock) { + multiblock.addComponent(new BlockPos(x, y, z), blockState); } } diff --git a/src/main/java/techreborn/compat/crafttweaker/CTIndustrialSawmill.java b/src/main/java/techreborn/compat/crafttweaker/CTIndustrialSawmill.java index a18d0c904..716a4414b 100644 --- a/src/main/java/techreborn/compat/crafttweaker/CTIndustrialSawmill.java +++ b/src/main/java/techreborn/compat/crafttweaker/CTIndustrialSawmill.java @@ -39,32 +39,30 @@ import techreborn.api.recipe.machines.IndustrialSawmillRecipe; public class CTIndustrialSawmill extends CTGeneric { @ZenMethod - public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, IIngredient input2, ILiquidStack fluid, int ticktime, int euTick) { - addRecipe(output1, output2, output3, input1, input2, fluid, ticktime, euTick, true); + public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, ILiquidStack fluid, int ticktime, int euTick) { + addRecipe(output1, output2, output3, input1, fluid, ticktime, euTick, true); } @ZenMethod - public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, IIngredient input2, int ticktime, int euTick) { - addRecipe(output1, output2, output3, input1, input2, null, ticktime, euTick, true); + public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, int ticktime, int euTick) { + addRecipe(output1, output2, output3, input1, null, ticktime, euTick, true); } @ZenMethod - public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, IIngredient input2, int ticktime, int euTick, boolean useOreDic) { - addRecipe(output1, output2, output3, input1, input2, null, ticktime, euTick, useOreDic); + public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, int ticktime, int euTick, boolean useOreDic) { + addRecipe(output1, output2, output3, input1, null, ticktime, euTick, useOreDic); } @ZenMethod - public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, IIngredient input2, ILiquidStack fluid, int ticktime, int euTick, boolean useOreDic) { + public static void addRecipe(IItemStack output1, IItemStack output2, IItemStack output3, IIngredient input1, ILiquidStack fluid, int ticktime, int euTick, boolean useOreDic) { ItemStack oInput1 = (ItemStack) CraftTweakerCompat.toObject(input1); - ItemStack oInput2 = (ItemStack) CraftTweakerCompat.toObject(input2); - FluidStack fluidStack = null; if (fluid != null) { fluidStack = CraftTweakerCompat.toFluidStack(fluid); } - IndustrialSawmillRecipe r = new IndustrialSawmillRecipe(oInput1, oInput2, fluidStack, CraftTweakerCompat.toStack(output1), CraftTweakerCompat.toStack(output2), CraftTweakerCompat.toStack(output3), ticktime, euTick, useOreDic); + IndustrialSawmillRecipe r = new IndustrialSawmillRecipe(oInput1, fluidStack, CraftTweakerCompat.toStack(output1), CraftTweakerCompat.toStack(output2), CraftTweakerCompat.toStack(output3), ticktime, euTick, useOreDic); addRecipe(r); } diff --git a/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java b/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java index b8d6bf66f..3735455c8 100644 --- a/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java +++ b/src/main/java/techreborn/compat/jei/TechRebornJeiPlugin.java @@ -294,7 +294,7 @@ public class TechRebornJeiPlugin implements IModPlugin { registry.addRecipeClickArea(GuiChemicalReactor.class, 150, 4, 20, 12, RecipeCategoryUids.CHEMICAL_REACTOR); registry.addRecipeClickArea(GuiImplosionCompressor.class, 150, 4, 20, 12, RecipeCategoryUids.IMPLOSION_COMPRESSOR); registry.addRecipeClickArea(GuiIndustrialGrinder.class, 150, 4, 20, 12, RecipeCategoryUids.INDUSTRIAL_GRINDER); - registry.addRecipeClickArea(GuiIndustrialSawmill.class, 55, 35, 20, 15, RecipeCategoryUids.INDUSTRIAL_SAWMILL); + registry.addRecipeClickArea(GuiIndustrialSawmill.class, 150, 4, 20, 15, RecipeCategoryUids.INDUSTRIAL_SAWMILL); registry.addRecipeClickArea(GuiIndustrialElectrolyzer.class, 150, 4, 20, 12, RecipeCategoryUids.INDUSTRIAL_ELECTROLYZER); registry.addRecipeClickArea(GuiSemifluidGenerator.class, 150, 4, 18, 18, EFluidGenerator.SEMIFLUID.getRecipeID()); registry.addRecipeClickArea(GuiDieselGenerator.class, 150, 4, 18, 18, EFluidGenerator.DIESEL.getRecipeID()); @@ -383,8 +383,8 @@ public class TechRebornJeiPlugin implements IModPlugin { if (CompatManager.isQuantumStorageLoaded) { - registry.getJeiHelpers().getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.QUANTUM_CHEST)); - registry.getJeiHelpers().getItemBlacklist().addItemToBlacklist(new ItemStack(ModBlocks.QUANTUM_TANK)); + registry.getJeiHelpers().getIngredientBlacklist().addIngredientToBlacklist(new ItemStack(ModBlocks.QUANTUM_CHEST)); + registry.getJeiHelpers().getIngredientBlacklist().addIngredientToBlacklist(new ItemStack(ModBlocks.QUANTUM_TANK)); } } diff --git a/src/main/java/techreborn/init/recipes/IndustrialSawmillRecipes.java b/src/main/java/techreborn/init/recipes/IndustrialSawmillRecipes.java index aa543dba7..f9ffaaa3e 100644 --- a/src/main/java/techreborn/init/recipes/IndustrialSawmillRecipes.java +++ b/src/main/java/techreborn/init/recipes/IndustrialSawmillRecipes.java @@ -94,20 +94,16 @@ public class IndustrialSawmillRecipes extends RecipeMethods { } public static void addRecipe(ItemStack log, ItemStack plank) { - register(log, getMaterial("water", Type.CELL), WATER, 100, 128, plank, ItemDusts.getDustByName("sawDust", 3), getStack(Items.PAPER, 1)); - register(log, new ItemStack(Items.WATER_BUCKET), WATER, 100, 128, plank, ItemDusts.getDustByName("sawDust", 3), getStack(Items.PAPER, 1)); + register(log, WATER, 100, 128, plank, ItemDusts.getDustByName("sawDust", 3), getStack(Items.PAPER, 1)); } - static void register(ItemStack input1, ItemStack input2, FluidStack fluid, int ticks, int euPerTick, ItemStack... outputs) { + static void register(ItemStack input1, FluidStack fluid, int ticks, int euPerTick, ItemStack... outputs) { if (outputs.length == 3) { - RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, input2, - fluid, outputs[0], outputs[1], outputs[2], ticks, euPerTick, false)); + RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, fluid, outputs[0], outputs[1], outputs[2], ticks, euPerTick, false)); } else if (outputs.length == 2) { - RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, input2, - fluid, outputs[0], outputs[1], null, ticks, euPerTick, false)); + RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, fluid, outputs[0], outputs[1], null, ticks, euPerTick, false)); } else if (outputs.length == 1) { - RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, input2, - fluid, outputs[0], null, null, ticks, euPerTick, false)); + RecipeHandler.addRecipe(new IndustrialSawmillRecipe(input1, fluid, outputs[0], null, null, ticks, euPerTick, false)); } else { throw new InvalidParameterException("Invalid industrial sawmill outputs: " + outputs); } diff --git a/src/main/java/techreborn/tiles/multiblock/TileIndustrialSawmill.java b/src/main/java/techreborn/tiles/multiblock/TileIndustrialSawmill.java index bbe4ce5fc..9df8c8db8 100644 --- a/src/main/java/techreborn/tiles/multiblock/TileIndustrialSawmill.java +++ b/src/main/java/techreborn/tiles/multiblock/TileIndustrialSawmill.java @@ -28,163 +28,122 @@ import net.minecraft.block.BlockLiquid; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidBlock; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import reborncore.api.recipe.IBaseRecipeType; -import reborncore.api.recipe.RecipeHandler; +import reborncore.api.recipe.IRecipeCrafterProvider; import reborncore.api.tile.IInventoryProvider; import reborncore.api.IToolDrop; import reborncore.common.powerSystem.TilePowerAcceptor; +import reborncore.common.recipes.RecipeCrafter; +import reborncore.common.registration.RebornRegistry; +import reborncore.common.registration.impl.ConfigRegistry; import reborncore.common.util.FluidUtils; import reborncore.common.util.Inventory; -import reborncore.common.util.ItemUtils; import reborncore.common.util.Tank; import techreborn.api.Reference; -import techreborn.api.recipe.BaseRecipe; +import techreborn.api.recipe.ITileRecipeHandler; import techreborn.api.recipe.machines.IndustrialSawmillRecipe; import techreborn.client.container.IContainerProvider; import techreborn.client.container.builder.BuiltContainer; import techreborn.client.container.builder.ContainerBuilder; import techreborn.init.ModBlocks; -import techreborn.items.ItemDusts; +import techreborn.lib.ModInfo; -import java.util.Random; +@RebornRegistry(modID = ModInfo.MOD_ID) +public class TileIndustrialSawmill extends TilePowerAcceptor implements IToolDrop, + ITileRecipeHandler, IRecipeCrafterProvider, IInventoryProvider, IContainerProvider { + + @ConfigRegistry(config = "machines", category = "industrial_sawmill", key = "IndustrialSawmillMaxInput", comment = "Industrial Sawmill Max Input (Value in EU)") + public static int maxInput = 128; + @ConfigRegistry(config = "machines", category = "industrial_sawmill", key = "IndustrialSawmillMaxEnergy", comment = "Industrial Sawmill Max Energy (Value in EU)") + public static int maxEnergy = 10000; -public class TileIndustrialSawmill extends TilePowerAcceptor - implements IToolDrop, IInventoryProvider, IContainerProvider { public static final int TANK_CAPACITY = 16000; - - public Inventory inventory = new Inventory(5, "Sawmill", 64, this); - public Tank tank = new Tank("Sawmill", TileIndustrialSawmill.TANK_CAPACITY, this); - - public int tickTime; + public Inventory inventory; + public Tank tank; + public RecipeCrafter crafter; public MultiblockChecker multiblockChecker; - IndustrialSawmillRecipe smRecipe; + int ticksSinceLastChange; + + //int tickTime; + //IndustrialSawmillRecipe smRecipe; public TileIndustrialSawmill() { super(); + this.tank = new Tank("TileSawmill", TileIndustrialSawmill.TANK_CAPACITY, this); + this.inventory = new Inventory(7, "TileSawmill", 64, this); + this.ticksSinceLastChange = 0; + final int[] inputs = new int[] { 0, 1 }; + final int[] outputs = new int[] { 2, 3, 4 }; + this.crafter = new RecipeCrafter(Reference.industrialSawmillRecipe, this, 1, 3, this.inventory, inputs, + outputs); + } + + public boolean getMutliBlock() { + if (multiblockChecker == null) { + return false; + } + final boolean down = this.multiblockChecker.checkRectY(1, 1, MultiblockChecker.STANDARD_CASING, + MultiblockChecker.ZERO_OFFSET); + final boolean up = this.multiblockChecker.checkRectY(1, 1, MultiblockChecker.STANDARD_CASING, + new BlockPos(0, 2, 0)); + final boolean blade = this.multiblockChecker.checkRingY(1, 1, MultiblockChecker.REINFORCED_CASING, + new BlockPos(0, 1, 0)); + final IBlockState centerBlock = this.multiblockChecker.getBlock(0, 1, 0); + final boolean center = ((centerBlock.getBlock() instanceof BlockLiquid + || centerBlock.getBlock() instanceof IFluidBlock) && centerBlock.getMaterial() == Material.WATER); + return down && center && blade && up; + } + + public int getProgressScaled(final int scale) { + if (this.crafter.currentTickTime != 0) { + return this.crafter.currentTickTime * scale / this.crafter.currentNeededTicks; + } + return 0; } @Override public void update() { super.update(); - - if (this.getMutliBlock() && !world.isRemote) { - final ItemStack wood = this.inventory.getStackInSlot(0); - if (this.tickTime == 0) { - if (!wood.isEmpty()) { - for (IBaseRecipeType recipe : RecipeHandler.getRecipeClassFromName(Reference.industrialSawmillRecipe)) { - if (recipe instanceof IndustrialSawmillRecipe) {//Should always be true - IndustrialSawmillRecipe sawmillRecipe = (IndustrialSawmillRecipe) recipe; - if (isValidForRecipe(sawmillRecipe)) { - this.useEnergy(sawmillRecipe.euPerTick); - this.tickTime = 1; - smRecipe = sawmillRecipe; - } - } - } - } - } else if (smRecipe != null) { - if (canUseEnergy(smRecipe.euPerTick) && !tank.isEmpty() && tank.getFluid().amount >= 10 && isValidForRecipe(smRecipe)) { - tickTime++; - this.tank.drain(10, true); - } - if (tickTime > smRecipe.tickTime() && isValidForRecipe(smRecipe)) { - final Random rnd = this.world.rand; - this.addOutput(2, smRecipe.getOutput(0)); - Object woodRecipeObj = smRecipe.getInputs().get(0); - if (woodRecipeObj instanceof ItemStack) { - ItemStack woodStack = (ItemStack) woodRecipeObj; - wood.shrink(woodStack.getCount()); - } else { - wood.shrink(1); - } - if (rnd.nextInt(4) != 0) { - final ItemStack pulp = ItemDusts.getDustByName("sawDust", 2 + rnd.nextInt(3)).copy(); - if (this.canAddOutput(2, pulp.getCount())) { - this.addOutput(3, pulp); - } - } - if (rnd.nextInt(3) == 0) { - final ItemStack paper = new ItemStack(Items.PAPER, 1 + rnd.nextInt(2)).copy(); - if (this.canAddOutput(4, paper.getCount())) { - this.addOutput(4, paper); - } - } - this.tickTime = 0; - } else if (!isValidForRecipe(smRecipe)) { - smRecipe = null; - tickTime = 0; - } - } - if (smRecipe == null) { - tickTime = 0; - } + if (this.multiblockChecker == null) { + final BlockPos pos = this.getPos().offset(this.getFacing().getOpposite(), 2).down(); + this.multiblockChecker = new MultiblockChecker(this.world, pos); } - FluidUtils.drainContainers(this.tank, this.inventory, 1, 4); - } - public boolean isValidForRecipe(BaseRecipe baseRecipe) { - ItemStack inputStack = this.inventory.getStackInSlot(0); - int inputCount = 1; - if (baseRecipe.getInputs().get(0) instanceof ItemStack) { - inputCount = ((ItemStack) baseRecipe.getInputs().get(0)).getCount(); + this.ticksSinceLastChange++; + // Check cells input slot 2 time per second + if (this.ticksSinceLastChange >= 10) { + if (!this.inventory.getStackInSlot(1).isEmpty()) { + FluidUtils.drainContainers(this.tank, this.inventory, 1, 5); + FluidUtils.fillContainers(this.tank, this.inventory, 1, 5, this.tank.getFluidType()); + } + this.ticksSinceLastChange = 0; } - return ItemUtils.isInputEqual(baseRecipe.getInputs().get(0), inputStack, true, true, false) && inputStack.getCount() >= inputCount && this.canAddOutput(2, baseRecipe.getOutput(0).getCount()) && !this.tank.isEmpty(); - } - public void addOutput(final int slot, final ItemStack stack) { - if (this.getStackInSlot(slot) == ItemStack.EMPTY) - this.setInventorySlotContents(slot, stack); - this.getStackInSlot(slot).grow(stack.getCount()); - } - - public boolean canAddOutput(final int slot, final int amount) { - final ItemStack stack = this.getStackInSlot(slot); - return stack.isEmpty() || this.getInventoryStackLimit() - stack.getCount() >= amount; - } - - @Override - public void validate() { - super.validate(); - this.multiblockChecker = new MultiblockChecker(this.world, this.getPos().down(3)); - } - - public boolean getMutliBlock() { - final boolean down = this.multiblockChecker.checkRectY(1, 1, MultiblockChecker.STANDARD_CASING, - MultiblockChecker.ZERO_OFFSET); - final boolean up = this.multiblockChecker.checkRectY(1, 1, MultiblockChecker.STANDARD_CASING, - new BlockPos(0, 2, 0)); - final boolean blade = this.multiblockChecker.checkRingY(1, 1, MultiblockChecker.REINFORCED_CASING, - new BlockPos(0, 1, 0)); - final IBlockState centerBlock = this.multiblockChecker.getBlock(0, 1, 0); - final boolean center = ((centerBlock.getBlock() instanceof BlockLiquid || centerBlock.getBlock() instanceof IFluidBlock) && centerBlock.getBlock().getMaterial(centerBlock) == Material.WATER); - return down && center && blade && up; - } - - @Override - public ItemStack getToolDrop(final EntityPlayer entityPlayer) { - return new ItemStack(ModBlocks.INDUSTRIAL_SAWMILL, 1); + if (!world.isRemote && this.getMutliBlock()) { + this.charge(6); + } } @Override public void readFromNBT(final NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); this.tank.readFromNBT(tagCompound); - this.tickTime = tagCompound.getInteger("tickTime"); + this.crafter.readFromNBT(tagCompound); } @Override public NBTTagCompound writeToNBT(final NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); this.tank.writeToNBT(tagCompound); - tagCompound.setInteger("tickTime", this.tickTime); + this.crafter.writeToNBT(tagCompound); return tagCompound; } @@ -200,36 +159,16 @@ public class TileIndustrialSawmill extends TilePowerAcceptor @Override public T getCapability(final Capability capability, final EnumFacing facing) { if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { - return (T) this.tank; + if (this.tank != null) { + return (T) this.tank; + } } return super.getCapability(capability, facing); } - @Override - public int[] getSlotsForFace(final EnumFacing side) { - return new int[] { 0, 2, 3, 4 }; - } - - @Override - public boolean canInsertItem(final int index, final ItemStack itemStackIn, final EnumFacing direction) { - return index == 0; - } - - @Override - public boolean canExtractItem(final int index, final ItemStack stack, final EnumFacing direction) { - return index >= 2; - } - - public int getProgressScaled(final int scale) { - if (this.tickTime != 0) { - return this.tickTime * scale / 100; - } - return 0; - } - @Override public double getBaseMaxPower() { - return 64000; + return maxEnergy; } @Override @@ -249,26 +188,108 @@ public class TileIndustrialSawmill extends TilePowerAcceptor @Override public double getBaseMaxInput() { - return 64; + return maxInput; } + @Override + public int[] getSlotsForFace(final EnumFacing side) { + return new int[] { 1, 0, 2, 3, 4, 5 }; + } + + @Override + public boolean canInsertItem(final int slotIndex, final ItemStack itemStack, final EnumFacing direction) { + if (slotIndex >= 2) + return false; + return this.isItemValidForSlot(slotIndex, itemStack); + } + + @Override + public boolean isItemValidForSlot(int slotIndex, ItemStack itemStack) { + if (slotIndex == 1) { + if (itemStack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null)) { + return true; + } else { + return false; + } + } + return true; + } + + @Override + public boolean canExtractItem(final int slotIndex, final ItemStack itemStack, final EnumFacing side) { + return slotIndex == 2 || slotIndex == 3 || slotIndex == 4 || slotIndex == 5; + } + + // IToolDrop + @Override + public ItemStack getToolDrop(final EntityPlayer entityPlayer) { + return new ItemStack(ModBlocks.INDUSTRIAL_SAWMILL, 1); + } + + // ITileRecipeHandler + @Override + public boolean canCraft(TileEntity tile, IndustrialSawmillRecipe recipe) { + if (!getMutliBlock()) { + return false; + } + final FluidStack recipeFluid = recipe.fluidStack; + final FluidStack tankFluid = this.tank.getFluid(); + if (recipe.fluidStack == null) { + return true; + } + if (tankFluid == null) { + return false; + } + if (tankFluid.isFluidEqual(recipeFluid)) { + if (tankFluid.amount >= recipeFluid.amount) { + return true; + } + } + return false; + } + + @Override + public boolean onCraft(TileEntity tile, IndustrialSawmillRecipe recipe) { + final FluidStack recipeFluid = recipe.fluidStack; + final FluidStack tankFluid = this.tank.getFluid(); + if (recipe.fluidStack == null) { + return true; + } + if (tankFluid == null) { + return false; + } + if (tankFluid.isFluidEqual(recipeFluid)) { + if (tankFluid.amount >= recipeFluid.amount) { + if (tankFluid.amount == recipeFluid.amount) { + this.tank.setFluid(null); + } else { + tankFluid.amount -= recipeFluid.amount; + } + this.syncWithAll(); + return true; + } + } + return false; + } + + // IRecipeCrafterProvider + @Override + public RecipeCrafter getRecipeCrafter() { + return this.crafter; + } + + // IInventoryProvider @Override public Inventory getInventory() { return this.inventory; } - public int getTickTime() { - return tickTime; - } - - public void setTickTime(int tickTime) { - this.tickTime = tickTime; - } - + // IContainerProvider @Override public BuiltContainer createContainer(final EntityPlayer player) { - return new ContainerBuilder("industrialsawmill").player(player.inventory).inventory(8, 84).hotbar(8, 142) - .addInventory().tile(this).slot(0, 32, 26).slot(1, 32, 44).outputSlot(2, 84, 35).outputSlot(3, 102, 35) - .outputSlot(4, 120, 35).syncEnergyValue().syncIntegerValue(this::getTickTime, this::setTickTime).addInventory().create(this); + return new ContainerBuilder("industrialsawmill").player(player.inventory).inventory().hotbar().addInventory() + .tile(this).fluidSlot(1, 34, 35).slot(0, 84, 43).outputSlot(2, 126, 25).outputSlot(3, 126, 43) + .outputSlot(4, 126, 61).outputSlot(5, 34, 55).energySlot(6, 8, 72).syncEnergyValue().syncCrafterValue() + .addInventory().create(this); } }