From a6f694b7b3ddaeee022302f23178672be443a735 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 29 Sep 2024 20:56:11 +0200 Subject: [PATCH] GUNMETAL --- changelog | 9 +- .../blocks/machine/MachineRotaryFurnace.java | 23 +- .../ContainerMachineRotaryFurnace.java | 75 ++++ .../container/ContainerMachineShredder.java | 4 +- .../gui/GUIMachineRotaryFurnace.java | 93 +++++ .../hbm/inventory/gui/GUIMachineShredder.java | 2 +- .../recipes/RotaryFurnaceRecipes.java | 176 ++++++++++ .../recipes/loader/SerializableRecipe.java | 1 + .../weapon/sedna/factory/GunFactory.java | 2 +- .../hbm/items/weapon/sedna/factory/Lego.java | 5 - .../weapon/sedna/factory/LegoClient.java | 10 + .../sedna/factory/XFactoryBlackPowder.java | 2 +- .../tileentity/RenderRotaryFurnace.java | 7 +- .../hbm/tileentity/IConditionalInvAccess.java | 2 +- .../TileEntityMachineRotaryFurnace.java | 328 +++++++++++++++++- .../oil/TileEntityMachinePyroOven.java | 14 +- .../blocks/machine_shredder_bottom_alt.png | Bin 451 -> 518 bytes .../blocks/machine_shredder_front_alt.png | Bin 321 -> 578 bytes .../blocks/machine_shredder_side_alt.png | Bin 271 -> 595 bytes .../blocks/machine_shredder_top_alt.png | Bin 280 -> 386 bytes .../assets/hbm/textures/gui/gui_shredder.png | Bin 3449 -> 4108 bytes .../gui/processing/gui_rotary_furnace.png | Bin 4529 -> 5655 bytes .../assets/hbm/textures/items/ammo.png | Bin 5344 -> 7407 bytes .../hbm/textures/items/ingot_gunmetal.png | Bin 353 -> 349 bytes .../models/machines/rotary_furnace.png | Bin 2087 -> 12871 bytes 25 files changed, 723 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerMachineRotaryFurnace.java create mode 100644 src/main/java/com/hbm/inventory/gui/GUIMachineRotaryFurnace.java create mode 100644 src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java create mode 100644 src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java diff --git a/changelog b/changelog index dd831e3fd..ce5ce5c44 100644 --- a/changelog +++ b/changelog @@ -4,7 +4,14 @@ * Overdrive upgrades now use fullerite instead of lithium crystals * Machines now only send their sync packets once a second instead of once per tick if the values haven't changed, reducing network traffic by a considerable amount * Tom's explosion no longer causes any block updates on the millions of blocks it deletes which hopefully fixes a majority of the lag caused by the crater +* Overdrive upgrades now increase power usage in pyrolysis ovens (equivalent to 2 speed upgrades per level) +* Due to the increased maximum demand with overdrives + speed upgrades, the energy buffer for the pyrolysis oven has been increased tenfold +* Updated basalt textures +* Scaffold blocks can now be placed horizontally +* Updated the shredder's textures ## Fixed * The conveyor grabber should no longer skip over items when used in long lines -* Fixed a potential crash regarding crucibles \ No newline at end of file +* Fixed a potential crash regarding crucibles +* Fixed compatibility with EndlessIDs, biome changes should no longer crash the game +* Fixed GL state leak caused by fluid tanks, causing some tile entities to be rendered without face culling \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java index 2160a0451..523bc10b7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java +++ b/src/main/java/com/hbm/blocks/machine/MachineRotaryFurnace.java @@ -8,6 +8,7 @@ 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 MachineRotaryFurnace extends BlockDummyable { @@ -29,11 +30,31 @@ public class MachineRotaryFurnace extends BlockDummyable { @Override public int[] getDimensions() { - return new int[] {3, 0, 1, 1, 2, 2}; + return new int[] {4, 0, 1, 1, 2, 2}; } @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); + x += dir.offsetX * o; + z += dir.offsetZ * o; + + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + //back + for(int i = -2; i <= 2; i++) { + this.makeExtra(world, x - dir.offsetX + rot.offsetX * i, y, z - dir.offsetZ + rot.offsetZ * i); + } + //side fluid + this.makeExtra(world, x + dir.offsetX - rot.offsetX * 2, y, z + dir.offsetZ - rot.offsetZ * 2); + //exhaust + this.makeExtra(world, x + rot.offsetX, y + 4, z + rot.offsetZ); + //solid fuel + this.makeExtra(world, x + dir.offsetX + rot.offsetX, y, z + dir.offsetZ + rot.offsetZ); + } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineRotaryFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerMachineRotaryFurnace.java new file mode 100644 index 000000000..219f1f0e6 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineRotaryFurnace.java @@ -0,0 +1,75 @@ +package com.hbm.inventory.container; + +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; + +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; +import net.minecraft.tileentity.TileEntityFurnace; + +public class ContainerMachineRotaryFurnace extends Container { + + private TileEntityMachineRotaryFurnace furnace; + + public ContainerMachineRotaryFurnace(InventoryPlayer invPlayer, TileEntityMachineRotaryFurnace tile) { + furnace = tile; + + //Inputs + this.addSlotToContainer(new Slot(tile, 0, 8, 18)); + this.addSlotToContainer(new Slot(tile, 1, 26, 18)); + this.addSlotToContainer(new Slot(tile, 2, 44, 18)); + //Fluid ID + this.addSlotToContainer(new Slot(tile, 3, 8, 54)); + //Solid fuel + this.addSlotToContainer(new Slot(tile, 4, 44, 54)); + + 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, 104 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 162)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack rStack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + rStack = stack.copy(); + + if(index <= 4) { + if(!this.mergeItemStack(stack, 5, this.inventorySlots.size(), true)) return null; + } else { + if(TileEntityFurnace.isItemFuel(rStack)) { + if(!this.mergeItemStack(stack, 4, 5, false)) return null; + } else if(rStack.getItem() instanceof IItemFluidIdentifier) { + if(!this.mergeItemStack(stack, 3, 4, false)) return null; + } else { + if(!this.mergeItemStack(stack, 0, 3, false)) return null; + } + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return rStack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return furnace.isUseableByPlayer(player); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java b/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java index c10e47ae7..983129533 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java @@ -55,12 +55,12 @@ public class ContainerMachineShredder extends Container { 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, 84 + i * 18 + 56)); + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18 + 67)); } } for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + 56)); + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + 67)); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineRotaryFurnace.java b/src/main/java/com/hbm/inventory/gui/GUIMachineRotaryFurnace.java new file mode 100644 index 000000000..873694184 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineRotaryFurnace.java @@ -0,0 +1,93 @@ +package com.hbm.inventory.gui; + +import java.awt.Color; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerMachineRotaryFurnace; +import com.hbm.inventory.material.Mats; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.machine.TileEntityMachineRotaryFurnace; +import com.hbm.util.I18nUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIMachineRotaryFurnace extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/processing/gui_rotary_furnace.png"); + private TileEntityMachineRotaryFurnace furnace; + + public GUIMachineRotaryFurnace(InventoryPlayer playerInv, TileEntityMachineRotaryFurnace tile) { + super(new ContainerMachineRotaryFurnace(playerInv, tile)); + + this.furnace = tile; + this.xSize = 176; + this.ySize = 186; + } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + furnace.tanks[0].renderTankInfo(this, x, y, guiLeft + 8, guiTop + 36, 52, 16); + furnace.tanks[1].renderTankInfo(this, x, y, guiLeft + 134, guiTop + 18, 16, 52); + furnace.tanks[2].renderTankInfo(this, x, y, guiLeft + 152, guiTop + 18, 16, 52); + + if(furnace.output == null) { + this.drawCustomInfoStat(x, y, guiLeft + 98, guiTop + 18, 16, 52, x, y, EnumChatFormatting.RED + "Empty"); + } else { + this.drawCustomInfoStat(x, y, guiLeft + 98, guiTop + 18, 16, 52, x, y,EnumChatFormatting.YELLOW + + I18nUtil.resolveKey(furnace.output.material.getUnlocalizedName()) + ": " + Mats.formatAmount(furnace.output.amount, Keyboard.isKeyDown(Keyboard.KEY_LSHIFT))); + } + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.furnace.hasCustomInventoryName() ? this.furnace.getInventoryName() : I18n.format(this.furnace.getInventoryName()); + this.fontRendererObj.drawString(name, (this.xSize - 54) / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float interp, int x, int y) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int p = (int) (furnace.progress * 33); + drawTexturedModalRect(guiLeft + 63, guiTop + 30, 176, 0, p, 10); + + if(furnace.maxBurnTime > 0) { + int b = furnace.burnTime * 14 / furnace.maxBurnTime; + drawTexturedModalRect(guiLeft + 26, guiTop + 69 - b, 176, 24 - b, 14, b); + } + + if(furnace.output != null) { + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + + int hex = furnace.output.material.moltenColor; + int amount = furnace.output.amount * 52 / furnace.maxOutput; + Color color = new Color(hex); + GL11.glColor3f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + drawTexturedModalRect(guiLeft + 98, guiTop + 70 - amount, 176, 76 - amount, 16, amount); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1F, 1F, 1F, 0.3F); + drawTexturedModalRect(guiLeft + 98, guiTop + 70 - amount, 176, 76 - amount, 16, amount); + GL11.glDisable(GL11.GL_BLEND); + + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor3f(255, 255, 255); + } + + furnace.tanks[0].renderTank(guiLeft + 8, guiTop + 52, this.zLevel, 52, 16, 1); + furnace.tanks[1].renderTank(guiLeft + 134, guiTop + 70, this.zLevel, 16, 52); + furnace.tanks[2].renderTank(guiLeft + 152, guiTop + 70, this.zLevel, 16, 52); + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java b/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java index 255b789ba..ef433374e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineShredder.java @@ -21,7 +21,7 @@ public class GUIMachineShredder extends GuiInfoContainer { diFurnace = tedf; this.xSize = 176; - this.ySize = 222; + this.ySize = 233; } @Override diff --git a/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java b/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java new file mode 100644 index 000000000..713474b35 --- /dev/null +++ b/src/main/java/com/hbm/inventory/recipes/RotaryFurnaceRecipes.java @@ -0,0 +1,176 @@ +package com.hbm.inventory.recipes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import static com.hbm.inventory.OreDictManager.*; +import static com.hbm.inventory.material.Mats.*; +import static com.hbm.inventory.material.MaterialShapes.*; + +import com.google.gson.JsonArray; +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.RecipesCommon.AStack; +import com.hbm.inventory.RecipesCommon.OreDictStack; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.loader.SerializableRecipe; +import com.hbm.items.machine.ItemFluidIcon; +import com.hbm.items.machine.ItemScraps; + +import net.minecraft.item.ItemStack; + +public class RotaryFurnaceRecipes extends SerializableRecipe { + + public static List recipes = new ArrayList(); + + @Override + public void registerDefaults() { + + recipes.add(new RotaryFurnaceRecipe(new MaterialStack(MAT_STEEL, INGOT.q(1)), 200, 100, + new OreDictStack(IRON.ingot()), new OreDictStack(ANY_COKE.gem()) + )); + } + + public static HashMap getRecipes() { + + HashMap recipes = new HashMap(); + + for(RotaryFurnaceRecipe recipe : RotaryFurnaceRecipes.recipes) { + + int size = recipe.ingredients.length + (recipe.fluid != null ? 1 : 0); + Object[] array = new Object[size]; + + for(int i = 0; i < recipe.ingredients.length; i++) { + array[i] = recipe.ingredients[i]; + } + + if(recipe.fluid != null) array[size - 1] = ItemFluidIcon.make(recipe.fluid); + + recipes.put(array, ItemScraps.create(recipe.output, true)); + } + + return recipes; + } + + public static RotaryFurnaceRecipe getRecipe(ItemStack... inputs) { + + outer: + for(RotaryFurnaceRecipe recipe : recipes) { + + List recipeList = new ArrayList(); + for(AStack ingredient : recipe.ingredients) recipeList.add(ingredient); + + for(int i = 0; i < inputs.length; i++) { + + ItemStack inputStack = inputs[i]; + + if(inputStack != null) { + + boolean hasMatch = false; + Iterator iterator = recipeList.iterator(); + + while(iterator.hasNext()) { + AStack recipeStack = iterator.next(); + + if(recipeStack.matchesRecipe(inputStack, true) && inputStack.stackSize >= recipeStack.stacksize) { + hasMatch = true; + recipeList.remove(recipeStack); + break; + } + } + + if(!hasMatch) { + continue outer; + } + } + } + + if(recipeList.isEmpty()) return recipe; + } + + return null; + } + + @Override + public String getFileName() { + return "hbmRotaryFurnace.json"; + } + + @Override + public Object getRecipeObject() { + return recipes; + } + + @Override + public void deleteRecipes() { + recipes.clear(); + } + + @Override + public void readRecipe(JsonElement recipe) { + JsonObject obj = (JsonObject) recipe; + + AStack[] inputs = this.readAStackArray(obj.get("inputs").getAsJsonArray()); + FluidStack fluid = obj.has("fluid") ? this.readFluidStack(obj.get("fluid").getAsJsonArray()) : null; + + JsonArray array = obj.get("output").getAsJsonArray(); + MaterialStack stack = new MaterialStack(Mats.matByName.get(array.get(0).getAsString()), array.get(1).getAsInt()); + + int duration = obj.get("duration").getAsInt(); + int steam = obj.get("steam").getAsInt(); + + recipes.add(new RotaryFurnaceRecipe(stack, duration, steam, fluid, inputs)); + } + + @Override + public void writeRecipe(Object obj, JsonWriter writer) throws IOException { + RotaryFurnaceRecipe recipe = (RotaryFurnaceRecipe) obj; + + writer.name("inputs").beginArray(); + for(AStack aStack : recipe.ingredients) { + this.writeAStack(aStack, writer); + } + writer.endArray(); + + if(recipe.fluid != null) { + writer.name("fluid"); + this.writeFluidStack(recipe.fluid, writer); + } + + writer.name("output").beginArray(); + writer.setIndent(""); + writer.value(recipe.output.material.names[0]).value(recipe.output.amount); + writer.endArray(); + writer.setIndent(" "); + + writer.name("duration").value(recipe.duration); + writer.name("steam").value(recipe.steam); + } + + public static class RotaryFurnaceRecipe { + + public AStack[] ingredients; + public FluidStack fluid; + public MaterialStack output; + public int duration; + public int steam; + + public RotaryFurnaceRecipe(MaterialStack output, int duration, int steam, FluidStack fluid, AStack... ingredients) { + this.ingredients = ingredients; + this.fluid = fluid; + this.output = output; + this.duration = duration; + this.steam = steam; + } + + public RotaryFurnaceRecipe(MaterialStack output, int duration, int steam, AStack... ingredients) { + this(output, duration, steam, null, ingredients); + } + } +} 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 bbcbceb5a..3652216d0 100644 --- a/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java +++ b/src/main/java/com/hbm/inventory/recipes/loader/SerializableRecipe.java @@ -71,6 +71,7 @@ public abstract class SerializableRecipe { recipeHandlers.add(new ElectrolyserFluidRecipes()); recipeHandlers.add(new ElectrolyserMetalRecipes()); recipeHandlers.add(new ArcWelderRecipes()); + recipeHandlers.add(new RotaryFurnaceRecipes()); recipeHandlers.add(new ExposureChamberRecipes()); recipeHandlers.add(new AssemblerRecipes()); diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java index d44feaa28..30e1c9c74 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/GunFactory.java @@ -35,7 +35,7 @@ public class GunFactory { /// GUNS /// ModItems.gun_debug = new ItemGunBaseNT(new GunConfig() - .dura(600F).draw(15).jam(23).inspect(23).crosshair(Crosshair.L_CLASSIC).hud(Lego.HUD_COMPONENT_DURABILITY, Lego.HUD_COMPONENT_AMMO).smoke(true).orchestra(Orchestras.DEBUG_ORCHESTRA) + .dura(600F).draw(15).jam(23).inspect(23).crosshair(Crosshair.L_CLASSIC).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO).smoke(true).orchestra(Orchestras.DEBUG_ORCHESTRA) .rec(new Receiver(0) .dmg(10F).delay(14).reload(46).sound("hbm:weapon.44Shoot", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 12).addConfigs(ammo_debug, ammo_debug_buckshot)) diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java index fd6444561..55226db8a 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/Lego.java @@ -11,8 +11,6 @@ import com.hbm.items.weapon.sedna.ItemGunBaseNT; import com.hbm.items.weapon.sedna.ItemGunBaseNT.GunState; import com.hbm.items.weapon.sedna.ItemGunBaseNT.LambdaContext; import com.hbm.items.weapon.sedna.Receiver; -import com.hbm.items.weapon.sedna.hud.HUDComponentAmmoCounter; -import com.hbm.items.weapon.sedna.hud.HUDComponentDurabilityBar; import com.hbm.items.weapon.sedna.mags.IMagazine; import com.hbm.render.anim.BusAnimation; import com.hbm.render.anim.BusAnimationSequence; @@ -29,9 +27,6 @@ import net.minecraft.item.ItemStack; public class Lego { public static final Random ANIM_RAND = new Random(); - - public static HUDComponentDurabilityBar HUD_COMPONENT_DURABILITY = new HUDComponentDurabilityBar(); - public static HUDComponentAmmoCounter HUD_COMPONENT_AMMO = new HUDComponentAmmoCounter(0); /** * If IDLE and the mag of receiver 0 can be loaded, set state to RELOADING. Used by keybinds. */ diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java new file mode 100644 index 000000000..bed03eb38 --- /dev/null +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/LegoClient.java @@ -0,0 +1,10 @@ +package com.hbm.items.weapon.sedna.factory; + +import com.hbm.items.weapon.sedna.hud.HUDComponentAmmoCounter; +import com.hbm.items.weapon.sedna.hud.HUDComponentDurabilityBar; + +public class LegoClient { + + public static HUDComponentDurabilityBar HUD_COMPONENT_DURABILITY = new HUDComponentDurabilityBar(); + public static HUDComponentAmmoCounter HUD_COMPONENT_AMMO = new HUDComponentAmmoCounter(0); +} diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java index b541be616..1f39386a4 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactoryBlackPowder.java @@ -28,7 +28,7 @@ public class XFactoryBlackPowder { BulletConfig shot = new BulletConfig().setItem(EnumAmmo.STONE_SHOT).setSpread(0.1F).setRicochetAngle(45).setProjectiles(6, 6).setDamage(0.5F); ModItems.gun_pepperbox = new ItemGunBaseNT(new GunConfig() - .dura(300).draw(4).inspect(23).crosshair(Crosshair.CIRCLE).hud(Lego.HUD_COMPONENT_DURABILITY, Lego.HUD_COMPONENT_AMMO).smoke(true).orchestra(Orchestras.ORCHESTRA_PEPPERBOX) + .dura(300).draw(4).inspect(23).crosshair(Crosshair.CIRCLE).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO).smoke(true).orchestra(Orchestras.ORCHESTRA_PEPPERBOX) .rec(new Receiver(0) .dmg(5F).delay(27).reload(67).sound("hbm:weapon.fire.blackPowder", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 6).addConfigs(stone, flint, iron, shot)) diff --git a/src/main/java/com/hbm/render/tileentity/RenderRotaryFurnace.java b/src/main/java/com/hbm/render/tileentity/RenderRotaryFurnace.java index 57b5ee037..d7ff261ae 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderRotaryFurnace.java +++ b/src/main/java/com/hbm/render/tileentity/RenderRotaryFurnace.java @@ -6,6 +6,7 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; +import com.hbm.util.BobMathUtil; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; @@ -31,7 +32,11 @@ public class RenderRotaryFurnace extends TileEntitySpecialRenderer implements II GL11.glShadeModel(GL11.GL_SMOOTH); bindTexture(ResourceManager.rotary_furnace_tex); - ResourceManager.rotary_furnace.renderAll(); + ResourceManager.rotary_furnace.renderPart("Furnace"); + GL11.glPushMatrix(); + GL11.glTranslated(0, BobMathUtil.sps((tile.getWorldObj().getTotalWorldTime() + f) * 0.125) * 0.5 - 0.5, 0); + ResourceManager.rotary_furnace.renderPart("Piston"); + GL11.glPopMatrix(); GL11.glShadeModel(GL11.GL_FLAT); GL11.glPopMatrix(); diff --git a/src/main/java/com/hbm/tileentity/IConditionalInvAccess.java b/src/main/java/com/hbm/tileentity/IConditionalInvAccess.java index 9416eb837..d66553efa 100644 --- a/src/main/java/com/hbm/tileentity/IConditionalInvAccess.java +++ b/src/main/java/com/hbm/tileentity/IConditionalInvAccess.java @@ -11,7 +11,7 @@ import net.minecraft.item.ItemStack; public interface IConditionalInvAccess { public boolean isItemValidForSlot(int x, int y, int z, int slot, ItemStack stack); - public boolean canInsertItem(int x, int y, int z, int slot, ItemStack stack, int side); + public default boolean canInsertItem(int x, int y, int z, int slot, ItemStack stack, int side) { return isItemValidForSlot(x, y, z, slot, stack); } public boolean canExtractItem(int x, int y, int z, int slot, ItemStack stack, int side); public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java index af03860dc..85e8fb5db 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRotaryFurnace.java @@ -1,37 +1,337 @@ package com.hbm.tileentity.machine; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.tileentity.TileEntityMachinePolluting; +import java.util.Random; -public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting { +import com.hbm.handler.pollution.PollutionHandler; +import com.hbm.handler.pollution.PollutionHandler.PollutionType; +import com.hbm.inventory.RecipesCommon.AStack; +import com.hbm.inventory.container.ContainerMachineRotaryFurnace; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.inventory.gui.GUIMachineRotaryFurnace; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.inventory.recipes.RotaryFurnaceRecipes; +import com.hbm.inventory.recipes.RotaryFurnaceRecipes.RotaryFurnaceRecipe; +import com.hbm.lib.Library; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.AuxParticlePacketNT; +import com.hbm.tileentity.IConditionalInvAccess; +import com.hbm.tileentity.IFluidCopiable; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachinePolluting; +import com.hbm.util.CrucibleUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.fluid.IFluidStandardTransceiver; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityMachineRotaryFurnace extends TileEntityMachinePolluting implements IFluidStandardTransceiver, IGUIProvider, IFluidCopiable, IConditionalInvAccess { + + public FluidTank[] tanks; + public boolean isProgressing; + public float progress; + public int burnTime; + public int maxBurnTime; + public boolean isVenting; + public MaterialStack output; + public static final int maxOutput = MaterialShapes.BLOCK.q(16); public TileEntityMachineRotaryFurnace() { - super(0, 50); + super(5, 50); + tanks = new FluidTank[3]; + tanks[0] = new FluidTank(Fluids.NONE, 16_000); + tanks[1] = new FluidTank(Fluids.STEAM, 4_000); + tanks[2] = new FluidTank(Fluids.SPENTSTEAM, 40); } @Override public String getName() { - return null; + return "container.machineRotaryFurnace"; } @Override public void updateEntity() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + if(!worldObj.isRemote) { + + tanks[0].setType(3, slots); + + for(DirPos pos : getSteamPos()) { + this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + if(tanks[0].getTankType() != Fluids.NONE) for(DirPos pos : getFluidPos()) { + this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + } + + if(smoke.getFill() > 0) this.sendFluid(smoke, worldObj, xCoord + rot.offsetX, yCoord + 5, zCoord + rot.offsetZ, Library.POS_Y); + + if(this.output != null) { + + Vec3 impact = Vec3.createVectorHelper(0, 0, 0); + MaterialStack leftover = CrucibleUtil.pourSingleStack(worldObj, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 1.25D, zCoord + 0.5D + rot.offsetZ * 2.875D, 6, true, this.output, MaterialShapes.INGOT.q(1), impact); + + if(leftover.amount != this.output.amount) { + this.output = leftover; + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "foundry"); + data.setInteger("color", leftover.material.moltenColor); + data.setByte("dir", (byte) rot.ordinal()); + data.setFloat("off", 0.625F); + data.setFloat("base", 0.625F); + data.setFloat("len", Math.max(1F, yCoord + 1 - (float) (Math.ceil(impact.yCoord) - 1.125))); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, xCoord + 0.5D + rot.offsetX * 2.875D, yCoord + 0.75, zCoord + 0.5D + rot.offsetZ * 2.875D), new TargetPoint(worldObj.provider.dimensionId, xCoord + 0.5, yCoord + 1, zCoord + 0.5, 50)); + } + + if(output.amount <= 0) this.output = null; + } + + RotaryFurnaceRecipe recipe = RotaryFurnaceRecipes.getRecipe(slots[0], slots[1], slots[2]); + + if(recipe != null) { + + if(this.burnTime <= 0 && slots[4] != null && TileEntityFurnace.isItemFuel(slots[4])) { + this.maxBurnTime = this.burnTime = TileEntityFurnace.getItemBurnTime(slots[4]) / 2; + this.decrStackSize(4, 1); + this.markChanged(); + } + + if(this.canProcess(recipe)) { + this.progress += 1F / recipe.duration; + tanks[1].setFill(tanks[1].getFill() - recipe.steam); + tanks[2].setFill(tanks[2].getFill() + recipe.steam / 100); + + if(this.progress >= 1F) { + this.progress -= 1F; + this.consumeItems(recipe); + + if(this.output == null) { + this.output = recipe.output.copy(); + } else { + this.output.amount += recipe.output.amount; + } + this.markDirty(); + } + + } else { + this.progress = 0; + } + } else { + this.progress = 0; + } + + this.isVenting = false; + if(this.burnTime > 0) { + this.pollute(PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND / 10F); + this.burnTime--; + } + + this.networkPackNT(50); + + } else { + + if(this.burnTime > 0 && MainRegistry.proxy.me().getDistance(xCoord, yCoord, zCoord) < 25) { + Random rand = worldObj.rand; + worldObj.spawnParticle("flame", xCoord + 0.5 + dir.offsetX * 0.5 + rot.offsetX + rand.nextGaussian() * 0.25, yCoord + 0.375, zCoord + 0.5 + dir.offsetZ * 0.5 + rot.offsetZ + rand.nextGaussian() * 0.25, 0, 0, 0); + } + + if(isVenting && worldObj.getTotalWorldTime() % 2 == 0) { + + NBTTagCompound fx = new NBTTagCompound(); + fx.setString("type", "tower"); + fx.setFloat("lift", 10F); + fx.setFloat("base", 0.25F); + fx.setFloat("max", 2.5F); + fx.setInteger("life", 100 + worldObj.rand.nextInt(20)); + fx.setInteger("color",0x202020); + fx.setDouble("posX", xCoord + 0.5 + rot.offsetX); + fx.setDouble("posY", yCoord + 5); + fx.setDouble("posZ", zCoord + 0.5 + rot.offsetZ); + MainRegistry.proxy.effectNT(fx); + } + } } + @Override public void serialize(ByteBuf buf) { + super.serialize(buf); + tanks[0].serialize(buf); + tanks[1].serialize(buf); + tanks[2].serialize(buf); + buf.writeBoolean(isVenting); + buf.writeBoolean(isProgressing); + buf.writeFloat(progress); + buf.writeInt(burnTime); + buf.writeInt(maxBurnTime); + + if(this.output != null) { + buf.writeBoolean(true); + buf.writeInt(this.output.material.id); + buf.writeInt(this.output.amount); + } else { + buf.writeBoolean(false); + } + } + + @Override public void deserialize(ByteBuf buf) { + super.deserialize(buf); + tanks[0].deserialize(buf); + tanks[1].deserialize(buf); + tanks[2].deserialize(buf); + isVenting = buf.readBoolean(); + isProgressing = buf.readBoolean(); + progress = buf.readFloat(); + burnTime = buf.readInt(); + maxBurnTime = buf.readInt(); + + if(buf.readBoolean()) { + this.output = new MaterialStack(Mats.matById.get(buf.readInt()), buf.readInt()); + } else { + this.output = null; + } + } + @Override - public FluidTank[] getAllTanks() { - return null; + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.tanks[0].readFromNBT(nbt, "t0"); + this.tanks[1].readFromNBT(nbt, "t1"); + this.tanks[2].readFromNBT(nbt, "t2"); + this.progress = nbt.getFloat("prog"); + this.burnTime = nbt.getInteger("burn"); + this.maxBurnTime = nbt.getInteger("maxBurn"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + this.tanks[0].writeToNBT(nbt, "t0"); + this.tanks[1].writeToNBT(nbt, "t1"); + this.tanks[2].writeToNBT(nbt, "t2"); + nbt.setFloat("prog", progress); + nbt.setInteger("burn", burnTime); + nbt.setInteger("maxBurn", maxBurnTime); + } + + public DirPos[] getSteamPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + return new DirPos[] { + new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ * 2, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 2 - rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 - rot.offsetZ, dir.getOpposite()) + }; + } + + public DirPos[] getFluidPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + return new DirPos[] { + new DirPos(xCoord + dir.offsetX + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ + rot.offsetZ * 3, rot), + new DirPos(xCoord - dir.offsetX + rot.offsetX * 3, yCoord, zCoord - dir.offsetZ + rot.offsetZ * 3, rot) + }; + } + + public boolean canProcess(RotaryFurnaceRecipe recipe) { + + if(this.burnTime <= 0) return false; + + if(recipe.fluid != null) { + if(this.tanks[0].getTankType() != recipe.fluid.type) return false; + if(this.tanks[0].getFill() < recipe.fluid.fill) return false; + } + + if(tanks[1].getFill() < recipe.steam) return false; + if(tanks[2].getMaxFill() - tanks[2].getFill() < recipe.steam / 100) return false; + + if(this.output != null) { + if(this.output.material != recipe.output.material) return false; + if(this.output.amount + recipe.output.amount > this.maxOutput) return false; + } + + return true; + } + + public void consumeItems(RotaryFurnaceRecipe recipe) { + + for(AStack aStack : recipe.ingredients) { + + for(int i = 0; i < 3; i++) { + ItemStack stack = slots[i]; + if(aStack.matchesRecipe(stack, true) && stack.stackSize >= aStack.stacksize) { + this.decrStackSize(i, aStack.stacksize); + break; + } + } + } + + if(recipe.fluid != null) { + this.tanks[0].setFill(tanks[0].getFill() - recipe.fluid.fill); + } + } + + @Override + public void pollute(PollutionType type, float amount) { + FluidTank tank = type == PollutionType.SOOT ? smoke : type == PollutionType.HEAVYMETAL ? smoke_leaded : smoke_poison; + + int fluidAmount = (int) Math.ceil(amount * 100); + tank.setFill(tank.getFill() + fluidAmount); + + if(tank.getFill() > tank.getMaxFill()) { + int overflow = tank.getFill() - tank.getMaxFill(); + tank.setFill(tank.getMaxFill()); + PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, type, overflow / 100F); + this.isVenting = true; + } } - @Override - public long transferFluid(FluidType type, int pressure, long fluid) { - return 0; - } + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[0]; } + @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot < 3 || slot == 4; } + @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return false; } + + @Override public boolean isItemValidForSlot(int x, int y, int z, int slot, ItemStack stack) { return slot < 3 || slot == 4; } + @Override public boolean canExtractItem(int x, int y, int z, int slot, ItemStack stack, int side) { return false; } @Override - public long getDemand(FluidType type, int pressure) { - return 0; + public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) { + BlockPos pos = new BlockPos(x, y, z); + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + BlockPos core = new BlockPos(xCoord, yCoord, zCoord); + core.offset(dir, -1); + + //Red + if(pos.equals(core.clone().offset(rot, -2))) return new int[] {0}; + //Yellow + if(pos.equals(core.clone().offset(rot, -1))) return new int[] {1}; + //Green + if(pos.equals(core)) return new int[] {2}; + //Fuel + if(pos.equals(new BlockPos(xCoord, yCoord, zCoord).offset(dir).offset(rot, -1))) return new int[] {4}; + + return new int[] { }; } + + @Override public FluidTank[] getAllTanks() { return new FluidTank[] {tanks[0], tanks[1], tanks[2], smoke}; } + @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks[2], smoke}; } + @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] {tanks[0], tanks[1]}; } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerMachineRotaryFurnace(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineRotaryFurnace(player.inventory, this); } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java index fb5757aef..17c9e8db8 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachinePyroOven.java @@ -12,6 +12,7 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIPyroOven; import com.hbm.inventory.recipes.PyroOvenRecipes; import com.hbm.inventory.recipes.PyroOvenRecipes.PyroOvenRecipe; +import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; @@ -41,7 +42,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider, IFluidCopiable { public long power; - public static final long maxPower = 1_000_000; + public static final long maxPower = 10_000_000; public boolean isVenting; public boolean isProgressing; public float progress; @@ -61,6 +62,15 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem tanks[1] = new FluidTank(Fluids.NONE, 24_000); } + @Override + public void setInventorySlotContents(int i, ItemStack stack) { + super.setInventorySlotContents(i, stack); + + if(stack != null && stack.getItem() instanceof ItemMachineUpgrade && i >= 4 && i <= 5) { + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:item.upgradePlug", 1.0F, 1.0F); + } + } + @Override public String getName() { return "container.machinePyroOven"; @@ -96,7 +106,7 @@ public class TileEntityMachinePyroOven extends TileEntityMachinePolluting implem PyroOvenRecipe recipe = getMatchingRecipe(); this.progress += 1F / Math.max((recipe.duration - speed * (recipe.duration / 4)) / (overdrive * 2 + 1), 1); this.isProgressing = true; - this.power -= this.getConsumption(speed, powerSaving); + this.power -= this.getConsumption(speed + overdrive * 2, powerSaving); if(progress >= 1F) { this.progress = 0F; diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_shredder_bottom_alt.png b/src/main/resources/assets/hbm/textures/blocks/machine_shredder_bottom_alt.png index be4b6d73cb7d46dab43d1959e4a47778cc93abc5..051390fba70d49952b4f08bcc7b67535ab100e73 100644 GIT binary patch delta 488 zcmVVPRoWQBgfTJvur%J3Bi#I5=EfT(7UMU|?XWsj0HEvYMKj zgoK1QH#c2fU1MWopP!#vT3S+4Qk$Ebm6erLR8&@0R<5qDjEsymH8qfskcfzg|6Kr- zl$8IKRGgfgd3k?%SXfw&j*f3{ZWo27iTZ@Z}S65f7 ztE-KTjh!hs{Qv*}32;bRa{vGizyJUazyWI3i3tDz0L@86K~yMHEl}xtf-n%AaK;TG zicKJZNPtSUw%Yss->eaxKf617d@~C$#t?*2oTPlknXi9I5M@#l-4gPQ$Q9O`V!KHd za>4MVbC|rWiqgWEWuk7{UAHgnEfUbvu4&zZrnOmsUUb9gCJ#4^r3}$)g=aS%4wGvX zWQ0+}Jct>FV!Y_%>9KMe4JCNhc0S*a&gVBu@vghewX27Zy1rc3g5y({3jFIk__1Co zt-z#LYJNzozpC?!iGyW#S5hts^Ih*cP2wmF{3jUx0sqYt=SRv8;{X5v4rN$LW=%~1 eDgXcg2mk;800000(o>TF0000}Z{Pd&gN^Y9%=S&U`KwLV+4nTm1f;~Fzc00&?KEEFTpX%6v4Mb4{(*|w-^MAP^Bb|=E@7oi2I6d$j<$0cES(>K$Yb{8Z$BrcCpb5ufkEvn<&LjfF e?fy^E^So~+W#c{H{Yypw0000q+ diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_shredder_front_alt.png b/src/main/resources/assets/hbm/textures/blocks/machine_shredder_front_alt.png index 7049ae709ad25ae422d5fd665e847552f5fda90d..b8ac2780044fc9192db7310fd4d0dbbf77ee0893 100644 GIT binary patch delta 529 zcmV+s0`C360>T84Bnkm@Qb$4nuFf3kks%v@zW@LZzX3P}QzQTY0li5?K~y+TZIZpJ z>QE4c_fKLH5fR}wx6(?{=kN_gu)A+zdBH+oh*809520@&rhdBOaOrUiTF|HEdPnLz$8h8H*TO<*!XOg7R;%gZaEJz& z$U)zK#B@3>m&=7hp;#>9sd514+!qDkDzY;Ym;e9(01jnXNoGw=04e|g00;m800000 T0Mb*F00000NkvXXu0mjfCVA-S delta 273 zcmV+s0q*|71i=E3B#|)~f589%4#5Gqk!$S$000?uMObuGZ)S9NVRB^vaA9d~bS`dX zbRaY?FfK7LtqKaj0002KNklD*bTbn0JXTLNJbyf;AH|PG3>-)azx+)9mswF#34WGzOYAp*#^GH|$s>#*Rd;bS0 X*{|)ZS4f5c0000<2SrXqu0mjf{Ah75 diff --git a/src/main/resources/assets/hbm/textures/blocks/machine_shredder_side_alt.png b/src/main/resources/assets/hbm/textures/blocks/machine_shredder_side_alt.png index de74959ec696da9a5acb4daf12e56a030801e733..817e0e6b7c6bf07d080dd8706ab639dd5be58a48 100644 GIT binary patch delta 547 zcmV+;0^I$N0@DPLBnkm@Qb$4nuFf3kks%v@zW@LZzX3P}QzQTY0nSN8K~y+TRgyic z8bK6>&(6B;u84?mo1plCV8F&EA%DQeTCDRM1nUbH`bSdcA6VH*f~{Iur;_0Jy{o&< zeRfABc^SuZ-t#f4q+m7RSt{X(rJ_ufvaxKgCDVNZ3Lak44Z`jsoG&&xSp6B6EptU}q&)4hq zbUL}NyW8!eDB5nf`Fy@wt&)(!pH8Rb*|ts1?RJAP#q0o=&}Oq)uh;E%8$k+cFc@?? zol2#0xm<9;`vb*dvET0#g^W+I60BB#tHojgMay5Gf1BRm>*@=KKchgU(`ine&*z9n z`aSVmH(m)+snl}0B$YIvpp4`DKFv(hzu;D37@EFFQuqK>$#~;?$C&+$R{}!tLBO_pL~wf+DG;vXH%5O9M4000hU lSV?A0O#mtY000O800000007bsQ({Su zZ*R|JV8~)%$Yx;3VPJ@jjjd;5YGh??W@BsN;K*iYFXZN~5EQHv6>XK0>X4DKx3`av zkC&I1udlD4C?e9y%Nr~_Ne*ZaXMsm#F#`kNeh_A~U=3CQ3NH3^aSYK2_U*sTcUXbP znYq4|C1ZEd>5TvX-P3Oz7E@dzbJNr3e=1MpqO+A^X~*Qv*xw}G>i=B&G-!5ro5q%V zrJ?V29Td0jx4x$m%CJLYmf=D%whxi}yB5x}-S&a^XoT6`8&u`8WOD#92wV!D45B<;{an^LB{Ts5u%CK8 delta 264 zcmZo-p20LhvYv^7fnmbL3^O3blJ4m1$iT3%pZiZDE0E7w;1OBOz`%C^gc-B0b#ej) zB}-f*N`mv#O3D+9QW**oGxJLH@={9_O!N%&3=P(DaRF5`O!ahe46*Q^+P_h-RY8E2 zH*mKC5GXDTwBEpyyxh#`KbLpJVdp9<2^Va-r(_CH5A~UNoQ?GI7B$i77(m#Gk$iy$`-C3^6 zcEyhM*H``j4pYAcE6m%b-)OR6B~z9u!>ahq+>c diff --git a/src/main/resources/assets/hbm/textures/gui/gui_shredder.png b/src/main/resources/assets/hbm/textures/gui/gui_shredder.png index 34e2e4ea5a7e2bf08a1829fb865e15ace8e09a82..19b774c76f77d5ef938c3d07155c07d4f4dec418 100644 GIT binary patch literal 4108 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 AJ^%m! diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_rotary_furnace.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_rotary_furnace.png index 920a5871c7978daed2dba246d5bd919ef5785a32..54854a28db9053c51b370d3a8d581617afda9be1 100644 GIT binary patch literal 5655 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 QUwR?kYkJywn$}PL1D02fI{*Lx literal 4529 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 G`u_k27g8Mn literal 5344 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 Ef;3}}N&o-= delta 310 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 HoNxLc!C$f+