From dbe4c9783f3147730f7170f7b10292862be42a35 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Wed, 17 May 2023 18:07:59 +0200 Subject: [PATCH] feat: add reinforced tank and base stuff for wood apparati --- .../net/anvilcraft/thaummach/TMBlocks.java | 7 + .../blocks/BlockApparatusFragile.java | 1 + .../thaummach/blocks/BlockApparatusMetal.java | 115 ++---- .../thaummach/blocks/BlockApparatusWood.java | 326 ++++++++++++++++++ .../items/ItemBlockApparatusWood.java | 23 ++ .../thaummach/particles/FXWisp.java | 2 +- .../AbstractTankApparatusRenderer.java | 135 ++++++++ .../fragile/ConduitTankApparatusRenderer.java | 139 +------- .../apparati/metal/TankApparatusRenderer.java | 20 ++ .../thaummach/tiles/TileConduitTank.java | 12 +- .../thaummach/tiles/TileSoulBrazier.java | 32 ++ .../assets/thaummach/lang/en_US.lang | 6 + .../textures/blocks/condenser_part_1.png | Bin 0 -> 469 bytes .../textures/blocks/condenser_part_2.png | Bin 0 -> 421 bytes .../textures/blocks/condenser_side.png | Bin 0 -> 276 bytes .../textures/blocks/condenser_top.png | Bin 0 -> 401 bytes .../textures/blocks/dawn_totem_bottom.png | Bin 0 -> 833 bytes .../textures/blocks/dawn_totem_side_1.png | Bin 0 -> 798 bytes .../textures/blocks/dawn_totem_side_2.png | Bin 0 -> 795 bytes .../textures/blocks/dawn_totem_side_3.png | Bin 0 -> 815 bytes .../textures/blocks/dawn_totem_side_4.png | Bin 0 -> 852 bytes .../textures/blocks/dawn_totem_side_5.png | Bin 0 -> 769 bytes .../textures/blocks/dawn_totem_side_6.png | Bin 0 -> 820 bytes .../textures/blocks/duplicator_bottom.png | Bin 0 -> 609 bytes .../textures/blocks/duplicator_inside.png | Bin 0 -> 539 bytes .../textures/blocks/duplicator_side.png | Bin 0 -> 506 bytes .../textures/blocks/duplicator_top.png | Bin 0 -> 675 bytes .../textures/blocks/dusk_totem_bottom.png | Bin 0 -> 717 bytes .../textures/blocks/dusk_totem_side_1.png | Bin 0 -> 776 bytes .../textures/blocks/dusk_totem_side_2.png | Bin 0 -> 766 bytes .../textures/blocks/dusk_totem_side_3.png | Bin 0 -> 742 bytes .../textures/blocks/dusk_totem_side_4.png | Bin 0 -> 759 bytes .../textures/blocks/dusk_totem_side_5.png | Bin 0 -> 799 bytes .../textures/blocks/dusk_totem_side_6.png | Bin 0 -> 726 bytes .../blocks/reinforced_tank_bottom.png | Bin 0 -> 532 bytes .../textures/blocks/reinforced_tank_side.png | Bin 0 -> 530 bytes .../textures/blocks/restorer_bottom.png | Bin 0 -> 622 bytes .../textures/blocks/restorer_side.png | Bin 0 -> 737 bytes .../textures/blocks/restorer_side_pipes.png | Bin 0 -> 684 bytes .../textures/blocks/restorer_top.png | Bin 0 -> 626 bytes 40 files changed, 598 insertions(+), 220 deletions(-) create mode 100644 src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusWood.java create mode 100644 src/main/java/net/anvilcraft/thaummach/items/ItemBlockApparatusWood.java create mode 100644 src/main/java/net/anvilcraft/thaummach/render/apparatus/AbstractTankApparatusRenderer.java create mode 100644 src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/metal/TankApparatusRenderer.java create mode 100644 src/main/resources/assets/thaummach/textures/blocks/condenser_part_1.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/condenser_part_2.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/condenser_side.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/condenser_top.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_bottom.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_1.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_2.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_3.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_4.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_5.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_6.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/duplicator_bottom.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/duplicator_inside.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/duplicator_side.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/duplicator_top.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_bottom.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_1.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_2.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_3.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_4.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_5.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_6.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/reinforced_tank_bottom.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/reinforced_tank_side.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/restorer_bottom.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/restorer_side.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/restorer_side_pipes.png create mode 100644 src/main/resources/assets/thaummach/textures/blocks/restorer_top.png diff --git a/src/main/java/net/anvilcraft/thaummach/TMBlocks.java b/src/main/java/net/anvilcraft/thaummach/TMBlocks.java index b27a772..8774afd 100644 --- a/src/main/java/net/anvilcraft/thaummach/TMBlocks.java +++ b/src/main/java/net/anvilcraft/thaummach/TMBlocks.java @@ -3,20 +3,24 @@ package net.anvilcraft.thaummach; import cpw.mods.fml.common.registry.GameRegistry; import net.anvilcraft.thaummach.blocks.BlockApparatusFragile; import net.anvilcraft.thaummach.blocks.BlockApparatusMetal; +import net.anvilcraft.thaummach.blocks.BlockApparatusWood; import net.anvilcraft.thaummach.blocks.BlockSeal; import net.anvilcraft.thaummach.items.ItemBlockApparatusFragile; import net.anvilcraft.thaummach.items.ItemBlockApparatusMetal; +import net.anvilcraft.thaummach.items.ItemBlockApparatusWood; import net.anvilcraft.thaummach.items.ItemSeal; import net.minecraft.block.Block; public class TMBlocks { public static Block apparatusFragile; public static Block apparatusMetal; + public static Block apparatusWood; public static Block seal; public static void init() { apparatusFragile = new BlockApparatusFragile(); apparatusMetal = new BlockApparatusMetal(); + apparatusWood = new BlockApparatusWood(); seal = new BlockSeal(); GameRegistry.registerBlock( @@ -25,6 +29,9 @@ public class TMBlocks { GameRegistry.registerBlock( apparatusMetal, ItemBlockApparatusMetal.class, "apparatus_metal" ); + GameRegistry.registerBlock( + apparatusWood, ItemBlockApparatusWood.class, "apparatus_wood" + ); GameRegistry.registerBlock(seal, ItemSeal.class, "seal"); } } diff --git a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusFragile.java b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusFragile.java index 2055b62..13468be 100644 --- a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusFragile.java +++ b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusFragile.java @@ -396,6 +396,7 @@ public class BlockApparatusFragile extends BlockApparatus { return BlockApparatusRenderer.RI; } + // TODO: WTF //public int getBlockTextureFromSide(int i) { // return 15; //} diff --git a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusMetal.java b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusMetal.java index 1c7d836..f6f4b24 100644 --- a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusMetal.java +++ b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusMetal.java @@ -13,6 +13,7 @@ import net.anvilcraft.thaummach.render.apparatus.apparati.metal.BoreApparatusRen import net.anvilcraft.thaummach.render.apparatus.apparati.metal.CrucibleApparatusRenderer; import net.anvilcraft.thaummach.render.apparatus.apparati.metal.CrystallizerApparatusRenderer; import net.anvilcraft.thaummach.render.apparatus.apparati.metal.SoulBrazierApparatusRenderer; +import net.anvilcraft.thaummach.render.apparatus.apparati.metal.TankApparatusRenderer; import net.anvilcraft.thaummach.render.apparatus.apparati.metal.VoidChestApparatusRenderer; import net.anvilcraft.thaummach.render.apparatus.apparati.metal.VoidInterfaceApparatusRenderer; import net.anvilcraft.thaummach.tiles.TileArcaneFurnace; @@ -70,6 +71,8 @@ public class BlockApparatusMetal extends BlockApparatus { public IIcon iconSoulCrucibleFace3; public IIcon iconSoulCrucibleTop; public IIcon iconSoulCrucibleTopInv; + public IIcon iconTankBottom; + public IIcon iconTankSide; public IIcon iconVoidChestBottom; public IIcon iconVoidChestSide; public IIcon iconVoidChestSideTransparent; @@ -114,6 +117,8 @@ public class BlockApparatusMetal extends BlockApparatus { this.iconSoulCrucibleFace3 = reg.registerIcon("thaummach:soul_crucible_face_3"); this.iconSoulCrucibleTop = reg.registerIcon("thaummach:soul_crucible_top"); this.iconSoulCrucibleTopInv = reg.registerIcon("thaummach:soul_crucible_top_inv"); + this.iconTankBottom = reg.registerIcon("thaummach:reinforced_tank_bottom"); + this.iconTankSide = reg.registerIcon("thaummach:reinforced_tank_side"); this.iconVoidChestBottom = reg.registerIcon("thaummach:void_chest_bottom"); this.iconVoidChestSide = reg.registerIcon("thaummach:void_chest_side"); this.iconVoidChestSideTransparent @@ -172,6 +177,9 @@ public class BlockApparatusMetal extends BlockApparatus { case SOUL_BRAZIER: return SoulBrazierApparatusRenderer.INSTANCE; + case TANK: + return TankApparatusRenderer.INSTANCE; + default: return null; } @@ -342,12 +350,9 @@ public class BlockApparatusMetal extends BlockApparatus { return side == 1 ? this.iconVoidInterfaceBottom : this.iconVoidInterfaceSide; } + } else if (meta == MetaVals.TANK) { + return side <= 1 ? this.iconTankBottom : this.iconTankSide; } - // else if (meta == 10) { - // return side <= 1 ? 78 : 79; - //} else { - // return super.getBlockTexture(iblockaccess, i, j, k, side); - //} return null; } @@ -796,18 +801,17 @@ public class BlockApparatusMetal extends BlockApparatus { isProvidingStrongPower(IBlockAccess iblockaccess, int i, int j, int k, int l) { MetaVals meta = MetaVals.get(iblockaccess.getBlockMetadata(i, j, k)); if (meta == MetaVals.EYES_CRUCIBLE || meta == MetaVals.THAUMIUM_CRUCIBLE) { - // TODO: crucibles - //TileCrucible data = (TileCrucible) iblockaccess.getTileEntity(i, j, k); - //if (l == 1) { - // TileEntity below = iblockaccess.getTileEntity(i, j - 1, k); - // if (below != null && below instanceof TileArcaneFurnace) { - // return 0; - // } - //} + TileCrucible data = (TileCrucible) iblockaccess.getTileEntity(i, j, k); + if (l == 1) { + TileEntity below = iblockaccess.getTileEntity(i, j - 1, k); + if (below != null && below instanceof TileArcaneFurnace) { + return 0; + } + } - //if (data.isPowering) { - // return 15; - //} + if (data.isPowering) { + return 15; + } } return 0; @@ -840,14 +844,11 @@ public class BlockApparatusMetal extends BlockApparatus { } if (meta.isCrucible()) { - // TODO: crucibles - //TileCrucible data = (TileCrucible) world.getTileEntity(i, j, k); - //data.bellows = bellows; + TileCrucible data = (TileCrucible) world.getTileEntity(i, j, k); + data.bellows = bellows; } else if (meta == MetaVals.ARCANE_FURNACE) { - // TODO: arcane furnace - //TileArcaneFurnace data - // = (TileArcaneFurnace) world.getTileEntity(i, j, k); - //data.bellows = bellows; + TileArcaneFurnace data = (TileArcaneFurnace) world.getTileEntity(i, j, k); + data.bellows = bellows; } else { if (meta == MetaVals.VOID_INTERFACE && (world.getBlock(i, j - 1, k) != this @@ -867,12 +868,11 @@ public class BlockApparatusMetal extends BlockApparatus { } else { TileEntity tsb; if (md == MetaVals.ARCANE_FURNACE) { - // TODO: arcane furnace - //tsb = iba.getTileEntity(i, j, k); - //return tsb != null && tsb instanceof TileArcaneFurnace - // && ((TileArcaneFurnace) tsb).isWorking() - // ? 13 - // : 0; + tsb = iba.getTileEntity(i, j, k); + return tsb != null && tsb instanceof TileArcaneFurnace + && ((TileArcaneFurnace) tsb).isWorking() + ? 13 + : 0; } else if (md == MetaVals.SOUL_BRAZIER) { tsb = iba.getTileEntity(i, j, k); return tsb != null && tsb instanceof TileSoulBrazier @@ -883,65 +883,8 @@ public class BlockApparatusMetal extends BlockApparatus { return super.getLightValue(iba, i, j, k); } } - return 0; } - //@Override - //public boolean renderAppMetalBlock( - // World w, RenderBlocks rb, int i, int j, int k, Block block, boolean inv, int md - //) { - // if (md == -9) { - // md = w.getBlockMetadata(i, j, k); - // } - - // switch (md) { - // case 0: - // case 1: - // case 2: - // case 3: - // ThaumCraftRenderer.renderBlockCrucible(w, rb, i, j, k, block, md, inv); - // return true; - // case 4: - // ThaumCraftRenderer.renderBlockArcaneFurnace( - // w, rb, i, j, k, block, md, inv - // ); - // return true; - // case 5: - // ThaumCraftRenderer.renderBlockGenerator(w, rb, i, j, k, block, md, inv); - // return true; - // case 6: - // ThaumCraftRenderer.renderBlockCrystalizer(w, rb, i, j, k, block, md, - // inv); return true; - // case 7: - // ThaumCraftRenderer.renderBlockBore(w, rb, i, j, k, block, md, inv); - // return true; - // case 8: - // block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - // if (block.getRenderBlockPass() == 0 && !inv) { - // rb.renderStandardBlock(block, i, j, k); - // } else if (inv) { - // ThaumCraftRenderer.DrawFaces( - // rb, block, 97, 104, 103, 103, 103, 103, false - // ); - // } - - // return true; - // case 9: - // ThaumCraftRenderer.renderBlockVoidInterface( - // w, rb, i, j, k, block, md, inv - // ); - // return true; - // case 10: - // ThaumCraftRenderer.renderBlockTank(w, rb, i, j, k, block, md, inv); - // return true; - // case 11: - // ThaumCraftRenderer.renderBlockSoulBrazier(w, rb, i, j, k, block, md, - // inv); return true; - // default: - // return false; - // } - //} - public static enum MetaVals { NORMAL_CRUCIBLE, // 0 EYES_CRUCIBLE, // 1 diff --git a/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusWood.java b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusWood.java new file mode 100644 index 0000000..f8bd90a --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/blocks/BlockApparatusWood.java @@ -0,0 +1,326 @@ +package net.anvilcraft.thaummach.blocks; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.anvilcraft.thaummach.particles.FXWisp; +import net.anvilcraft.thaummach.render.BlockApparatusRenderer; +import net.anvilcraft.thaummach.render.apparatus.IApparatusRenderer; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockApparatusWood extends BlockApparatus { + public BlockApparatusWood() { + super(Material.wood); + this.setHardness(2.0F); + this.setResistance(10.0F); + this.setStepSound(Block.soundTypeWood); + this.setBlockName("tcbappwood"); + } + + @Override + public IApparatusRenderer getApparatusRenderer(int meta) { + switch (MetaVals.get(meta)) { + default: + return null; + } + } + + @Override + public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List itemList) { + itemList.add(new ItemStack(this, 1, 0)); + itemList.add(new ItemStack(this, 1, 1)); + itemList.add(new ItemStack(this, 1, 2)); + itemList.add(new ItemStack(this, 1, 3)); + itemList.add(new ItemStack(this, 1, 4)); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + MetaVals md = MetaVals.get(meta); + + switch (md) { + //case CONDENSER: + // return new TileCondenser(); + // + //case DUPLICATOR: + // return new TileDuplicator(); + // + //case REPAIRER: + // return new TileRepairer(); + + default: + return null; + } + } + + @Override + public void + setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k) { + int md = iblockaccess.getBlockMetadata(i, j, k); + if (md == 0) { + float w3 = 0.1875F; + this.setBlockBounds(w3, 0.0F, w3, 1.0F - w3, 1.0F, 1.0F - w3); + } else { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } + } + + @Override + public AxisAlignedBB getSelectedBoundingBoxFromPool(World w, int i, int j, int k) { + int md = w.getBlockMetadata(i, j, k); + if (md == 0) { + float w3 = 0.1875F; + AxisAlignedBB.getBoundingBox( + (double) w3, + 0.0, + (double) w3, + (double) (1.0F - w3), + 1.0, + (double) (1.0F - w3) + ); + } else if (md == 10) { + AxisAlignedBB.getBoundingBox(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); + } + + return super.getSelectedBoundingBoxFromPool(w, i, j, k); + } + + @Override + public void onBlockPlacedBy( + World world, int i, int j, int k, EntityLivingBase entityliving, ItemStack stack + ) { + MetaVals md = MetaVals.get(world.getBlockMetadata(i, j, k)); + int l = MathHelper.floor_double( + (double) (entityliving.rotationYaw * 4.0F / 360.0F) + 0.5 + ) + & 3; + if (md == MetaVals.DUPLICATOR) { + // TODO: duplicator + //TileDuplicator td = (TileDuplicator) world.getBlockTileEntity(i, j, k); + //td.orientation = l; + } + } + + @Override + public void updateTick(World world, int i, int j, int k, Random random) { + if (!world.isRemote) { + MetaVals l = MetaVals.get(world.getBlockMetadata(i, j, k)); + if (l == MetaVals.DAWN_TOTEM || l == MetaVals.DUSK_TOTEM) { + // TODO: totems + //int auraX = i >> 4; + //int auraZ = k >> 4; + //SIAuraChunk ac = (SIAuraChunk) mod_ThaumCraft.AuraHM.get( + // Arrays.asList(auraX, auraZ, ThaumCraftCore.getDimension(world)) + //); + //if (ac != null) { + // if (l == 3) { + // ac.goodVibes = (short) (ac.goodVibes + 1 + random.nextInt(2)); + // ThaumCraftCore.decreaseTaintedPlantsInArea(world, i, j, k, 2); + // } else { + // ac.badVibes = (short) (ac.badVibes + 1 + random.nextInt(3)); + // ThaumCraftCore.increaseTaintedPlants(world, i, j, k); + // } + //} + } + } + } + + @Override + public void breakBlock(World world, int i, int j, int k, Block block, int meta_) { + // TODO: not sure if param 6 is meta + MetaVals meta = MetaVals.get(meta_); + if (meta == MetaVals.CONDENSER) { + // TODO: condenser + //TileCondenser tileentityCondenser + // = (TileCondenser) world.getBlockTileEntity(i, j, k); + //if (tileentityCondenser != null && tileentityCondenser.degredation > 0.0F) { + // int at = (int + // ) (25.0F * (4550.0F - tileentityCondenser.degredation) / 4550.0F); + // int auraX = i >> 4; + // int auraZ = k >> 4; + // SIAuraChunk ac = (SIAuraChunk) mod_ThaumCraft.AuraHM.get( + // Arrays.asList(auraX, auraZ, ThaumCraftCore.getDimension(world)) + // ); + // if (ac != null) { + // ac.taint = (short) (ac.taint + at); + // world.playSoundEffect( + // (double) i, + // (double) j, + // (double) k, + // "random.fizz", + // 0.2F, + // 2.0F + world.rand.nextFloat() * 0.4F + // ); + + // for (int a = 0; a < at; ++a) { + // world.spawnParticle( + // "largesmoke", + // (double) ((float) i + world.rand.nextFloat()), + // (double) ((float) j + world.rand.nextFloat()), + // (double) ((float) k + world.rand.nextFloat()), + // 0.0, + // 0.0, + // 0.0 + // ); + // } + // } + //} + } + + super.breakBlock(world, i, j, k, block, meta_); + } + + @Override + public void onNeighborBlockChange(World world, int i, int j, int k, Block l) { + super.onNeighborBlockChange(world, i, j, k, l); + MetaVals meta = MetaVals.get(world.getBlockMetadata(i, j, k)); + if (meta == MetaVals.CONDENSER) { + if (!world.isAirBlock(i, j + 1, k)) { + this.dropBlockAsItem(world, i, j, k, meta.ordinal(), 0); + world.setBlockToAir(i, j, k); + } + } + } + + @Override + public int getRenderType() { + return BlockApparatusRenderer.RI; + } + + // TODO: WTF + //@Override + //public int getBlockTextureFromSide(int i) { + // return 15; + //} + + // TODO: textures + //@Override + //public int getBlockTextureFromSideAndMetadata(int i, int j) { + // switch (j) { + // case 3: + // return 127; + // case 4: + // return 143; + // default: + // return super.getBlockTextureFromSideAndMetadata(i, j); + // } + //} + + //@Override + //public int getBlockTexture(IBlockAccess iblockaccess, int i, int j, int k, int l) { + // int md = iblockaccess.getBlockMetadata(i, j, k); + // if (md == 0) { + // return l <= 1 ? 113 : 112; + // } else if (md == 1) { + // if (l <= 1) { + // return 70; + // } else { + // TileEntity te = iblockaccess.getBlockTileEntity(i, j, k); + // if (te != null && te instanceof TileDuplicator) { + // if (((TileDuplicator) te).orientation == 0 && l == 2) { + // return 71; + // } + + // if (((TileDuplicator) te).orientation == 1 && l == 5) { + // return 71; + // } + + // if (((TileDuplicator) te).orientation == 2 && l == 3) { + // return 71; + // } + + // if (((TileDuplicator) te).orientation == 3 && l == 4) { + // return 71; + // } + // } + + // return 72; + // } + // } else if (md == 2) { + // return l <= 1 ? 86 : 87; + // } else if (md == 3) { + // return l <= 1 ? 127 : 121 + Math.abs((i + j + k) % 6); + // } else if (md == 4) { + // return l <= 1 ? 143 : 137 + Math.abs((i + j + k) % 6); + // } else { + // return 15; + // } + //} + + @Override + public int damageDropped(int i) { + return i; + } + + @Override + public int getLightValue(IBlockAccess iba, int i, int j, int k) { + MetaVals md = MetaVals.get(iba.getBlockMetadata(i, j, k)); + return md == MetaVals.DUPLICATOR ? 5 : super.getLightValue(iba, i, j, k); + } + + @SideOnly(Side.CLIENT) + @Override + public void randomDisplayTick(World w, int i, int j, int k, Random random) { + MetaVals md = MetaVals.get(w.getBlockMetadata(i, j, k)); + if (random.nextInt(10) == 0) { + switch (md) { + case DAWN_TOTEM: + Minecraft.getMinecraft().effectRenderer.addEffect(new FXWisp( + w, + i + random.nextFloat(), + j + random.nextFloat(), + k + random.nextFloat(), + 0.5f, + 0 + )); + break; + + case DUSK_TOTEM: + Minecraft.getMinecraft().effectRenderer.addEffect(new FXWisp( + w, + i + random.nextFloat(), + j + random.nextFloat(), + k + random.nextFloat(), + 0.5f, + 5 + )); + break; + + default: + break; + } + } + } + + public static enum MetaVals { + CONDENSER, // 0 + DUPLICATOR, // 1 + REPAIRER, // 2 + DAWN_TOTEM, // 3 + DUSK_TOTEM; // 4 + + public static MetaVals get(int meta) { + if (meta >= 0 && meta < MetaVals.values().length) { + return MetaVals.values()[meta]; + } + + return null; + } + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/items/ItemBlockApparatusWood.java b/src/main/java/net/anvilcraft/thaummach/items/ItemBlockApparatusWood.java new file mode 100644 index 0000000..4052e12 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/items/ItemBlockApparatusWood.java @@ -0,0 +1,23 @@ +package net.anvilcraft.thaummach.items; + +import net.anvilcraft.thaummach.blocks.BlockApparatusWood.MetaVals; +import net.minecraft.block.Block; + +public class ItemBlockApparatusWood extends ItemBlockApparatus { + public ItemBlockApparatusWood(Block block) { + super(block); + } + + @Override + public String getTypeString() { + return "wood"; + } + + @Override + public String getNameExtension(int meta_) { + MetaVals meta = MetaVals.get(meta_); + if (meta == null) + return null; + return meta.toString().toLowerCase(); + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/particles/FXWisp.java b/src/main/java/net/anvilcraft/thaummach/particles/FXWisp.java index 8146e00..689e3cc 100644 --- a/src/main/java/net/anvilcraft/thaummach/particles/FXWisp.java +++ b/src/main/java/net/anvilcraft/thaummach/particles/FXWisp.java @@ -183,7 +183,7 @@ public class FXWisp extends EntityFX { GL11.glDepthMask(true); GL11.glPopMatrix(); Minecraft.getMinecraft().renderEngine.bindTexture( - new ResourceLocation("textures/particles/particles.png") + new ResourceLocation("textures/particle/particles.png") ); tessellator.startDrawingQuads(); } diff --git a/src/main/java/net/anvilcraft/thaummach/render/apparatus/AbstractTankApparatusRenderer.java b/src/main/java/net/anvilcraft/thaummach/render/apparatus/AbstractTankApparatusRenderer.java new file mode 100644 index 0000000..450db8f --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/render/apparatus/AbstractTankApparatusRenderer.java @@ -0,0 +1,135 @@ +package net.anvilcraft.thaummach.render.apparatus; + +import dev.tilera.auracore.api.HelperLocation; +import net.anvilcraft.thaummach.blocks.BlockApparatus; +import net.anvilcraft.thaummach.tiles.TileConduitTank; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class AbstractTankApparatusRenderer implements IApparatusRenderer { + public abstract IIcon getBottomIcon(Apparatus block); + public abstract IIcon getSideIcon(Apparatus block); + + @Override + public void renderApparatus( + IBlockAccess w, + RenderBlocks rb, + int i, + int j, + int k, + Block block_, + int md, + boolean inv + ) { + BlockApparatus block = (BlockApparatus) block_; + float w1; + float w2; + if (block.getRenderBlockPass() == 0 || inv) { + w1 = 0.0625F; + w2 = 0.125F; + IIcon t1 = this.getBottomIcon((Apparatus)block); + IIcon t2 = this.getSideIcon((Apparatus)block); + + rb.setRenderBounds(w1, 0.0F, w1, 1.0F - w1, 1.0F, 1.0F - w1); + if (inv) { + ApparatusRenderingHelper.drawFaces( + rb, block, t1, t1, t2, t2, t2, t2, false + ); + } else { + rb.renderStandardBlock(block, i, j, k); + } + + if (!inv) { + rb.overrideBlockTexture = this.getBottomIcon((Apparatus)block); + TileConduitTank tc = (TileConduitTank) w.getTileEntity(i, j, k); + HelperLocation loc = new HelperLocation(tc); + loc.facing = ForgeDirection.WEST; + TileEntity te = loc.getConnectableTile(w); + if (te != null && tc.getConnectable(loc.facing) + && !(te instanceof TileConduitTank)) { + rb.setRenderBounds( + 0.0F, 0.5F - w2, 0.5F - w2, w1, 0.5F + w2, 0.5F + w2 + ); + rb.renderStandardBlock(block, i, j, k); + } + + loc = new HelperLocation(tc); + loc.facing = ForgeDirection.EAST; + te = loc.getConnectableTile(w); + if (te != null && tc.getConnectable(loc.facing) + && !(te instanceof TileConduitTank)) { + rb.setRenderBounds( + 1.0F - w1, 0.5F - w2, 0.5F - w2, 1.0F, 0.5F + w2, 0.5F + w2 + ); + rb.renderStandardBlock(block, i, j, k); + } + + loc = new HelperLocation(tc); + loc.facing = ForgeDirection.NORTH; + te = loc.getConnectableTile(w); + if (te != null && tc.getConnectable(loc.facing) + && !(te instanceof TileConduitTank)) { + rb.setRenderBounds( + 0.5F - w2, 0.5F - w2, 0.0F, 0.5F + w2, 0.5F + w2, w1 + ); + rb.renderStandardBlock(block, i, j, k); + } + + loc = new HelperLocation(tc); + loc.facing = ForgeDirection.SOUTH; + te = loc.getConnectableTile(w); + if (te != null && tc.getConnectable(loc.facing) + && !(te instanceof TileConduitTank)) { + rb.setRenderBounds( + 0.5F - w2, 0.5F - w2, 1.0F - w1, 0.5F + w2, 0.5F + w2, 1.0F + ); + rb.renderStandardBlock(block, i, j, k); + } + } + } + + rb.overrideBlockTexture = null; + + if (block.getRenderBlockPass() == 0 && !inv) { + w1 = 0.003F; + w2 = 0.0625F; + TileConduitTank tc = (TileConduitTank) w.getTileEntity(i, j, k); + if (tc != null && tc.pureVis + tc.taintedVis > 0.1F) { + Tessellator tessellator = Tessellator.instance; + float hfill = (1.0F - w1 * 2.0F) + * ((tc.pureVis + tc.taintedVis) / tc.getMaxVis()); + float b = Math.min(1.0F, tc.pureVis / (tc.taintedVis + tc.pureVis)); + rb.setRenderBounds( + w1 + w2, w1, w1 + w2, 1.0F - w1 - w2, w1 + hfill, 1.0F - w1 - w2 + ); + tessellator.setBrightness(20 + (int) (b * 210.0F)); + tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); + rb.renderFaceZPos( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + rb.renderFaceZNeg( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + rb.renderFaceXNeg( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + rb.renderFaceXPos( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + rb.renderFaceYPos( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + rb.renderFaceYNeg( + block, (double) i, (double) j, (double) k, block.iconTcubeanim + ); + } + } + + rb.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/fragile/ConduitTankApparatusRenderer.java b/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/fragile/ConduitTankApparatusRenderer.java index b801951..5df7c94 100644 --- a/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/fragile/ConduitTankApparatusRenderer.java +++ b/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/fragile/ConduitTankApparatusRenderer.java @@ -1,142 +1,21 @@ package net.anvilcraft.thaummach.render.apparatus.apparati.fragile; -import dev.tilera.auracore.api.HelperLocation; import net.anvilcraft.thaummach.blocks.BlockApparatusFragile; -import net.anvilcraft.thaummach.render.apparatus.ApparatusRenderingHelper; -import net.anvilcraft.thaummach.render.apparatus.IApparatusRenderer; -import net.anvilcraft.thaummach.tiles.TileConduitTank; -import net.minecraft.block.Block; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.tileentity.TileEntity; +import net.anvilcraft.thaummach.render.apparatus.AbstractTankApparatusRenderer; import net.minecraft.util.IIcon; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; -public class ConduitTankApparatusRenderer implements IApparatusRenderer { +public class ConduitTankApparatusRenderer + extends AbstractTankApparatusRenderer { public static final ConduitTankApparatusRenderer INSTANCE = new ConduitTankApparatusRenderer(); @Override - public void renderApparatus( - IBlockAccess w, - RenderBlocks rb, - int i, - int j, - int k, - Block block_, - int md, - boolean inv - ) { - BlockApparatusFragile block = (BlockApparatusFragile) block_; - float w1; - float w2; - if (block.getRenderBlockPass() == 0 || inv) { - w1 = 0.0625F; - w2 = 0.125F; - IIcon t1 = block.iconTankBottom; - IIcon t2 = block.iconTankSide; - // TODO: WTF - //if (md != 3) { - // t1 = 78; - // t2 = 79; - //} + public IIcon getBottomIcon(BlockApparatusFragile block) { + return block.iconTankBottom; + } - rb.setRenderBounds(w1, 0.0F, w1, 1.0F - w1, 1.0F, 1.0F - w1); - if (inv) { - ApparatusRenderingHelper.drawFaces( - rb, block, t1, t1, t2, t2, t2, t2, false - ); - } else { - rb.renderStandardBlock(block, i, j, k); - } - - if (!inv) { - rb.overrideBlockTexture = block.iconTankBottom; - TileConduitTank tc = (TileConduitTank) w.getTileEntity(i, j, k); - HelperLocation loc = new HelperLocation(tc); - loc.facing = ForgeDirection.WEST; - TileEntity te = loc.getConnectableTile(w); - if (te != null && tc.getConnectable(loc.facing) - && !(te instanceof TileConduitTank)) { - rb.setRenderBounds( - 0.0F, 0.5F - w2, 0.5F - w2, w1, 0.5F + w2, 0.5F + w2 - ); - rb.renderStandardBlock(block, i, j, k); - } - - loc = new HelperLocation(tc); - loc.facing = ForgeDirection.EAST; - te = loc.getConnectableTile(w); - if (te != null && tc.getConnectable(loc.facing) - && !(te instanceof TileConduitTank)) { - rb.setRenderBounds( - 1.0F - w1, 0.5F - w2, 0.5F - w2, 1.0F, 0.5F + w2, 0.5F + w2 - ); - rb.renderStandardBlock(block, i, j, k); - } - - loc = new HelperLocation(tc); - loc.facing = ForgeDirection.NORTH; - te = loc.getConnectableTile(w); - if (te != null && tc.getConnectable(loc.facing) - && !(te instanceof TileConduitTank)) { - rb.setRenderBounds( - 0.5F - w2, 0.5F - w2, 0.0F, 0.5F + w2, 0.5F + w2, w1 - ); - rb.renderStandardBlock(block, i, j, k); - } - - loc = new HelperLocation(tc); - loc.facing = ForgeDirection.SOUTH; - te = loc.getConnectableTile(w); - if (te != null && tc.getConnectable(loc.facing) - && !(te instanceof TileConduitTank)) { - rb.setRenderBounds( - 0.5F - w2, 0.5F - w2, 1.0F - w1, 0.5F + w2, 0.5F + w2, 1.0F - ); - rb.renderStandardBlock(block, i, j, k); - } - } - } - - rb.overrideBlockTexture = null; - - if (block.getRenderBlockPass() == 0 && !inv) { - w1 = 0.003F; - w2 = 0.0625F; - TileConduitTank tc = (TileConduitTank) w.getTileEntity(i, j, k); - if (tc != null && tc.pureVis + tc.taintedVis > 0.1F) { - Tessellator tessellator = Tessellator.instance; - float hfill = (1.0F - w1 * 2.0F) - * ((tc.pureVis + tc.taintedVis) / tc.getMaxVis()); - float b = Math.min(1.0F, tc.pureVis / (tc.taintedVis + tc.pureVis)); - rb.setRenderBounds( - w1 + w2, w1, w1 + w2, 1.0F - w1 - w2, w1 + hfill, 1.0F - w1 - w2 - ); - tessellator.setBrightness(20 + (int) (b * 210.0F)); - tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); - rb.renderFaceZPos( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - rb.renderFaceZNeg( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - rb.renderFaceXNeg( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - rb.renderFaceXPos( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - rb.renderFaceYPos( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - rb.renderFaceYNeg( - block, (double) i, (double) j, (double) k, block.iconTcubeanim - ); - } - } - - rb.setRenderBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + @Override + public IIcon getSideIcon(BlockApparatusFragile block) { + return block.iconTankSide; } } diff --git a/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/metal/TankApparatusRenderer.java b/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/metal/TankApparatusRenderer.java new file mode 100644 index 0000000..d8ff169 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/render/apparatus/apparati/metal/TankApparatusRenderer.java @@ -0,0 +1,20 @@ +package net.anvilcraft.thaummach.render.apparatus.apparati.metal; + +import net.anvilcraft.thaummach.blocks.BlockApparatusMetal; +import net.anvilcraft.thaummach.render.apparatus.AbstractTankApparatusRenderer; +import net.minecraft.util.IIcon; + +public class TankApparatusRenderer + extends AbstractTankApparatusRenderer { + public static TankApparatusRenderer INSTANCE = new TankApparatusRenderer(); + + @Override + public IIcon getBottomIcon(BlockApparatusMetal block) { + return block.iconTankBottom; + } + + @Override + public IIcon getSideIcon(BlockApparatusMetal block) { + return block.iconTankSide; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileConduitTank.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileConduitTank.java index efdad28..19e7489 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileConduitTank.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileConduitTank.java @@ -3,6 +3,7 @@ package net.anvilcraft.thaummach.tiles; import dev.tilera.auracore.api.HelperLocation; import dev.tilera.auracore.api.machine.IConnection; import net.anvilcraft.thaummach.AuraUtils; +import net.anvilcraft.thaummach.blocks.BlockApparatusFragile; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; @@ -41,12 +42,14 @@ public class TileConduitTank extends TileEntity implements IConnection { this.wait = 10; this.calculateSuction(); int breakchance = 999; - if (this.getBlockMetadata() != 3) { + if (this.getBlockMetadata() + != BlockApparatusFragile.MetaVals.CONDUIT_TANK.ordinal()) { breakchance = 3333; } if (this.taintedVis > this.getMaxVis() * 0.9F) { - if (this.getBlockMetadata() == 3 + if (this.getBlockMetadata() + == BlockApparatusFragile.MetaVals.CONDUIT_TANK.ordinal() && super.worldObj.rand.nextInt(breakchance) == 123) { AuraUtils.taintExplosion( super.worldObj, super.xCoord, super.yCoord, super.zCoord @@ -269,7 +272,10 @@ public class TileConduitTank extends TileEntity implements IConnection { } public float getMaxVis() { - return this.getBlockMetadata() != 3 ? 1000.0F : 500.0F; + return this.getBlockMetadata() + != BlockApparatusFragile.MetaVals.CONDUIT_TANK.ordinal() + ? 1000.0F + : 500.0F; } public float[] subtractVis(float amount) { diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileSoulBrazier.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileSoulBrazier.java index 83c9be4..36ffe45 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileSoulBrazier.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileSoulBrazier.java @@ -10,6 +10,9 @@ import net.minecraft.init.Blocks; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.EnumSkyBlock; @@ -37,6 +40,9 @@ public class TileSoulBrazier extends TileEntity implements ISidedInventory { @Override public void updateEntity() { + if (this.worldObj.isRemote) + return; + if (this.lightingDelay <= 0 && this.isWorking() != this.previousLight) { super.worldObj.markBlockForUpdate(super.xCoord, super.yCoord, super.zCoord); super.worldObj.updateLightByType( @@ -283,4 +289,30 @@ public class TileSoulBrazier extends TileEntity implements ISidedInventory { public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { return true; } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setInteger("delay", this.delay); + nbt.setInteger("burnTime", this.burnTime); + nbt.setBoolean("previousLight", this.previousLight); + nbt.setInteger("lightingDelay", this.lightingDelay); + + return new S35PacketUpdateTileEntity( + this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt + ); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + this.delay = nbt.getInteger("delay"); + this.burnTime = nbt.getInteger("burnTime"); + this.previousLight = nbt.getBoolean("previousLight"); + this.lightingDelay = nbt.getInteger("lightingDelay"); + + // schedule light update + this.worldObj.func_147451_t(this.xCoord, this.yCoord, this.zCoord); + } } diff --git a/src/main/resources/assets/thaummach/lang/en_US.lang b/src/main/resources/assets/thaummach/lang/en_US.lang index 1aeeeaf..9eafe51 100644 --- a/src/main/resources/assets/thaummach/lang/en_US.lang +++ b/src/main/resources/assets/thaummach/lang/en_US.lang @@ -25,6 +25,12 @@ tile.thaummach:apparatus_metal_void_interface.name=Void Interface tile.thaummach:apparatus_metal_tank.name=Thaumium Reinforced Tank tile.thaummach:apparatus_metal_soul_brazier.name=Soul Brazier +tile.thaummach:apparatus_wood_condenser.name=Vis Condenser +tile.thaummach:apparatus_wood_duplicator.name=Thaumic Duplicator +tile.thaummach:apparatus_wood_repairer.name=Thaumic Restorer +tile.thaummach:apparatus_wood_dawn_totem.name=Dawn Totem +tile.thaummach:apparatus_wood_dusk_totem.name=Dusk Totem + # ---- ITEMS ---- item.thaummach:focus_0.name=Arcane Focus diff --git a/src/main/resources/assets/thaummach/textures/blocks/condenser_part_1.png b/src/main/resources/assets/thaummach/textures/blocks/condenser_part_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e05003f4959dff3918043118de1a298fb77b980d GIT binary patch literal 469 zcmV;`0V@89P)`&&-@T)7Cp24#O}k77Newj4?RYTKQeq^?eV*%8@j1 z%jWyOnT<34a=8Q?#}Q=wv(M)P-nOk(9vtiSdLpp4pH0QC)#LHNr`yzsQjrnhh`-rv z!Z4H=a2(}K^`Zf~-|x@o^K!X>yx(uabSsJiys9cUq?LyrjV`UQatvpqERJJx=ugzD z1E!2LO|RE09l*ESZ4^aPB30BFT_UOO;+m$(^Zax=(Uuu@yB#bp`rDu+Kn7#1Rx6w& zNuWmz^~?|ifiBu=qwIFO(Gex29*@WUeqWZQqDbcjbd5%%AW?(9UN5wA>*wudK{wD$I&mqV+QgNO)66nrXb5Qy$O@3gOL)c(s#h2NnO_> z)-@{U_i$|Jh6%{~XCzUn-vQAu+f)ro4O&Id3ag|d55&nP?JK|lq{Cj-9sl6<00000 LNkvXXu0mjfF2>X{ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/condenser_part_2.png b/src/main/resources/assets/thaummach/textures/blocks/condenser_part_2.png new file mode 100644 index 0000000000000000000000000000000000000000..540e622c6d8834792583eee55d15f16d27254bde GIT binary patch literal 421 zcmV;W0b2fvP)$+xHmgjj00Vl?&|9-zepAQHpA!*=|t0;=F8!`Ur zbOPMA4P^V->-7Sk=lPq*2~<^8UDxKNW-*@6XTWKim?M!ih*Fc_K!|_6UdytS3^0w6BEvAyUZH~*WzXlc?|VO>qbqZd zoXDVzX`QrJC5+XOVGYIi`yF2dODk7wCa4CE>jV@zQe8;&FHmXb5-JxmPyjASs%2>w zv5Z{^2t%YqsEp>MZOWbi9mjFZ|C#jobo`E-san!xyGy&8;b!!0{U^Wx%3(_>E}?kt0j8p0q-E9 z!OUPqAR?U37aBBzkzJcRtaI?*qq821x`HtslrpHa&Ol)`mY~S2waDe;Nf1h|6l{!B zr<$XH3Vqo@^LTxO$Pn&Ox8|2d5AO^S;Q~P8H%RkMu|o3)%mGk*q{D7AX%|wh8STPH afB^t26tAaCv81^G0000BzyP6UEX#7? z5!iYMZ{g{@g?I1*tXON+6h$dA`4HcWSOu22(9OIRFX`^Q?gSA+z<)}dm%#nqZ8-L? z;HAq$1?wkZ@=z*8k|ao^fO8HHk5A%@qn2t+ej6=V)VQ8V64rU>JcpFPXh=*>s|ncj<}O^zYEg3&i|-;*L^HU-!-PhgD2 zFbrth7ERMc|7=CjR56z=0S=78g2Jk*Dt=2cUzX);DMZY&Rv~iQ-oHnm9AsVB&|0JG zI+SE9RY}Bb3h;?1YYCX*IvwC`kLmb=DpioQH;e{*UHl?IqffKNz*i8cryKC|Vn#xY v*%aXP4|@0ckoLuo4~a2n{4e~aJ_Hy5EX|jKHp3eS00000NkvXXu0mjfhWxCT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_bottom.png b/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4b351b49b90035bf6ce783007445da0476026754 GIT binary patch literal 833 zcmV-H1HSx;P)**4?v@6D1rqmDpFL<lAel6p3PM`}48zQY*EZMY zv<3q{=X3ieCOMs^wy7P1a6K@uNRlecDpX0Dp=c&EJBOsHmH9adh_yFdR63RBv>Mm# zo}G>0@&2~m(IE(lY-9du>I9^c1VJzRy*dNm*8Ol~@I6UU%--n3Zl(dgdH_{hm&*zRcE`LjmRbdD*PW?2HNN+KHB-3-{OoD06mcqD48X~v+! zQhY^&3xJe=>dSRU+y2%@cxzp!%Op+?!qLP1QhVd{*vCXX+Hmt;JQ9Wwabl{fbUt{D z7!@g7OjvLvyrhM))t zA*aLOAv6%|V|=u?7W-7XCWmXJ6c_sfeNOc zQOSfxr)L<3W;u;UJNbDKtr<1pIDz_*jwly=UXmnnf<#wYmI;>CMJZkBXe}+Tp70D5Tg!~O zc~hf9XVdP6e!Kf$5(MdRwJ5TPJ{d|3sw$=`5GT<*wyJ6ofTdZ#D1gfPdOY-ZbuSd; z^~Qg@8>ak%L@cV$%GPKM;n2GAq8THgB!OfsW-?oX%YGEee*p#n;81Kue;m?k00000 LNkvXXu0mjfc?pE- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_1.png b/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e334ee8f016193776889a7f0708d657d34a7e87 GIT binary patch literal 798 zcmV+(1L6FMP)_U_LkProZ6Qcjc4}IucK~P`@<(FhZQ!$xJLmj1PYn#ndHgRX$ zIcMjxou0K`ULKz3dEejfx#Ee<2+LZvn!=ytTUxtPyIZW;;_mD%mGZJ6I9(mt^e%>B z?#}b6oj7Z?;_nqDvyF=G;SrSQvdiy=QiLG*x_m70umOpc5i%=>yx!lD<-s=w# zk|?pXO&za(@Vd!2TWD$c~2}fWn%r3}ZgY zBWUPL>fSk%)hRPrC$dJ14F|kiT>vRr_VF!9~p-lSkCtT&2zqx zZ=`f<@^K(^7vkUqDF~;?Y(GO8*#?G$+Tqd+MKgUKkCC;2Q&VLO(?Nl;;5be+x!RSA z2=>O8#d;GErE0Py6t^~FCbI)PMLxf_^pR!F&F!7FnuZw8QpxP!d-x>1zYXk?R0mH! zdYb;RNl_FOUF36@f}<8|3!+FE1)^y#mE21wld3Aa+PdKPYIMP7YvTFb&h};_)mSv* zXl~6NWd{a*^`aF;xe=Zs2psg@i(a*&1ji=2y3fI~jD_!m)5vmHNAED4$pCF^aL7^x zv9MYl;jji0QS)tE#Fn0kvK|hTgq;#+l6ZZd9xB*a|_AnxY_z29HoKE=A@Q zS<)LKkQI489140`FA)S` zcX%d7-*`KE(D$#?ilXQkrmfqjDFjJTnO~{pg*iuKlcm~99If@(G91uU6>3Vxxbxag z6L%b5B#DRJdfN8j$@Bee4r5so1M4q9bT=D0b5nEsK`xWe?E(Ub;y+gN`-cbl z^iDEK!6#WNDGDy@qiInn!ZA%NO9x3bjmktM-PwQ3+kTY-NyPsJLg#0vuqf|kGCNz_ zfIfT9tyTs_WQ7jKpekr!O#eb>qC0=0^UQEgp)elMje3V=#QUM!Xr6_Yg0 z>J28&qAGZ700Q+evI59^?vtd7&hLAGD59WC@5?!oiKTsG`bl&jr-u^RI@d z8(Z3^niqD@;Z9&G6)R&1-jRCwAnQd>_GQ4roeXWMPN-9mw4 z(<>J*wF*cCiv+0@F`9q|l<*=E-*_|r4Fkp(uR)C(KoTAlqb3+JAx0u0LBJR=2518k zuBEiQ?cUBh^)e5Wb7tn7d^6wBcW>UHY1-@cMx)W@j;^Ko84GXo6a|vWElCgxoc@*N z`Pr#SjzDs;blTEsx)KBHXetJDJ+s zNhP)|e2%8bHI1#fq>yg9*y$||I`(;3j+HX$LRWD{+$BVF`48=Eu2qB@w$`KNp@`E{ zI{xkj+8;PP{QM4r0i+B@7>LFeXF}nYlabbMQy+tswNhG0r;;qoz3jhNReugDDWBIr z@UWM)aIhRjk}O>A+|>B=#At551G0>PJ$|Zru&>wc_6b59@%DVgpth^s<8KCRIgVqY zGc0R95Uk|wc9X@X>jYsuGI+nOvl}4xOf34Xo3jYCsVtI80GYrs!TP>6~D2{CBY4+36+HXfi-A`%4zAySWuF-l?-OI2t~ zq1$$^?&YBG!@QZ_o8Qcv0}1^2fao!vXPD?hM)tay>8Zd>pvZAlQC0usXmM%zub$`p zJur9VJE1Dzo2}`ZrgnFLn>Uwh%H|ECfNai6s~gf}qL7B1G9$ zy|3JNg-mdyHmjsT(4a71bJ9neV3tP5t?eD#F zqOrwjqEJ*X@JYf*!VtRJTMG|5L4kpSGYT;tci#dHI$Ks%`{3U7h47qjw9og-8=3#@ z>1;b%TaThBP8i&s%gcvqiguvv2y|lEK+$4n>EILh?)?>eoi&4fo{G9gz%dM0RVja8 eu?|813NQe``IdvtyyAcW00005Xx0Dtv zNNlwQ6eyLV#KsuW5MNA;AHWAcoce4e7$Js)R*fb$BwT_*5us3e!Lq$~+nt@gcuMDC zW_C`_?|;sJ55KpwuBtxEF&h=_dT>0O*;T!Rp~y_DrBPiEjD_>38II#Zk!bc{OZEBq zt@KLaEKjLHh>S3%MpyNCcwRDTyVYvSL}ko$IY$y@!|2S!y-EaxE{o?Nn?K56k;D>*Ww&OR8Vm}$a=F-zBLf_LZ|vuxX@ zj4=e=V-WnujQrj=Uz0DML%9vQn;%;gc1`aG>t`Mmr_Z|k4~2Et3T zp~)gjEWNN@qpn?G#WM(1KtSv*aw8a;h|UiOLZ^RsZbf29l(I+LeHI}e%d#*W@L^dL z_Vl+THR%5CE<(Rd+RdHhfYE4FU7O$hp0sTij)Z$Ib@VpuGU1{NkI#<}gX0qe10%n; zzRuoz+G>_7mqn_#C!>jt)%T)Ia9{3cYQ5d6l~$JtA-U`c7!ZxmLAyVa>lh<&JTi5k ze*p#ncQ91S+n9RJ00000NkvXXu0mjfzF%SV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_6.png b/src/main/resources/assets/thaummach/textures/blocks/dawn_totem_side_6.png new file mode 100644 index 0000000000000000000000000000000000000000..4a5135f8400debd2f19ff84fab52fcd7c5ad55ca GIT binary patch literal 820 zcmV-41Izr0P) zc1yeMzSpm)bC_@DH5PVh zdpnWBVjIL%hGlVC%!Pu1x~BF^uHMhSDaLHUFwAH)A+2c|(kQ#Jwfk(nBNE;~E*=hr z>Ki)6&`cd3kSp698;+Y6NxDH622t?P}ln=n!iyv9heHDzN`rTOxi~SX4?; zG|wL;Vli2gI&XN2N>3dn_PF@($mW`XfD}z5JjbU&WNQ_bAq~_K7ssJKKRMca`vJsZ ziaTTqEHh)n-8VfbWVW7ABr%!%MZ{xK14Tnfq9jOCnyLXDM{Mc*+(s@D*D?L?4pc>< zXe$_g@mLat0<)FRq$t{i&LZTp1D;2cB))z5++?=qvKdv831~1fRB=fueDdt6rU*h# zkR`F>`mI!aU(@yVwXffo{e;ojcjrFMkX-DbqN=v3ty5711e(GdA@_hM%_SFRye5Xq zWYU9oAIA2#{k}<6miD7NJ%jfE0RH)RHk%E$Hk@&|x)EzlQ7WoxzO5{wh1%ziGO6k(vsE2;xaAMk&KWQ9*BHAO??qN{6~nv5UhZ+R@Fk=Auh68QY39qsOg zxp8Dc(lG6PWv@G*M{$@(AZ&7W1ituGSwyS%O^#IBYY1J{t842QX1$`oJ3HO!6lY;s yMG<9LJY7`-AgF6@ogEv-a9CbZiN4n#0R{kVk!4!`LAam*0000ZG8J)Pf8Y155}XEdnLUwY%~s4w|AdD@DZjrRa$T2_e}~hDI!r4WAc_2 zp88%B#nksACm3H<>EcJcyiWBVfJ~(Ra44LMP!Vy=c-ge!s^TMzUOanjj7d4&{@xcJ z9>_8m)+#kx~^-Qruy~;j7ikkTI6K!oKnOlppJbPcDvnbwF0^<%jtBQ zQVJ##mL6gIe_5i;w!=KK@Xpp*_VFbMO>X7!khDlW0ZrrUv~{WIHNtj zz=x8uaL9mo^}d@;Mrgfm1D%%d&AYv0U3%=1fizq?Yp_?O^?lQR{x~_p7+bZuPU~%& vP0s$ctweVxn8xz0x7e!q|7|_N{t7SvlVy3Ou)x$MP%H4l) z6d9M-6l;4NHt!W~V}zCRUNct~_2SOHEX(8ddau>9YUMj}ROZb&HHO#}Ra^Cb&W^lO zzvBD(s**{Wl~dJIMB3G!{T^xhun}77vUXeHD;krURWrL0EBkRq9OBvH6A~CP&G4|0 zn5ddC!1i3A@!b2aat^7=_ifinO9LM2N{>X+A|74230$Vi3+}_)5B~UZ5W;Rn4I#hn z45J9jQk9jP6XYaC$J#jMKwA)7jdJbMqFb_3>+=)&DC8r|00P+z(jJhT1FhQD!!c;Y zVoFL*;IJbE3l2S8@8oPoVi*z|?#J+LhGElhyQ&y&h`x@v=ZsX@`0at0kPn6(0~)An zoO9iQbU*CNE}}W|e>k?Bsnm5GtxYb(fuu3)bu(!;jO=?2HO9kU`8MPg-~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/duplicator_side.png b/src/main/resources/assets/thaummach/textures/blocks/duplicator_side.png new file mode 100644 index 0000000000000000000000000000000000000000..64b0837facbd1329da9bfcea4f6493e14e35c542 GIT binary patch literal 506 zcmVKoEVqJGNs;Kvc8{ z`W%7Fa0O1l1-JqS;1E=_6tu`hNeC!HNckuBeweY7C=LipXgbhab1{PVbz)Q~}FD#%G0$&BcClRp& z@!_F)zpx&jz3*bE%O9_A1v>8*(?x*yPJCcOIT~@yAXkE7qVnHtnWHJr68or*8z2Tuf5gIAXJ1>+zd@d!!c#an9ZEkzW&J>@0nQ4QetY;*La59+Hylk z@&}P5-Bcn^=c_VnwJWBpn+10w>v+odyRR*>}vGp&309H zSJ#+d?{2m)Uki5k6P~>6ak5;YHDGJ#k!ywgan`|F3u^#l3|_w|_=E9#2N`>Z86WmD zR#PG{q7t~#dGxWvI8F-gLO?1NC#wfI*^I^JMj#P`y~hwE!<)WnBx4J!Df7%=F^;IM!aHYiVdzk5&@7d)Q_2{p zisRKpGHE9wMyClx8%HrhF!*`AgqKV)kbrDsDk#kG^kHM!bIDr+6Koc0Q1Redr$WlN zNKLGr;6t4#Dr(?lhA4ZLYSyl&@{VOrso~$p zJHwb+SZSr|DfhL_!7@VWSLbcd;n8`6da99VB}rvc))?uxsM_V!INO)qIf9L?OPq{T zuyL+W#+;vr&Z-%N9|Z_Eo`h(aR)# z3+diLI>UIm7#}~&#mMZs$MG@&%X~&8z7S)HePwv^yN>xSzyOdaXVr}OBDnwn002ov JPDHLkV1k97JhT7+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_bottom.png b/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2159a0e94389644500516285e8c21ea9db2c3833 GIT binary patch literal 717 zcmV;;0y6!HP)<(R7EAQ&;oS8Gje|-P>d2%l@`Mlm5 zKKE;tx>d6Kk3ZX&-5}h~SECnaE!(PY{PpeN+q>=u!t?xD?HqfOCLG5RLO8BCg%k|7O${fd2DggDWd95l2CG`I3 zF5X3*%iiwTlY*i^*%1-g?q*2{57LHe0oyX{;kZAZ4JApQFGr45O|nE$G)SUEAZ62m zEUfOUnJ;;7qpu+BBS{JA<nHxq6GG+Uae=*E}SloMHh_@Y_`qnXg0)@K@0EGnMAN|QZMz|ar80@>Lm@qeMH;nFNYW-tKwh;;mU{DHh= zd8R6ws^}Plu9PSm!BImu+ZWw!;9a-hf)562XjaK6BMUF1?-Sl& z@TdkJqfC?aV_**%fZ%SqP03?neap1s-KjR9510b;|5lNHGn%R1$r>8gD6r>I% zyZoxkuU_HD_n!KbejLY$s4xtI@uXH;)peuY_EzfaM}wAQs&Zmh^iaDa6~$?_S(}_Q-trdH4;P3g5c=pi-=U{PbR=qMV->N(9N| z{F!Y`usS-{yw7v3`zFqG3#y>T9V;{dnY*OSbI->AX{*Ob7nVHOJ8i zW4u^fbu5=4go&nQB4c2>4x=cS7v@UymgTI})(V9=NZVLH&lsOhr+}n6)54I1{yD=i zt(@a|yFY(?fo$7yHa9OOX&gl}rKF~5APd2S499(h6lJttJJoD@VK^2di=wbU=x=%ujN zLl6orRO^=Q#z}&o+<)He?CXp(O~)EGd9Kwy0I{Jz?3HO)usb?8T1{_ZamC;UIc} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_2.png b/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f3580d9d7773cffe94a8b929da385fb58345d6 GIT binary patch literal 766 zcmVU$bGoEIrlr~eCK>0 ze)sx)@22az4yL$w-7QVdowu9inab(KVX;u^TwP?eY&K(@oHZmtQe=%qail5fX6q!3 zLQ07yrwApK(gfkOmPH8F>ibdHU;QiUdsh-pQz;iubYwRa++_FwDdmW50+=?QXOO>mBm-CTnOpshw#~9X#1tv6( z>OtVIuWS&EAKiZ{2;y>e&FZuP;5ZyuB}q(Yiu3kpVCd#i^AM&7b-KMa2zPbeg)Nj~5jvpT^YdUE*1Ej#FpeT7h$umfB5)8*;z$%^O_M=y*K+{+KbRzvBpG@h zbflm*6TmFQ%uK@Ha5Na$ec&TYGJt@tEGv+9o1W7n8cm`^!?sp)7q%%78BKO`(9ZT zHM4&3;7AYzCdy1=?N$eKgk+|PA_HzkRy%eV6H-yDgiwUgMso|YB}s;NQ9_3j9Ke7G zLqo{2 zJdU>jQRtLr2{;3gw$+v;WpC#`LhG)O>IDvn!(b4^;qt0cYk{G9vT8P98%3T^m*Y))_j33H zVETj8g?m#qEJaq}>Nqd(?FvxIi<;4x&PQ(OfIngE!haZtB`?j2MXBfqZWQ~l+5Z9z Y07cJ3Za$u>qW}N^07*qoM6N<$f!U9u(!E*a5mZO?ws#C zzw_ArEjFrWF`ZAZhgi*`MqSss`@Js2ij@UTAR zbN_B`wb?pX$mAN^rbKuu981nFw5~4JOIwE78=9u)`;>F0sT#)Ub~2w!t?Yh!!#N)+ z2Eq8KvX3!&y0ycFZ-lyrVVKrXA()t!F|w`SjY>Q|S8rB#wqM>#q~p=V>`daOca=#M z-|f8}jYl4HFc=_&i%a(k*)k@?8ubxIK6m#H-~aseRiy!hkn7u2p=-;VrQEtik~*G! zSo!8LA4pD44+v34_K-kdK?L9m_VN2JLh|7Fi;zN912ms0&BhXcE^9OKIRNPPJH6oz zV_Zrp1Xrn6$gIYq(~ahtF&r#q3KK5`Xc%sUF(00&0*ivcac$55RY;2j^$>hfD8;4R zhCt9wfB?2bdL)}J)LXT&Gg?|KHd-~?8G{BqxRCMaG+im)ubdq{TzfXO4P(&Fri-vW znCe4aPzx3Alo{vg`D~}(u2hfUl|o8B^I-hb^JCX@Ti5mN&F3ETgygywIym_Zqc<*V zP%4oCR6-S101v{9G0*oP7~36z1@sXd+yO)oLSTRZ)u57GTbGd9VBCipCIL)vsclfW7YdR=CRbMaaAfvf+Po2-eaCB2ix6N zDxO&~p4$C~hmLuAe%N>Wk%6cl9H2d$AdGy}YPUH~#BW}`6M48Cb^3L)dRZ(m=4z_W z7^Bq21c!p*{PMG_;zjAUC`kb>mB{owYBtTYi=!ZwYc{CTHdbHo0^e#kXpeTS_Fbiz z7)n}pSCKVRGb>P)%2y*&V$0YvLK#8`_ED$X@{ym>C%0F(bzeI!><1*#^C&h_3m_Ma z$^qG9t|&+#eco7a+xN$X1Do2G)xrM{K?sSW#HW*)=s>JgxsFAL_YQX+h2#0f=LD00 zq;OMGv3yy(FGs?IQ{!`t`OTI|F0RfTYV(4CF!mYB&E&uAe}IMpFP{9_H`3X@+e?j1 z)Em`azjtu*4NoSsx!E<3vF`^v2>D7tbEuVwC+lW~_9;hzyQ^yh=`n-H!r9*=B8nn- z_`3fICP+eHIr~IY^h`P{N%H*kiYSQbkxZjy{y5x~L~&wln#^W$dqQ)sY}=|g zAvl)nxf~&h_!y~lZii!|fIJ$BLq-;7)-*-SW%ID3++1E&wdHKy^*mq@2@OI(2#2`Z z{atQ$9dg#O+Rb(YpaBqwM#pYhmi7DW7u1iJHW~8apTzWpEGxdxR^~P^MwizGU~qJ@ z2dvI7j(x;z$J)%lw45&UJ=(K)FbCVUX;)SB@uWdrsz~X<$WXmmRV39%2;u}Us0gY- dIiUO#U;r1SbM2$7wdVi;002ovPDHLkV1m7@eOUki literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_6.png b/src/main/resources/assets/thaummach/textures/blocks/dusk_totem_side_6.png new file mode 100644 index 0000000000000000000000000000000000000000..4401089ce71c30926607c1789fbe417b040912df GIT binary patch literal 726 zcmV;{0xA88P)y-(k9LxaFE| zaMLmjQ(s0?MU-tij5555NItl zXj-dyz3%f&3I$p0@oRLg>q*(=6Ncy3Zhbf3HWV%JW>~oBr~2oaRcww9j8Y!Gp`e`M0yL z7+z@DZXxU@_)}O8`O9cd3Dvo7Th{NJ3s7AR&Vu_P=A8ffPKW|zF6DS~3&9+_Vw2Qd zFI+D+nLrfvYNP4zhS7piZ8Qncjwltamx?Ob&AA3C(y_~na3(flG`YLI9|8pE*r$&P zCL$IvRO67rN2@ymPD)J!dDAS*U;{q#;xrUul}WNj0+eb*5v~!<;JQYcp<9mSG`x1x zYx{n?xJ5`ISzQf&(xL@34GS6YmfIQgAQcImWvsY*7uP>(lK{WClqhiB8jOJ@$u<$2 zxR{PCb0zmXeVh;DCE`0gII%4U#JXWr%MAtO;__Co`Cotm05h^h*H*D!)Bpeg07*qo IM6N<$fUf;fcTVwSM0kCyh$ja&Ek1s=l+Ve%!a#DR|(r0aJiz zpYu1$k^zAYvI;D5sDN=Dfy?zb9gj}P7}Ek6xt!QU0{b*fM+#z%)5QV;%2on4VIvGm zVJ2t6bpY^aohc1_`}FX7Cv>gpvb$dfzP-4SJ9%}#F3m=fu&@~X*YBH9%mCR6{1U$7JzDjpvysaxD|}d(VrDlg80xTngRq-8XBPQ z^WtlZc9%^eEK3L}EPc6Y0laK(L}~OEz3$R(7>2+&WAvpvHweNcW=WrBt10dE$CTjv^n~P&s$xpNi>bJn05GDby}kd03PSY)PN@b6o0i}0R{jv W#Tqj$N65_p00002VcYw7vDsm{DuV)ghg1{+sw2zCqud&%&=^mHYX=JsYxl(-PJ>?-H0kz6D-7z zjIq>)M)uA+^0p$}g~8v19esSh8V^TIAs@o5apFT@X_i4_iWE{O|1beC{2}0LwV<(| zQtd}M6V4FGl!V#3S<&hAoVVrx00aGzpGfe?jp=RiY|8BS*H0;O<`BWmQy1Hwl~PuU z)A~q)V~n{btl!yJGqAH(vgeqxZXi3<&jHrj%mC|`HTyV$XQs~hLtpwXdqG7bL9Gl{ zdz@L*aSw0@il|~%WddsDDrr<{$gJy=$thK~mWB@)02NNIj5~Zb2u5bzFE`)BH>F%v zVbFs%HuSSy4rrHbP-+`mnFFYi0iZW(2dd{wCGAoP)ULhKQZoafb_|3GL*`OOQGgp8 zxJ(58>w%7Ph*4%7LsKdNz&ZOi&2JuI1rb3L^^|tqx>tnDxV@MsT*etB+cR*}?P=d_ zx#U@9;8g{Dm&Z3Ujacib>RUmRXFR1a03~Y5QMP%ylw$v^gZzxV!b9EVDE|pC0C-mi U$`DU|OaK4?07*qoM6N<$f+b<*NdN!< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/restorer_bottom.png b/src/main/resources/assets/thaummach/textures/blocks/restorer_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..545f973b19a52e66c97d4a5c4207557a09b621af GIT binary patch literal 622 zcmV-!0+IcRP)D#kmmf|R8;t1t zz7S%+->=u}uIt9*vEw)we0l#Za5-T?q%d+`=KAX)ZlL_wN6ZF8L#@t?3 zwG`^GODV;y=t$EPWKGim-)uJ9?RGkyVq-w6s><`6q6x!+9=dp+t)u&V1{a9X0B`3` zG8&Eg{XQ%~1P~mT%+zX)yG>W3#ZU-m$91e$2z=3lP z#>3-}foqbxSt396*ebaJa@15QK`R zc~J`qgIFb+4u=E0VqEMBS?aEE#OWn`#4?JiQM=#TW^!*HOCf0Q96rolJpGA6PwXv_ zB76uewHd$rFvTtrD#S!@kB@nMjyE3s+9dA5HjIE83jYKc0J@lPeD$I*8UO$Q07*qo IM6N<$g5bg+WB>pF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/restorer_side.png b/src/main/resources/assets/thaummach/textures/blocks/restorer_side.png new file mode 100644 index 0000000000000000000000000000000000000000..300d79856a00b9e880addca82a85086518ea6bdf GIT binary patch literal 737 zcmV<70v`Q|P)e*Ro$IV=QV03 z!O;mgu4VKG#D#7}1O*o&xD@;t!KL8Jg&=-Ha6KTR2nvo0W5Ag(&!nH#)#bf4WJH+@ zl~g77aqhY2dJk`1wS_KWYGA3|!uH+)vZ6w1fOj7@J&@hFcG>pgkZv{V+QL^7zLf4; z>B`{a_ic3J2z#@f64jWcIg+fx!glr(81nO#hl&!US%G<8;>x7~gf<4PMt~=eBE+FW zQEHTB1x~y$T~$a6?M^e4c>1{I3NmVkpc#dD^@iY4OiAy`SgKT?Bq%6hrUa~&&gb=8 z4^1k{Eh`~B`tWctFHmX&L&1h%T5C@d7>cSnsi-kMN)S-*Vcg?~LFy zQ`gtm?C;$pH#TOT$>aWq!y#5zR}lmOeBX!G8W;K3i@}*5jYgo~jnVJK&Vj2i)P*tgJU&UkpX)TyYlTkIycc4BHb+Xj zzITTn6chN;LF7J9h@t|Df>}WP|AV{2?Soq;Du}}*!?PF1lIGsDw8+Z8tg~Z430Zv! zZR+!vrCTQ6NEP}4*4NI1mx?FB(q?r^3i|xxIKl922TV5e#Vs@H(V*iJ{}EsS{18@_ T1sBuB00000NkvXXu0mjf#yL#K literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/blocks/restorer_side_pipes.png b/src/main/resources/assets/thaummach/textures/blocks/restorer_side_pipes.png new file mode 100644 index 0000000000000000000000000000000000000000..08b81b641f029a4a34632fae72294409e8d9dca5 GIT binary patch literal 684 zcmV;d0#p5oP)zwb1dcFbzKKR0C;Qd+1VLfS}Yb|nD0FX+yD6K z`i8IoK-;!imcbl|0XDm9n1BI5*p1^DBM#7Vi_WjkOY5%uZN7uSU^<=7=X0eL2ytkA z{!0p}6$OODDJjX)n2cd?9~Kow0ct40WlXfzy*Lt*!`UPZ@bDCe)N_%h7CFP#)#+hg zHmj$06ZiiHyA1<-|i>FEJT4owOHpx z)tI-hJ0Y10B&b70kPd%gB}tAaL;U?4fpP+ue6oB0_vPltfn!{RC`ci+^G5Q50P>a~Ou(1X`&m z)x@TWO60*r3}4`9__w|oADe(YShO|*11${KxqH^BgE+N2nas}Fx3$;aTl@IoZQ=z! zq8O-E${63wLHYLU78jQjjrzNn&E(mMt={7}K~5OR8HW0cAdK+2e~oe>56fK0M6q&Q zZGEId{n~Mr9?AqeFTmCh@cva(CWs;w%pAY_ zAA3#OCzlrrwN3<9K8MX_gW+(9!C(MG!qatqk3iG3dv;3}Wy{h}gOFdjT;2z=N+gk` zLj9gywo1N4>Xal2TCJ9XKcCOBTrT$s*6TGa%lgNjinyA%ilpP?Ji;(kP#N6mbkOZ~ z6W4Vy9*^NTj%p<>cH?f~2O-3luh)04KO7uNyWLJa&r{Wzpx5hZ_>bs#K-f2fiHht$ zB-)!7Ckb14de%}9IWD$Quh%gejg-@NyG6BHMWs?v$%GJ?T@B>!n9$Fj)No`MLAdOl zOg9=0Os7-y`+bd{ZQCk{e6R=!wTmXWo%C6^5K`cFu=R)U$T3 zH19&(E?3yez0PO$fTKz!mP?b}6W)V5CPU}3c!-?uh~-KLv%6`zo4?1jSS+xb{#0D~ zGhG$rG4UcrK4+r)`Z;)1ybG?jsycCT$PXDmeN+KkCTbQYg5LrR0A8~;l`%iP1^@s6 M07*qoM6N<$g8c|1`2YX_ literal 0 HcmV?d00001