From 9965ada88f948fb582bdeccab672b88235ff91d8 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 1 Feb 2024 16:54:12 +0100 Subject: [PATCH] ough --- changelog | 3 +- src/main/java/com/hbm/blocks/ModBlocks.java | 3 + .../blocks/machine/MachineHydrotreater.java | 43 ++++ .../ContainerMachineHydrotreater.java | 107 +++++++++ .../hbm/inventory/fluid/tank/FluidTank.java | 14 ++ .../inventory/gui/GUIMachineHydrotreater.java | 73 ++++++ .../recipes/HydrotreatingRecipes.java | 84 +++++++ .../recipes/loader/SerializableRecipe.java | 1 + src/main/java/com/hbm/main/ClientProxy.java | 1 + .../java/com/hbm/main/ResourceManager.java | 8 +- .../render/tileentity/RenderHydrotreater.java | 52 +++++ .../TileEntityMachineCatalyticReformer.java | 2 +- .../oil/TileEntityMachineHydrotreater.java | 208 ++++++++++++++++++ .../gui/processing/gui_catalytic_reformer.png | Bin 5356 -> 5395 bytes .../gui/processing/gui_hydrotreater.png | Bin 5217 -> 5260 bytes 15 files changed, 594 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java create mode 100644 src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderHydrotreater.java create mode 100644 src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java diff --git a/changelog b/changelog index 1f341a394..78ba0dbd9 100644 --- a/changelog +++ b/changelog @@ -10,4 +10,5 @@ * If I see one more person complaining about the chances I'm reducing it down to 10% * Catalytic reformers now have a tooltip informing about the need for a catalytic converter * Several guns now have reload animations including most .357 revolvers and Samuel -* Updated stealth missile texture \ No newline at end of file +* Updated stealth missile texture +* Some of the larger oil machines now render using display lists which should make them somewhat more performant \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 5b57c94af..403ff7508 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -987,6 +987,7 @@ public class ModBlocks { public static Block fraction_spacer; public static Block machine_catalytic_cracker; public static Block machine_catalytic_reformer; + public static Block machine_hydrotreater; public static Block machine_coker; public static Block machine_boiler_off; @@ -2253,6 +2254,7 @@ public class ModBlocks { fraction_spacer = new FractionSpacer(Material.iron).setBlockName("fraction_spacer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_catalytic_cracker = new MachineCatalyticCracker(Material.iron).setBlockName("machine_catalytic_cracker").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_catalytic_reformer = new MachineCatalyticReformer(Material.iron).setBlockName("machine_catalytic_reformer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + machine_hydrotreater = new MachineHydrotreater(Material.iron).setBlockName("machine_hydrotreater").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_coker = new MachineCoker(Material.iron).setBlockName("machine_coker").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_autosaw = new MachineAutosaw().setBlockName("machine_autosaw").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_excavator = new MachineExcavator().setBlockName("machine_excavator").setHardness(5.0F).setResistance(100.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -3361,6 +3363,7 @@ public class ModBlocks { register(fraction_spacer); register(machine_catalytic_cracker); register(machine_catalytic_reformer); + register(machine_hydrotreater); register(machine_coker); register(machine_autosaw); register(machine_excavator); diff --git a/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java b/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java new file mode 100644 index 000000000..e689fb4df --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/MachineHydrotreater.java @@ -0,0 +1,43 @@ +package com.hbm.blocks.machine; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.oil.TileEntityMachineHydrotreater; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineHydrotreater extends BlockDummyable { + + public MachineHydrotreater(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineHydrotreater(); + if(meta >= 6) return new TileEntityProxyCombo().fluid().power(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + + @Override public int[] getDimensions() { return new int[] {6, 0, 1, 1, 1, 1}; } + @Override public int getOffset() { return 1; } + + @Override + protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + this.makeExtra(world, x - dir.offsetX + 1, y, z - dir.offsetZ + 1); + this.makeExtra(world, x - dir.offsetX + 1, y, z - dir.offsetZ - 1); + this.makeExtra(world, x - dir.offsetX - 1, y, z - dir.offsetZ + 1); + this.makeExtra(world, x - dir.offsetX - 1, y, z - dir.offsetZ - 1); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java new file mode 100644 index 000000000..375e0d753 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java @@ -0,0 +1,107 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotTakeOnly; +import com.hbm.items.ModItems; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.oil.TileEntityMachineHydrotreater; + +import api.hbm.energy.IBatteryItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerMachineHydrotreater extends Container { + + private TileEntityMachineHydrotreater hydrotreater; + + public ContainerMachineHydrotreater(InventoryPlayer invPlayer, TileEntityMachineHydrotreater tedf) { + + hydrotreater = tedf; + + //Battery + this.addSlotToContainer(new Slot(tedf, 0, 17, 90)); + //Canister Input + this.addSlotToContainer(new Slot(tedf, 1, 35, 90)); + //Canister Output + this.addSlotToContainer(new SlotTakeOnly(tedf, 2, 35, 108)); + //Hydrogen Input + this.addSlotToContainer(new Slot(tedf, 3, 53, 90)); + //Hydrogen Output + this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 53, 108)); + //Desulfated Oil Input + this.addSlotToContainer(new Slot(tedf, 5, 125, 90)); + //Desulfated Oil Output + this.addSlotToContainer(new SlotTakeOnly(tedf, 6, 125, 108)); + //Sour Gas Input + this.addSlotToContainer(new Slot(tedf, 7, 143, 90)); + //Sour Gas Oil Output + this.addSlotToContainer(new SlotTakeOnly(tedf, 8, 143, 108)); + //Fluid ID + this.addSlotToContainer(new Slot(tedf, 9, 17, 108)); + //Catalyst + this.addSlotToContainer(new Slot(tedf, 10, 89, 36)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 156 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 214)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= 10) { + if(!this.mergeItemStack(var5, 11, this.inventorySlots.size(), true)) { + return null; + } + } else { + + if(var3.getItem() instanceof IBatteryItem) { + if(!this.mergeItemStack(var5, 0, 1, false)) { + return null; + } + } else if(var3.getItem() instanceof IItemFluidIdentifier) { + if(!this.mergeItemStack(var5, 9, 10, false)) { + return null; + } + } else if(var3.getItem() == ModItems.catalytic_converter) { + if(!this.mergeItemStack(var5, 10, 11, false)) { + return null; + } + } else { + if(!this.mergeItemStack(var5, 1, 2, false)) + if(!this.mergeItemStack(var5, 3, 4, false)) + if(!this.mergeItemStack(var5, 5, 6, false)) + if(!this.mergeItemStack(var5, 7, 8, false)) + return null; + } + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return hydrotreater.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 5f093bc66..719b0eda3 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -15,6 +15,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEFluidPacket; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.item.Item; @@ -300,5 +301,18 @@ public class FluidTank { this.pressure = nbt.getShort(s + "_p"); } + + public void serialize(ByteBuf buf) { + buf.writeInt(fluid); + buf.writeInt(maxFluid); + buf.writeInt(type.getID()); + buf.writeShort((short) pressure); + } + public void deserialize(ByteBuf buf) { + fluid = buf.readInt(); + maxFluid = buf.readInt(); + type = Fluids.fromID(buf.readInt()); + pressure = buf.readShort(); + } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java b/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java new file mode 100644 index 000000000..2704a5ce4 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineHydrotreater.java @@ -0,0 +1,73 @@ +package com.hbm.inventory.gui; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineHydrotreater; +import com.hbm.items.ModItems; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.oil.TileEntityMachineHydrotreater; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineHydrotreater extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_hydrotreater.png"); + private TileEntityMachineHydrotreater refinery; + + public GUIMachineHydrotreater(InventoryPlayer invPlayer, TileEntityMachineHydrotreater tedf) { + super(new ContainerMachineHydrotreater(invPlayer, tedf)); + refinery = tedf; + + this.xSize = 176; + this.ySize = 238; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + refinery.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 35, guiTop + 70 - 52, 16, 52); + refinery.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 53, guiTop + 70 - 52, 16, 52); + refinery.tanks[2].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52); + refinery.tanks[3].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 70 - 52, 16, 52, refinery.power, refinery.maxPower); + + if(this.mc.thePlayer.inventory.getItemStack() == null && this.isMouseOverSlot(this.inventorySlots.getSlot(10), mouseX, mouseY) && !this.inventorySlots.getSlot(10).getHasStack()) { + List lines = new ArrayList(); + ItemStack converter = new ItemStack(ModItems.catalytic_converter); + lines.add(new Object[] {converter}); + lines.add(new Object[] {converter.getDisplayName()}); + this.drawStackText(lines, mouseX, mouseY, this.fontRendererObj); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.refinery.hasCustomInventoryName() ? this.refinery.getInventoryName() : I18n.format(this.refinery.getInventoryName()); + + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 5, 0xffffff); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int j = (int) (refinery.power * 54 / refinery.maxPower); + drawTexturedModalRect(guiLeft + 17, guiTop + 70 - j, 176, 52 - j, 16, j); + + refinery.tanks[0].renderTank(guiLeft + 35, guiTop + 70, this.zLevel, 16, 52); + refinery.tanks[1].renderTank(guiLeft + 53, guiTop + 70, this.zLevel, 16, 52); + refinery.tanks[2].renderTank(guiLeft + 125, guiTop + 70, this.zLevel, 16, 52); + refinery.tanks[3].renderTank(guiLeft + 143, guiTop + 70, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java new file mode 100644 index 000000000..7d828e044 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java @@ -0,0 +1,84 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map.Entry; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonWriter; +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.util.Tuple.Triplet; + +import net.minecraft.item.ItemStack; + +public class HydrotreatingRecipes extends SerializableRecipe { + + private static HashMap> recipes = new HashMap(); + + @Override + public void registerDefaults() { + + } + + public static Triplet getOutput(FluidType type) { + return recipes.get(type); + } + + public static HashMap getRecipes() { + + HashMap map = new HashMap(); + + for(Entry> recipe : recipes.entrySet()) { + map.put(new ItemStack[] { + ItemFluidIcon.make(recipe.getKey(), 1000), + ItemFluidIcon.make(recipe.getValue().getX().type, recipe.getValue().getX().fill * 10) }, + new ItemStack[] { + ItemFluidIcon.make(recipe.getValue().getY().type, recipe.getValue().getY().fill * 10), + ItemFluidIcon.make(recipe.getValue().getZ().type, recipe.getValue().getZ().fill * 10) }); + } + + return map; + } + + @Override + public String getFileName() { + return "hbmHydrotreating.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + + FluidType input = Fluids.fromName(obj.get("input").getAsString()); + FluidStack hydrogen = this.readFluidStack(obj.get("hydrogen").getAsJsonArray()); + FluidStack output1 = this.readFluidStack(obj.get("output1").getAsJsonArray()); + FluidStack output2 = this.readFluidStack(obj.get("output2").getAsJsonArray()); + + recipes.put(input, new Triplet(hydrogen, output1, output2)); + } + + @Override + public void writeRecipe(Object recipe, JsonWriter writer) throws IOException { + Entry> rec = (Entry>) recipe; + + writer.name("input").value(rec.getKey().getName()); + writer.name("hydrogen"); this.writeFluidStack(rec.getValue().getX(), writer); + writer.name("output1"); this.writeFluidStack(rec.getValue().getY(), writer); + writer.name("output2"); this.writeFluidStack(rec.getValue().getZ(), writer); + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } +} diff --git a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java index f54138b0f..ac32b1332 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -52,6 +52,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new FractionRecipes()); recipeHandlers.add(new CrackingRecipes()); recipeHandlers.add(new ReformingRecipes()); + recipeHandlers.add(new HydrotreatingRecipes()); recipeHandlers.add(new LiquefactionRecipes()); recipeHandlers.add(new SolidificationRecipes()); recipeHandlers.add(new CokerRecipes()); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index bd1511af5..b7d57b144 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -294,6 +294,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineAutosaw.class, new RenderAutosaw()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineVacuumDistill.class, new RenderVacuumDistill()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCatalyticReformer.class, new RenderCatalyticReformer()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineHydrotreater.class, new RenderHydrotreater()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineCoker.class, new RenderCoker()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFan.class, new RenderFan()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPistonInserter.class, new RenderPistonInserter()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 0edf21cfc..151131393 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -80,12 +80,13 @@ public class ResourceManager { public static final IModelCustom refinery_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery_exploded.obj")); public static final IModelCustom fraction_tower = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fraction_tower.obj")); public static final IModelCustom fraction_spacer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fraction_spacer.obj")); - public static final IModelCustom cracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/cracking_tower.obj")); - public static final IModelCustom catalytic_reformer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/catalytic_reformer.obj")); + public static final IModelCustom cracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/cracking_tower.obj")).asDisplayList(); + public static final IModelCustom catalytic_reformer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/catalytic_reformer.obj")).asDisplayList(); + public static final IModelCustom hydrotreater = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/hydrotreater.obj")).asDisplayList(); public static final IModelCustom liquefactor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/liquefactor.obj")); public static final IModelCustom solidifier = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/solidifier.obj")); public static final IModelCustom compressor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/compressor.obj")); - public static final IModelCustom coker = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/coker.obj")); + public static final IModelCustom coker = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/coker.obj")).asDisplayList(); //Flare Stack public static final IModelCustom oilflare = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/flare_stack.obj")); @@ -479,6 +480,7 @@ public class ResourceManager { public static final ResourceLocation fraction_spacer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fraction_spacer.png"); public static final ResourceLocation cracking_tower_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/cracking_tower.png"); public static final ResourceLocation catalytic_reformer_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/catalytic_reformer.png"); + public static final ResourceLocation hydrotreater_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/hydrotreater.png"); public static final ResourceLocation liquefactor_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/liquefactor.png"); public static final ResourceLocation solidifier_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/solidifier.png"); public static final ResourceLocation compressor_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/compressor.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderHydrotreater.java b/src/main/java/com/hbm/render/tileentity/RenderHydrotreater.java new file mode 100644 index 000000000..b2e3b319a --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderHydrotreater.java @@ -0,0 +1,52 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderHydrotreater extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) { + + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.hydrotreater_tex); + ResourceManager.hydrotreater.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_hydrotreater); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -4, 0); + GL11.glScaled(4, 4, 4); + } + public void renderCommon() { + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.hydrotreater_tex); + ResourceManager.hydrotreater.renderAll(); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index 5ef5ed3c2..66f4b6eab 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -55,7 +55,7 @@ public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase im if(!worldObj.isRemote) { - this.updateConnections(); + if(this.worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); tanks[0].setType(9, slots); tanks[0].loadTank(1, 2, slots); diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java new file mode 100644 index 000000000..dfafab682 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java @@ -0,0 +1,208 @@ +package com.hbm.tileentity.machine.oil; + +import com.hbm.inventory.FluidStack; +import com.hbm.inventory.container.ContainerMachineHydrotreater; +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachineHydrotreater; +import com.hbm.inventory.recipes.HydrotreatingRecipes; +import com.hbm.items.ModItems; +import com.hbm.lib.Library; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.IPersistentNBT; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.Tuple.Triplet; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidStandardTransceiver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityMachineHydrotreater extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { + + public long power; + public static final long maxPower = 1_000_000; + + public FluidTank[] tanks; + + public TileEntityMachineHydrotreater() { + super(11); + + this.tanks = new FluidTank[4]; + this.tanks[0] = new FluidTank(Fluids.OIL, 64_000); + this.tanks[1] = new FluidTank(Fluids.HYDROGEN, 64_000); + this.tanks[2] = new FluidTank(Fluids.NONE, 24_000); + this.tanks[3] = new FluidTank(Fluids.SOURGAS, 24_000); + } + + @Override + public String getName() { + return "container.hydrotreater"; + } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(this.worldObj.getTotalWorldTime() % 20 == 0) this.updateConnections(); + power = Library.chargeTEFromItems(slots, 0, power, maxPower); + tanks[0].setType(9, slots); + + tanks[0].loadTank(1, 2, slots); + tanks[1].loadTank(3, 4, slots); + + reform(); + + tanks[2].unloadTank(5, 6, slots); + tanks[3].unloadTank(7, 8, slots); + + for(DirPos pos : getConPos()) { + for(int i = 2; i < 4; i++) { + if(tanks[i].getFill() > 0) { + this.sendFluid(tanks[i], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + } + } + } + + private void reform() { + + Triplet out = HydrotreatingRecipes.getOutput(tanks[0].getTankType()); + if(out == null) { + tanks[2].setTankType(Fluids.NONE); + tanks[3].setTankType(Fluids.NONE); + return; + } + + tanks[1].setTankType(out.getX().type); + tanks[2].setTankType(out.getY().type); + tanks[3].setTankType(out.getZ().type); + + if(power < 20_000) return; + if(tanks[0].getFill() < 50) return; + if(tanks[1].getFill() < out.getX().fill) return; + if(slots[10] == null || slots[10].getItem() != ModItems.catalytic_converter) return; + + if(tanks[2].getFill() + out.getY().fill > tanks[2].getMaxFill()) return; + if(tanks[3].getFill() + out.getZ().fill > tanks[3].getMaxFill()) return; + + tanks[0].setFill(tanks[0].getFill() - 50); + tanks[1].setFill(tanks[1].getFill() - out.getX().fill); + tanks[2].setFill(tanks[2].getFill() + out.getY().fill); + tanks[3].setFill(tanks[3].getFill() + out.getZ().fill); + + power -= 20_000; + } + + private void updateConnections() { + for(DirPos pos : getConPos()) { + this.trySubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + } + + public DirPos[] getConPos() { + + return new DirPos[] { + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z) + }; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + power = nbt.getLong("power"); + tanks[0].readFromNBT(nbt, "t0"); + tanks[1].readFromNBT(nbt, "t1"); + tanks[2].readFromNBT(nbt, "t2"); + tanks[3].readFromNBT(nbt, "t3"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("power", power); + tanks[0].writeToNBT(nbt, "t0"); + tanks[1].writeToNBT(nbt, "t1"); + tanks[2].writeToNBT(nbt, "t2"); + tanks[3].writeToNBT(nbt, "t3"); + } + + AxisAlignedBB bb = null; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 1, + yCoord, + zCoord - 1, + xCoord + 2, + yCoord + 7, + zCoord + 2 + ); + } + + return bb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } + + @Override public long getPower() { return power; } + @Override public void setPower(long power) { this.power = power; } + @Override public long getMaxPower() { return maxPower; } + @Override public FluidTank[] getAllTanks() { return tanks; } + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks[2], tanks[3]}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + @Override public boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN && dir != ForgeDirection.DOWN; } + @Override public boolean canConnect(FluidType type, ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN && dir != ForgeDirection.DOWN; } + + @Override + public void writeNBT(NBTTagCompound nbt) { + if(tanks[0].getFill() == 0 && tanks[1].getFill() == 0 && tanks[2].getFill() == 0 && tanks[3].getFill() == 0) return; + NBTTagCompound data = new NBTTagCompound(); + for(int i = 0; i < 4; i++) this.tanks[i].writeToNBT(data, "" + i); + nbt.setTag(NBT_PERSISTENT_KEY, data); + } + + @Override + public void readNBT(NBTTagCompound nbt) { + NBTTagCompound data = nbt.getCompoundTag(NBT_PERSISTENT_KEY); + for(int i = 0; i < 4; i++) this.tanks[i].readFromNBT(data, "" + i); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new ContainerMachineHydrotreater(player.inventory, this); + } + + @Override + @SideOnly(Side.CLIENT) + public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GUIMachineHydrotreater(player.inventory, this); + } +} diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_catalytic_reformer.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_catalytic_reformer.png index 077d004fd381c2d6147f8d9563c16b672e1bf44c..8806f89c767dc577139e7000da7ee16ca3bd5c91 100644 GIT binary patch literal 5395 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 literal 5356 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 F{|~=%;=%v` diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_hydrotreater.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_hydrotreater.png index 255588ac747fb0eb1540d7a012d0a73726f74c6a..451e335558b66a73ea3cbafbbe914e7c3b61218a 100644 GIT binary patch delta 4637 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%0A=v>oX$52+4_)%Cb*+AI-=wAG35ci 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